Revenue Recognition (ASC 606 & IFRS 15)
Kantivo automates the bookkeeping you need to stay compliant with ASC 606 (US) and IFRS 15 (international): deferred revenue schedules, multi-obligation contracts, SSP allocation, modifications with audit trails, variable consideration, and every disclosure report your auditor will ask for.
What Is Rev Rec
Revenue recognition decides when revenue lands on your income statement. Under accrual, you recognize revenue as you earn it — not the day the customer pays. A 12-month subscription paid upfront isn't $12K of revenue on day one; it's $1K/month for 12 months, with the unearned balance sitting on the balance sheet as deferred revenue.
The governing standards are ASC 606 (US GAAP) and IFRS 15 (international). Both follow the same five-step model: identify the contract, identify performance obligations, set the transaction price, allocate it across obligations, recognize as each obligation is satisfied.
Kantivo handles the scheduling and posting so you don't run rev rec in spreadsheets or compute monthly entries by hand.
Setting Up Contracts
Create a contract to start automated recognition:
- Open Revenue Recognition in the sidebar
- Click New Contract
- Fill in the details:
- Contract name — descriptive (e.g., "Acme Corp Annual License 2026")
- Customer
- Total contract value
- Start date / end date — service or delivery window
- Recognition method — straight-line, milestone, or percent-complete
- Frequency — weekly, monthly, quarterly, annual
- Revenue account — income account to credit (e.g., 4000)
- Deferred revenue account — liability account to debit (e.g., 2400)
- Click Save Contract
Kantivo generates the full recognition schedule on save. Every future entry is visible before any of them post.
Recognition Methods
Straight-Line
Equal slices across the service period. Fits subscriptions, licenses, retainers — anything where value flows evenly over time.
Example: $12,000 annual SaaS license starting Jan 1 → 12 monthly entries of $1,000, each debit Deferred Revenue / credit Revenue.
Milestone
Revenue posts when specific deliverables complete. Define the milestones and their values at contract creation; mark each one complete as you deliver.
Example: $50,000 website build, three milestones — Design $15K, Development $25K, Launch $10K. Each marks complete; each posts its slice of revenue.
Percent-of-Completion
Revenue follows the percentage of work delivered. Update completion periodically and Kantivo posts the right increment.
Example: $200,000 construction contract. Month 1 at 20% complete → $40,000 recognized. Month 2 reaches 45% → another $50,000.
| Method | Fits | How it posts |
|---|---|---|
| Straight-line | Subscriptions, licenses, retainers | Equal amounts each period |
| Milestone | Project work, deliverables-based consulting | On milestone completion |
| % of completion | Construction, long-term contracts | Proportional to work delivered |
Posting Journal Entries
When recognition is due, Kantivo posts:
| Account | Debit | Credit |
|---|---|---|
| Deferred Revenue (liability) | $1,000 | |
| Revenue (income) | $1,000 |
That moves the dollar from the balance sheet to the income statement. Every entry carries:
- Journal reference — for audit traceability
- Contract name — link back to the source agreement
- Period date
- Posting timestamp
Posting History
Open any contract and click Posting History to see every entry that's been generated — date, amount, journal reference, status. Click through to the full journal entry for details.
Revenue Dashboard
The rev rec dashboard rolls up your full pipeline:
- Total contract value across all active contracts
- Recognized revenue to date
- Deferred balance — billed but not yet earned
- Recognition rate — percentage of total value recognized
- By method — split across straight-line, milestone, and percent-complete
An upcoming entries section shows what's scheduled to post next period — useful for forecasts and month-end prep.
Milestone Tracking
For milestone-based contracts, deliverables are managed inside the contract view.
Creating Milestones
- Open the contract
- Click Add Milestone
- Enter name, description, revenue amount
- Optionally set an expected completion date
- Save
The sum of milestones has to equal the contract value. Kantivo shows a live balance indicator so you can see when allocation is complete.
Marking Complete
- Open the contract
- Find the milestone
- Click Mark Complete
- Confirm the completion date
On completion, Kantivo immediately generates the corresponding journal entry.
Getting Started
- Add a Deferred Revenue account to your Chart of Accounts (liability, e.g., 2400). This is where unearned revenue sits until it's earned.
- Confirm your Revenue account exists (income, e.g., 4000)
- Create a first contract — start with a simple straight-line to see how the schedule generates
- Review the schedule before letting anything post
- Post your first entry manually or wait for auto-post
- Check the dashboard — deferred and recognized balances update live
- Run your Balance Sheet to confirm Deferred Revenue shows in the right place
Multi-Obligation Contracts
Vanilla contracts assume a single revenue stream — fine for a simple annual subscription. Real ASC 606 contracts often bundle several distinct deliverables (software, support, onboarding, training), and each one is its own performance obligation with its own recognition schedule.
Click 📑 Obligations on any contract to open the multi-obligation editor:
- Add as many obligations as the contract actually contains
- Pick a recognition pattern per obligation — point-in-time, ratable, milestone, percent-complete, or usage-based
- Override deferred and revenue accounts per obligation when products map to different income lines
- Reorder, edit, or remove obligations
Recognition entries post against each obligation individually. Journal entry descriptions name the obligation, the obligation's recognized total updates after each posting, and an obligation auto-marks complete when recognition reaches its allocated amount.
Standalone Selling Price (SSP)
ASC 606 needs to know what each obligation would sell for on its own — the standalone selling price — to allocate the bundled price across them. Kantivo stores SSP per item with full effective-dated history.
Open Products and click SSP on a product row. The SSP modal lets you:
- See the current SSP, its method, and effective date
- Set a new SSP — method (manual / observable median / observable average / residual), effective date, notes
- Use Recompute (median) or Recompute (avg) to derive SSP from invoice line history, with a sample-size guard so thin data can't produce misleading SSPs
- Browse the change history — every version, when it took effect, who set it, why
Items can also carry a default recognition method. New obligations created from an item inherit the method automatically — handy when most software products are ratable and most service products are milestone-based.
Transaction-Price Allocation
With obligations defined and SSPs in place, the allocation engine splits the contract's transaction price across them. Open the obligations modal, enter the transaction price, pick a method, click Allocate.
Methods
- Relative SSP (default) — each obligation gets
(its SSP ÷ total SSP) × transaction price. Penny rounding is absorbed by the largest obligation so the allocation total exactly equals the transaction price. - Residual — observable SSPs deducted from the transaction price, the remainder assigned to a designated residual obligation. Used when one obligation has no observable price. The engine refuses to run if observable SSPs already exceed the price.
- Manual — you allocate by hand. Kantivo records that you chose manual for audit purposes.
After allocation runs, the obligations table reloads and each obligation's recognition schedule regenerates against its newly allocated amount.
Modifications
Customers expand, downgrade, extend, cancel. ASC 606 prescribes three different treatments depending on the type of change and how much has already been recognized — picking the wrong one is a classic source of misstatement. Kantivo recommends the right treatment, requires explicit accountant approval, and snapshots the contract before and after every change.
From the obligations modal, click 📝 Modifications:
- New Modification → pick a type: add_obligation, reduce_obligation, extend_term, price_change, or cancel
- The form adapts to the chosen type
- Kantivo recommends one of three treatments based on the type + recognition progress:
- Separate contract — the change is its own new contract; original keeps recognizing unchanged
- Cumulative catch-up — modified terms applied retroactively, with a catch-up entry posted in the current period
- Prospective — change applies only to remaining performance
- Save as DRAFT
- An accountant Approves — mandatory before any change can be posted
- Click Apply — Kantivo mutates the contract and posts any catch-up adjustment
Every modification stores a JSON before_snapshot and after_snapshot, the system's recommendation, the human's chosen treatment, and the names + timestamps of the approver and applier. This is exactly the trail an auditor needs to retrace contract evolution.
Variable Consideration & Constraint
Refund estimates, rebates, performance bonuses, volume discounts — ASC 606 calls these variable consideration and requires you to estimate them and apply a constraint so only the portion you're confident in flows into recognized revenue.
Open 🎲 Variable Consid. in the obligations modal:
- Pick a type: refund estimate, rebate, performance bonus, volume discount
- Pick an estimation method: expected value (probability-weighted average) or most-likely amount
- Enter the estimated dollar amount
- Set a constraint % (0–100). Constrained amount = estimated × (1 − constraint%/100), live-computed as you type
- Optionally bind to a specific obligation
Skip the constraint % to use the company default at Settings → Revenue Recognition → Default Variable Consideration Constraint %. Per-obligation overrides for sophisticated cases; the company default for consistency.
Invoice ↔ Contract Linking
Cash and revenue rarely move on the same calendar. To compute contract assets (recognized exceeds billed) and contract liabilities (billed exceeds recognized), Kantivo lets you bind invoice lines to specific obligations.
From the obligations modal, click 🔗 Invoice Links:
- Pick from the customer's eligible (non-void) invoices
- Bind a portion of an invoice's value to a specific obligation
- Form pre-fills the unbound balance and won't let you over-bind
- The reconciliation card at the top of the modal shows: contract value, transaction price, billed total, recognized total, contract asset, and contract liability — all auto-computed
This reconciliation feeds directly into the contract-asset / contract-liability rollforward disclosure.
Audit Disclosures
Open 📑 Disclosures from the Revenue Recognition view for the four reports auditors expect in any ASC 606 / IFRS 15 footnote. Set period start/end, pick Monthly / Quarterly / Annual grouping, run.
1. Revenue Waterfall
Recognized + future scheduled revenue, bucketed by period with a running cumulative total. The "what's booked, what's coming" view.
2. Remaining Performance Obligations (RPO)
The unrecognized portion of every active obligation, groupable by recognition method, expected period, or contract.
3. Contract Asset / Contract Liability Rollforward
Beginning and ending CA / CL balances computed from billed-vs-recognized snapshots at each period boundary, with net change for the period.
4. Deferred Revenue Rollforward
Beginning balance (allocated − recognized at period start) + additions (new entries created in the period) − releases (entries recognized in the period) = ending balance. Reconciles to the Deferred Revenue line on your balance sheet.
Every disclosure has a Print button for clean PDF output and can be re-run on demand for any period.