Nordlet

← Blog

SaaS Revenue Recognition Under IFRS 15, With Worked Ledger Entries

Every step of IFRS 15 for a SaaS contract, shown as journal entries with real numbers, and the API calls that produce them automatically.

Nordlet Team · · 11 min read

Under IFRS 15, a SaaS subscription is a performance obligation satisfied over time, so its revenue is recognized evenly across the service period while the invoiced amount sits in a contract liability until it is earned. The receivable and the VAT are recorded in full on the day the invoice is issued. Only the revenue waits.

That is the whole rule. The rest of this article shows what it looks like in a ledger, with debits and credits for the cases a subscription business actually meets: an annual plan, a bundle with a discount, a project billed on milestones, an expected refund, and a contract that changes half way through. Every entry uses the Lithuanian chart of accounts that Nordlet ships by default, and the last section shows the API calls that post these entries without anyone typing them.

The five steps, applied to one contract

A customer signs up on 1 January 2026 for twelve months of platform access at €2,400 excluding VAT. Lithuanian VAT at 21 % adds €504, so the invoice is €2,904 gross.

Step Applied to this contract
1. Contract The accepted order for twelve months of access
2. Performance obligations One: access to the platform from 1 January to 31 December 2026
3. Transaction price €2,400 (no variable consideration in this first example)
4. Allocation Not needed; a single obligation takes the whole price
5. Recognition Over time, as the days of access pass

The same model is covered conceptually in SaaS accounting explained. Here we go straight to the entries.

Case 1: an annual plan

At issue, 1 January 2026. The receivable and the VAT are real on this date. The revenue is not.

Account Debit Credit
2410 Trade receivables 2,904.00
4492 Output VAT payable 504.00
4910 Deferred income (contract liability) 2,400.00

Nothing has touched a revenue account. The VAT, however, is due on the issue date in the ordinary way; the VAT return for January includes the €504 whether or not the service has been delivered.

When the customer pays.

Account Debit Credit
2710 Bank 2,904.00
2410 Trade receivables 2,904.00

At the end of each month. The textbook version releases €200 a month. A day-weighted schedule, a time-elapsed output method of the kind IFRS 15 §B15 permits for a service consumed continuously, gives each month its share of the 365 days:

Month Days Tranche
January 31 203.84
February 28 184.11
March 31 203.84
April 30 197.26
…
December 31 203.81
Total 365 2,400.00

The last tranche absorbs the cent rounding so that the schedule sums exactly to the deferred amount. The January release is:

Account Debit Credit
4910 Deferred income 203.84
5001 Service revenue 203.84

After twelve of these entries the balance on 4910 for this invoice is zero, and €2,400 has reached revenue across the year it was earned in.

Case 2: a bundle with a discount

The same customer buys the subscription together with an onboarding service. The invoice shows the subscription at €2,400 and onboarding at €600, a total of €3,000 net. Sold separately, the subscription is €3,000 and onboarding is €1,000, so the bundle carries a €1,000 discount.

IFRS 15 §76 to §80 require the discount to be spread across the obligations in proportion to their standalone selling prices, not left where the sales team happened to put it.

Line Stated price Standalone selling price Share Allocated
Subscription (over time) 2,400 3,000 75 % 2,250.00
Onboarding (point in time) 600 1,000 25 % 750.00
Total 3,000 4,000 3,000.00

VAT stays with the stated line prices, because the invoice is the VAT document: 21 % of €3,000 is €630. The allocation changes only how the net is split between revenue now and revenue later.

At issue.

Account Debit Credit
2410 Trade receivables 3,630.00
4492 Output VAT payable 630.00
5001 Service revenue (onboarding, delivered) 750.00
4910 Deferred income (subscription) 2,250.00

Onboarding earns €750 of revenue at issue, not the €600 printed on the line. The subscription defers €2,250, and its January tranche is 2,250 × 31 ÷ 365 = €191.10.

Without allocation, the entry would have shown €600 of revenue and €2,400 deferred. The difference is €150 of revenue reported in the wrong year.

Case 3: a project billed on milestones

An implementation project is invoiced at €10,000 net (€12,100 gross) with three milestones: design 30 %, build 50 %, go-live 20 %. Each milestone is a point at which a distinct part of the work is accepted, evidenced by a delivery act.

At issue.

Account Debit Credit
2410 Trade receivables 12,100.00
4492 Output VAT payable 2,100.00
4910 Deferred income 10,000.00

When the design act is signed.

Account Debit Credit
4910 Deferred income 3,000.00
5001 Service revenue 3,000.00

The expected date of a milestone is planning information. Revenue moves when the event happens, not when the calendar says it should have.

Case 4: an expected refund

Suppose history shows that 5 % of annual plans are refunded within the first month. IFRS 15 §55 to §58 treat expected refunds as variable consideration: they are excluded from the transaction price and carried as a refund liability until the uncertainty resolves.

Take a one-off product sale of €1,000 net (€1,210 gross) with a 5 % refund estimate, recognized at a point in time.

At issue.

Account Debit Credit
2410 Trade receivables 1,210.00
4492 Output VAT payable 210.00
4450 Refund liability 50.00
5001 Service revenue 950.00

A customer is refunded €40 net. The refund is documented by a credit note, which relieves the VAT and the receivable, and consumes the liability instead of reducing revenue.

Account Debit Credit
4450 Refund liability 40.00
4492 Output VAT payable 8.40
2410 Trade receivables 48.40

The refund window closes. Only €40 of the €50 estimate was used, so the remaining €10 is released to revenue.

Account Debit Credit
4450 Refund liability 10.00
5001 Service revenue 10.00

For a line that also carries a pending recognition schedule, the order of consumption is: deferred income first (the pending schedule is trimmed from its far end), then the refund liability, then revenue.

Case 5: the contract changes

Half way through the annual plan in Case 1, the customer negotiates a six-month extension at no extra charge. Six months have been recognized (€1,200 using equal monthly amounts for readability; the engine day-weights) and €1,200 remains deferred.

IFRS 15 §20 and §21 offer two treatments depending on whether the remaining services are distinct from those already delivered.

Prospective (§21(a)). The remaining goods or services are distinct, so the unrecognized €1,200 is spread over the new remaining term of twelve months: €100 a month. No catch-up entry is posted; the next release is simply smaller.

Cumulative catch-up (§21(b)). The obligation is treated as a single partially satisfied one, so revenue is recomputed as if eighteen months had applied from the start: €2,400 ÷ 18 = €133.33 a month, €800 earned by 30 June. Since €1,200 has already been recognized, €400 is reversed:

Account Debit Credit
5001 Service revenue 400.00
4910 Deferred income 400.00

The remaining €1,600 is then released at €133.33 a month over the new remaining term.

Platform access delivered day by day is usually a series of distinct services, so the prospective treatment is the common answer. Which one applies is an accounting judgement; the ledger has to be able to post either.

Price changes. A price decrease is a credit note against the original invoice and follows the consumption order above. A price increase is a new invoice with its own recognition schedule, which is prospective by construction.

The same entries through the API

Every entry above is produced by Nordlet's revenue recognition module from ordinary invoice data. The recognition method travels on the invoice line.

Case 1. Create the invoice with a ratable line, then issue it. Issuing posts the receivable, the VAT and the deferred income, and builds the twelve-tranche schedule.

POST /v1/sales/invoices/create
Authorization: Bearer <api key with sales:write>
Idempotency-Key: <your order id>

{
  "partnerId": "<customer id>",
  "lines": [
    {
      "description": "Platform subscription 2026",
      "unitPriceExclVat": "2400.0000",
      "vatRatePercent": "21.00",
      "recognition": { "method": "ratable", "startDate": "2026-01-01", "endDate": "2026-12-31" }
    }
  ]
}
POST /v1/sales/invoices/issue
{ "id": "<invoice id>" }

Case 2. Add standaloneSellingPrice to every line of the invoice. The allocation is computed at issue; the onboarding line uses the default point_in_time method.

Case 3. Give the line "recognition": { "method": "milestone", "milestones": [ { "percent": 30, "description": "Design", "expectedDate": "2026-02-28" }, … ] }. Issuing a delivery act through sales/acts/issue against the invoice recognizes the pending milestone tranches on the act date.

Case 4. Set refundEstimatePercent on the line. Credit notes consume the liability in the order described; sales/refund-liability/true-up with a revised estimatedTotal posts the release or the top-up. A payment-provider refund matched to the invoice is recorded on the liability and emits a refund_liability.actual webhook, but does not post against the liability itself, because relieving revenue and output VAT needs the credit note as the VAT document.

Case 5.

POST /v1/sales/recognition/modify
{ "invoiceLineId": "<line id>", "approach": "prospective", "newEndDate": "2027-06-30" }

Replace prospective with cumulative_catch_up for the second treatment; the €400 reversal posts immediately and the remainder respreads.

Releases. Recognition posts as one journal per run. It is triggered three ways without polling: locking a period recognizes everything due through the period end first, issuing a delivery act recognizes milestone tranches, and a timer armed to the next due date posts ratable tranches when they fall due. sales/recognition/compute previews what a run would post; sales/recognition/run posts it; sales/recognition/summary reports recognized-to-date, remaining and the next due date per line; sales/recognition-schedules/list shows every tranche with its status.

What the module does not do

The documented limits matter as much as the features when you plan a close:

  • Schedules are fixed in euro at the issue-date exchange rate. Deferred balances are not re-measured for currency movements after issue.
  • Allocation requires a standalone selling price on every line or on none. The residual approach of §79(c) is not implemented.
  • The refund liability is tracked net of VAT at invoice level. The matching asset for the right to recover returned goods (§B25) is not modelled.
  • Cumulative catch-up applies to ratable lines only; milestone re-planning is prospective.
  • Significant financing components (§60 to §65), non-cash consideration and consideration payable to a customer are out of scope.
  • The contract-asset account (2910) exists in the chart and as a posting key, but recognizing revenue ahead of invoicing is a manual journal today.

The software is capable of IFRS 15 and ASC 606 treatment. Choosing the method for each obligation, estimating standalone selling prices and refund rates, and judging whether remaining services are distinct remain decisions the reporting entity makes.

FAQ

When is revenue recognized for a SaaS subscription under IFRS 15?

Over the service period, because access to the software is a performance obligation satisfied over time. For a twelve-month plan invoiced in advance, each month earns its share of the price. The invoice date determines when the receivable and the VAT are recorded, not when the revenue is.

What is the journal entry for deferred revenue?

At issue: debit trade receivables for the gross amount, credit output VAT, and credit deferred income (contract liability) for the net. Each period: debit deferred income and credit revenue for the amount earned. The receivable is cleared when the customer pays.

Does VAT follow the revenue schedule?

No. VAT becomes due when the invoice is issued or the advance payment is received, under the ordinary rules of the VAT Directive and national law. The deferred-income schedule and the VAT liability move independently, which is why an advance invoice is a real VAT document and a proforma is not.

How is a bundle discount allocated under IFRS 15?

In proportion to the standalone selling prices of the obligations in the bundle (§81). A €1,000 discount on a €4,000 bundle whose parts are priced €3,000 and €1,000 separately reduces each part by 25 %. The VAT stays on the invoice lines as stated.

What is the difference between prospective and cumulative catch-up treatment?

Prospective treatment spreads the unrecognized remainder over the new terms from the modification date, with no adjustment to past revenue. Cumulative catch-up recomputes revenue as if the new terms had applied from the start and posts the difference immediately. Which one applies depends on whether the remaining services are distinct from those already delivered.

Further reading