Mapping Discount Rates to Variable Lease Payments

How ASC 842 and IFRS 16 split variable lease payments into index-linked cash flows that carry the locked discount rate versus usage-based payments that stay off the liability — with KaTeX math and audit-ready Python.

Variable lease payments are the point where a compliant amortization engine most often goes wrong, because the classification of each variable component decides whether the locked discount rate touches it at all. This page answers one narrow question: given a lease with a mix of CPI-indexed escalations, SOFR-linked rent, and usage-based charges, which cash flows enter the present-value calculation at the commencement-date discount rate, and which stay off the liability entirely and hit the income statement as incurred? Get the split wrong in either direction and the initial lease liability is mis-measured, the right-of-use asset inherits the error, and every disclosure that rolls up from them is contaminated. This mapping sits inside the ASC 842 & IFRS 16 core architecture and depends on the incremental borrowing rate already being fixed at commencement.

Standard Anchor Link to this section

Two paragraphs govern the classification directly. ASC 842-20-30-5(b) and IFRS 16.27(b) both include in the initial measurement of the liability only "variable lease payments that depend on an index or a rate," initially measured using the index or rate as at the commencement date. Everything else — payments that vary with usage, sales, or performance — is explicitly excluded from the liability and recognized in profit or loss in the period the obligation is incurred (ASC 842-20-55-1; IFRS 16.38(b)).

Three consequences fall straight out of those two paragraphs and drive the whole computation:

  • Only index- or rate-linked payments are discounted. A CPI escalation or a SOFR-linked rent enters the cash-flow vector; a per-unit usage charge never does.
  • The commencement-date snapshot is frozen. The index/rate value on day one populates every future period. Forward projections of CPI or forward SOFR curves do not enter the initial measurement, even if the contract references them.
  • The discount rate is locked, not the cash flow. When the index later resets, the liability is remeasured using the original discount rate (ASC 842-20-35-5; IFRS 16.43) — the reset changes the payments, never the rate.

Formula Specification Link to this section

Let the initial liability be the present value of every fixed and index-linked payment discounted at the locked periodic rate. Usage-based components are absent from this sum by construction:

Where:

  • = the fixed payment in period (net of lease incentives receivable).
  • = the index-linked payment for period , measured with the index/rate value observed at commencement and held constant.
  • = the periodic discount rate, derived once from the annual rate and locked.
  • = the number of payment periods over the lease term boundary.

The periodic rate must come from a geometric de-annualization of the annual rate , not an arithmetic division, so that the liability amortizes to exactly zero at term end:

where is the number of compounding periods per year ( for monthly). Using understates and leaves a residual balance — the same trap that governs the effective interest method downstream. The per-period rollforward is then the standard effective-interest recursion:

Variable-payment classification gate feeding the discounted liability versus P&L An incoming lease payment stream enters a classification gate that separates it into three lanes: fixed payments, index or rate-linked payments frozen at the commencement-date value idx-0, and usage or sales-linked payments. The fixed and index lanes converge on the present-value summation, which is discounted at the locked periodic rate i and becomes the initial lease liability LL-0. The usage lane bypasses the discounting entirely and is expensed to profit or loss as incurred, so the discount rate never touches it. Payment stream index/ rate? Fixed F_t contractual, in-substance Index/rate V_t(idx₀) CPI, SOFR — frozen at day 1 yes Usage / sales per-mile, % turnover no Σ ÷ (1+i)ᵗ locked i Lease liability LL₀ P&L variable cost expensed as incurred rate never applied

Annotated Python Snippet Link to this section

The snippet below builds the discounted cash-flow vector for a lease that carries a fixed base plus a CPI-linked escalation, using decimal.Decimal so the rate carries no binary drift into the schedule. It deliberately keeps usage-based charges out of the vector, and asserts the liability closes to zero once the effective-interest rollforward consumes it.

from decimal import Decimal, getcontext

getcontext().prec = 28  # audit-grade precision for multi-year schedules

def periodic_rate(annual_rate: Decimal, periods_per_year: int) -> Decimal:
    """Geometric de-annualization: (1 + r) ** (1/m) - 1 — never r/m."""
    exponent = Decimal(1) / Decimal(periods_per_year)
    return (Decimal(1) + annual_rate) ** exponent - Decimal(1)

def initial_liability(fixed, index_linked, i: Decimal) -> Decimal:
    """PV of (fixed + index-linked) cash flows only. Usage payments are excluded
    from `index_linked` by classification, per ASC 842-20-30-5(b) / IFRS 16.27(b)."""
    total = Decimal(0)
    for t, (f, v) in enumerate(zip(fixed, index_linked), start=1):
        total += (f + v) / (Decimal(1) + i) ** t
    return total

# 3-year, monthly lease: fixed 1,000 base with a CPI escalation frozen at
# commencement (idx_0). A per-unit usage charge exists in the contract but is
# intentionally NOT passed in — it hits P&L as incurred, not the liability.
r_annual = Decimal("0.06")
i_m = periodic_rate(r_annual, 12)
n = 36
fixed = [Decimal("1000")] * n
index_linked = [Decimal("50")] * n          # V_t(idx_0), held flat at commencement

LL0 = initial_liability(fixed, index_linked, i_m)

# Effective-interest rollforward must close to zero on these same cash flows.
balance = LL0
for t in range(n):
    interest = balance * i_m
    principal = (fixed[t] + index_linked[t]) - interest
    balance -= principal

assert abs(balance) < Decimal("0.005"), f"liability did not close: {balance}"
print(f"LL0 = {LL0:.2f}  |  terminal balance = {balance:.6f}")
# LL0 = 34513.10  |  terminal balance = 0.000000

The assertion is the guardrail: if a usage-based charge is ever appended to index_linked, the liability inflates and the split is wrong; if the periodic rate silently reverts to r/12, the terminal balance stops closing to zero.

Which Variable Payments Carry the Rate Link to this section

Payment type Example In liability at commencement? Discount rate applied? Treatment on change
Fixed Flat monthly rent Yes Yes Only on modification
In-substance fixed "Variable" rent with a guaranteed floor Yes (the floor) Yes Only on modification
Index-linked (CPI) Annual rent × CPI ratio Yes, at Yes Remeasure at original rate on reset
Rate-linked (SOFR/Prime) Rent = base + SOFR spread Yes, at commencement rate Yes Remeasure at original rate on reset
Usage-based Rent per machine-hour or per mile No No Expense as incurred
Sales/performance-linked % of store turnover No No Expense as incurred

The ASC 842 and IFRS 16 behavior in this table is identical — both frameworks draw the line at "depends on an index or a rate." The only divergence is downstream in disclosure: IFRS 16.53(e) and ASC 842-20-50-4 both require a separate variable lease cost line, which captures exactly the usage- and sales-linked payments excluded above.

Gotcha: Non-Qualifying Variable Contamination Link to this section

The failure mode practitioners hit most often is a lease liability that comes in too high because a usage-based or sales-linked charge leaked into the index-linked vector — usually through loose data mapping in the ingestion layer. It passes a superficial review because the number looks plausible; it fails audit because the payment has no index or rate linkage and should never have been discounted.

Walk the debug checklist in order:

  1. Confirm every element of has a verifiable index/rate linkage (CPI, SOFR, Prime, base-rate curve). Reject anything keyed to volume, revenue, or performance.
  2. Confirm the index snapshot is frozen at commencement. must be built from , not a forward projection; a rising forward curve baked into initial measurement overstates the liability.
  3. Confirm resets remeasure at the original rate. An index reset that re-derives the discount rate is a defect — the reset changes cash flows only (ASC 842-20-35-5 / IFRS 16.43).
  4. Confirm the periodic rate is geometric, , so the liability closes to zero.

Before (usage charge contaminates the discounted vector):

index_linked = [base_cpi[t] + usage_charge[t] for t in range(n)]  # WRONG

After (usage routed to a separate P&L stream, never discounted):

index_linked = [base_cpi[t] for t in range(n)]        # only index/rate-linked
pnl_variable = [usage_charge[t] for t in range(n)]    # expensed as incurred

Frequently Asked Questions Link to this section

Are CPI-linked escalations discounted at commencement?

Yes, but only at the CPI value observed on the commencement date. ASC 842-20-30-5(b) and IFRS 16.27(b) include index-linked payments in the initial liability using the index "as at the commencement date." Future CPI movements are not projected into the initial measurement; they are captured later through remeasurement when the index actually resets, using the original discount rate.

Why are usage-based payments excluded from the discount-rate mapping?

Because they do not depend on an index or a rate. A per-unit or per-mile charge varies with the lessee's own activity, so both standards keep it off the liability and expense it in the period incurred (ASC 842-20-55-1 / IFRS 16.38(b)). It never enters the present-value sum and the discount rate never touches it.

Does an index reset change the discount rate?

No. When a CPI or rate index resets, the liability is remeasured using the original discount rate locked at commencement (ASC 842-20-35-5 / IFRS 16.43). Only a lease modification, a change in the lease term, or a reassessment of a reasonably-certain option can trigger a new discount rate.

Do ASC 842 and IFRS 16 classify variable payments the same way?

Yes for the split itself — both draw the line at "depends on an index or a rate," so the same payments enter the liability under either standard. The divergence is downstream: IFRS 16 runs every lease through a single model with a front-loaded expense, while ASC 842 operating leases straight-line the fixed portion. See the IFRS 16 vs ASC 842 ROU asset differences for how that plays out.