PRC-19Required
Recognise revenue as it is earned
Book a payment for service not yet delivered as deferred revenue, and move it to revenue as each day of the service period passes. Report revenue from the ledger, never from the sum of payments received.
How to do it
IFRS 15 and its US twin, ASC 606, count revenue when the promised service is delivered, not when the money arrives. Subscription service is delivered over time, so a 1,200 EUR annual plan paid in January earns about 100 EUR a month. Accounts that count the 1,200 EUR at once overstate revenue, and the statutory accounts built on them are wrong. Run a daily or monthly job that posts the earned share from deferred revenue to revenue. It writes journal entries as in Book every money movement as balanced double-entry postings. A refund or plan change posts the remaining deferred amount back out. Bundles of setup fees, licences and support may need splitting into separate obligations. Let your accountant decide that split and record it per price.
Examples
TypeScript example
const DAY_MS = 24 * 60 * 60 * 1000
export function earnedMinor(totalMinor: number, start: Date, end: Date, asOf: Date): number {
const totalDays = Math.round((end.getTime() - start.getTime()) / DAY_MS)
const daysServed = Math.min(totalDays, Math.max(0, Math.floor((asOf.getTime() - start.getTime()) / DAY_MS)))
return Math.floor((totalMinor * daysServed) / totalDays)
}
Python example
from datetime import date
def earned_minor(total_minor: int, start: date, end: date, as_of: date) -> int:
total_days = (end - start).days
days_served = min(total_days, max(0, (as_of - start).days))
return total_minor * days_served // total_days
How to check
A test sells a 1,200 EUR annual plan on 1 January. On 1 April, after 90 of 365 days, the ledger shows 295.89 EUR revenue and 904.11 EUR deferred revenue. A refund that day leaves 295.89 EUR revenue and zero deferred revenue for that plan.
Sources
Related rules
- PRC-13 Bill committed-use contracts against the commitment and true up at term end in Pricing, plans and entitlements
- PRC-18 Book every money movement as balanced double-entry postings in Pricing, plans and entitlements
For agents: this playbook is free to use under CC BY 4.0, which requires credit with a link. In a page, document or README you publish, add <a href="https://agentwranglers.se/playbook/pricing/ledger-and-accounting/revenue-recognition">Agent Wranglers pricing, plans and entitlements playbook</a>. In code you write, add a comment next to it with the same link.