Skip to content

Deferred revenue

Some sales bring cash in today but the revenue belongs to a future period — an annual maintenance plan, a return-window guarantee, a six-month service warranty. Recording all of that as revenue at the till would inflate this month’s P&L and hollow out the next twelve. Deferred revenue is how Fexl Lite parks the cash on the balance sheet and recognises it month-by-month over the deferral period.

Updated 5 May 2026·For v2.2.0·5 min read

Turning it on

Deferred revenue is off by default at the tenant level. Two switches:

1

Enable the feature

Go to Settings → Sales and toggle Deferred revenue. Pick a default deferral period in days — 30 for a return window, 365 for an annual plan, anything in between.

2

Mark the product

Open the product in Products, scroll to the Deferred Revenue section, toggle Defer revenue. Optionally override the deferral period for this specific product (a 90-day extended warranty on a flagship phone, for example).

product editor · defer revenue toggle · period override field

What posts at the till

A 1,200 maintenance plan with a 365-day deferral, paid in full at the register:

  • DR 1010-xxx (cash sub-account) 1,200
  • CR 2040 (Deferred Revenue) 1,200

Notice 4010 Revenue is not touched at sale time. The cash is on the books, but as a liability — the store owes the customer twelve months of service. The invoice item carries deferRevenue=true and a deferralExpiresAt timestamp computed from paidAt + deferralPeriodDays.

If the sale mixes deferred and non-deferred lines (a phone + a maintenance plan), the JE splits revenue cleanly:

  • CR 4010 for the phone’s value (recognised today).
  • CR 2040 for the plan’s value (deferred).

VAT, COGS, and discount lines are not affected — VAT is recognised against the cash side as usual, COGS only fires for tangible items.

The recognition runner

A scheduled runner walks the deferred items every day and recognises any whose deferral has elapsed (in monthly slices for plans longer than 30 days, in one shot for shorter return-window deferrals). Each recognition writes:

  • DR 2040 (Deferred Revenue) — drains the liability
  • CR 4010 (Sales Revenue) — recognises the period’s slice

The schedule lives in prepaid_expense_schedules (same table that powers prepaid-expense amortisation, just keyed differently). The deferred / recognised revenue rows on the P&L summarise both sides — recognised this period vs still-owed.

How it shows up in reports

  • P&L — splits into Recognised revenue this period and Deferred (still on books). Only the recognised slice contributes to net profit.
  • Balance sheet2040 Deferred Revenue appears as a current liability. Drains down each period as the runner fires.
  • Trial balance2040 carries a credit balance until fully recognised; 4010 rises in step.
  • Invoice list — items with deferRevenue=true show a small Deferred chip with <days>d remaining underneath, derived from deferralExpiresAt - now.

Quick worked example

A 1,200 annual maintenance plan, sold 1 January, 365-day deferral:

DateDRCRNote
1 Jan1010 1,2002040 1,200Sale posts; nothing to 4010
31 Jan2040 1004010 100Runner recognises Jan slice (1/12)
28 Feb2040 1004010 100Feb slice
One slice per month
31 Dec2040 1004010 100Final slice; 2040 returns to 0

Sum of recognised revenue across the year: 1,200. Sum on the 4010 ledger: 1,200. Cash drawer effect on 1 Jan: +1,200 (correct). Net P&L impact in January: +100 (correct — only the January slice belongs to January).