Contracts, performance obligations, allocation and recognition run inside the general ledger — not in a spreadsheet beside it. When a contract changes, the schedule, the deferred balance and the journal entries change together.
Relative-SSP allocation sums to the transaction price to the last paisa, with the rounding remainder assigned deterministically. A contract whose parts do not sum to the whole is impossible.
Recognised ahead of billing creates an unbilled receivable; billed ahead of recognition creates deferred revenue. A billing clears the asset before creating the liability.
opening + billed − recognised = closing, checked against the GL balance every close. A difference is a blocker, not a footnote.
Recognition is idempotent per obligation and period. Running the month twice posts once, which is what makes an automated close safe after a correction.
A contract carries its customer, term, transaction price and its performance obligations, each with a standalone selling price, a service period and a recognition method.
The transaction price is allocated across obligations by relative SSP, so a contract-level discount spreads proportionally rather than landing arbitrarily on one line.
Ratable by day or by month, point-in-time on delivery, usage as metered consumption is reported, and milestone on marked delivery. Every schedule sums exactly to its allocation.
Upfront, monthly, quarterly or annual instalments generated from the term and summing exactly to the transaction price, with the remainder on the final instalment. Usage and milestone contracts bill when the event lands.
Amendments are versioned, never edited in place. The new version carries the revised price and obligations; the old one is marked superseded and stays readable for audit. Revenue already recognised is not disturbed.
Remaining performance obligation by future month — the backlog view a board asks for — and a deferred revenue roll-forward that reconciles to the general ledger for the period.
The demo runs on a seeded company with a live close waiting — two real blockers and agents holding proposals.