15 — ASC 606 engineering specification
Status: engineering reference (not legal advice)
Source PDF: revenue-from-contracts-with-customers-updated-220124.pdf (FASB ASC 606 codification excerpt you hold locally)
Maps to: 14-domain-model.md · 11-rules-reference.md · 07-asc606-worked-examples.md
Purpose: Give engineers a product-usable ASC 606 spec — required behaviors, decision tables, and codification pointers — without reading the full FASB prose. When unsure, open the PDF at the cited paragraph.
0. How to use this doc
| If you are… | Do this |
|---|---|
| Implementing apply | Implement §2–§6 hooks; store policy ids |
| Writing tests | Assert §8 identities + scenario tables |
| Arguing with finance | Point at ASC refs; don’t invent spreadsheet folklore |
| Extending scope | Add policy; don’t bypass five steps |
IFRS 15: Same five-step core; cite IFRS separately if dual-reporting books are enabled later.
1. Five-step pipeline (mandatory)
| Step | ASC pointer | Domain hook |
|---|---|---|
| 1 Identify the contract | 606-10-25-1 | open_contract gates |
| 2 Identify POs | 606-10-25-14 … 25-22 | PO creation |
| 3 Determine TP | 606-10-32-2 … 32-11 | TP + VC |
| 4 Allocate TP to POs | 606-10-32-28 … 32-32 | Allocation slices |
| 5 Recognize revenue | 606-10-25-23 … 25-30 | Schedule + recognize |
No ETL shortcut may skip or reorder these for “convenience.”
2. Step 1 — Contract
606-10-25-1 criteria (all required):
- Parties approved the contract and are committed
- Rights to goods/services identifiable
- Payment terms identifiable
- Commercial substance
- Collectibility of consideration probable
Engineering:
| Check | Behavior |
|---|---|
| Missing approval / cancelled before start | Do not open_contract; quarantine |
| Collectibility fails | Do not recognize; policy may delay activation |
| Combination of contracts | Optional later policy (606-10-25-9); default treat CB subscription as unit |
Contract modifications: §5 below (606-10-25-10…13).
3. Step 2 — Performance obligations
3.1 Distinct goods/services
606-10-25-19: Distinct if:
- Customer can benefit from good/service on its own or with resources readily available, and
- Promise is separately identifiable from other promises (606-10-25-21 factors: integration, modification, interdependence).
606-10-25-22: If not distinct, combine until the bundle is distinct.
3.2 Series pragmatic expedient (SaaS)
606-10-25-14: A series of distinct goods/services substantially the same with same transfer pattern may be accounted as one PO.
Engineering default for subscription SaaS: one ratable PO per subscription item/plan charge series — not one PO per invoice month.
3.3 Product mapping
| Catalog signal | Typical method |
|---|---|
| Recurring SaaS license/access | ratable (over time) |
| One-time setup (if distinct) | point_in_time or ratable per policy |
| PS hours / milestones | proportional + record_delivery |
| Usage | VC + recognize as usage constraint allows |
4. Step 3 — Transaction price
606-10-32-2: TP = amount entity expects to be entitled to in exchange for transferring promised goods/services (exclude amounts collected for third parties, e.g. many sales taxes).
4.1 Variable consideration
606-10-32-8: Estimate using expected value or most likely amount.
606-10-32-11 constraint: Include VC only to the extent it is probable that a significant reversal will not occur when uncertainty resolves.
Engineering:
- Usage, rebates, tiered discounts →
vc.*policies. - Credits/CNs after open → often Step 3 update + reallocation / mod policy — don’t silently eat deferred without event.
4.2 Significant financing
If material (606-10-32-15…), adjust TP — enterprise-deep; flag and quarantine if detected without policy.
4.3 Noncash / consideration payable to customer
Support as TP adjustments when source events exist; otherwise Out until demanded.
5. Step 4 — Allocate TP
606-10-32-28: Allocate to depict amount expected for satisfying each PO.
606-10-32-31: Relative standalone selling price basis.
606-10-32-32: SSP = price at which entity would sell good/service separately.
Engineering:
| Stage | Behavior |
|---|---|
| Single PO | 100% allocation |
| Multi-PO | ssp.relative using SSP library |
| Residual approach | ssp.residual when SSP highly variable (enterprise-deep) |
| Discount allocation | Per 606-10-32-36… when discount doesn’t apply proportionally |
SSP library versioning must be auditable (smoke ssp themes).
6. Step 5 — Recognize revenue
6.1 Control transfer
606-10-25-23: Recognize when (or as) the entity satisfies a PO by transferring control.
6.2 Over time vs point in time
606-10-25-27 — over time if any:
(a) Customer simultaneously receives and consumes benefits as entity performs; or
(b) Entity’s performance creates/enhances an asset customer controls; or
(c) No alternative use + enforceable right to payment for performance completed.
Else 606-10-25-30: point in time; use control indicators (606-10-25-30).
Engineering methods:
| Method | When | Measure progress |
|---|---|---|
ratable |
Over-time series (SaaS access) | Time (daily lines → period) |
point_in_time |
PIT | Event date / delivery |
proportional |
Over-time input/output | Delivery evidence % |
6.3 Right-to-invoice practical expedient
606-10-55-18: If entitled to invoice amount corresponding directly to value to customer, may recognize that amount. Optional policy — not a license to invent POs from invoices.
7. Contract modifications (critical)
606-10-25-10: Mod = approved change in scope/price that changes enforceable rights/obligations.
Decision table
| Condition | ASC | Policy id | Engine effect |
|---|---|---|---|
| Added distinct goods and price reflects standalone price | 606-10-25-12 | mod.separate_contract |
New contract (or new PO set treated as separate) |
| Remaining goods/services distinct from those transferred | 606-10-25-13(a) | mod.prospective |
Allocate remaining TP to remaining POs; no catch-up on satisfied |
| Remaining goods/services not distinct | 606-10-25-13(b) | mod.cumulative |
Update + cumulative catch-up recognition |
Default for CB SaaS upgrades: mod.prospective (ADR 0005).
8. Contract asset, liability, receivable
| Concept | ASC | Meaning | Typical CB pattern |
|---|---|---|---|
| Contract liability | 606-10-45-2 | Paid / billed before performance | Deferred revenue |
| Contract asset | 606-10-45-3 | Performed before unconditional right to payment | Unbilled / recognize-before-bill |
| Receivable | 606-10-45-1 / 45-4 | Unconditional right to consideration | AR from invoice |
Engineering: Maintain these as first-class balances; AC journals them — RevRec calculates movements (ADR 0006).
9. Disclosures / RPO
606-10-50-13: Disclose aggregate TP allocated to unsatisfied (or partially unsatisfied) POs and when revenue is expected (quantitative bands or qualitative).
606-10-50-14: Practical expedients (≤1 year original duration; or right-to-invoice).
Engineering UC12: RPO report = sum of remaining allocated − satisfied by PO, bucketed by schedule.
Other disclosures (606-10-50) — enterprise reporting pack; don’t block engine.
10. Codification index (PDF map for engineers)
Open your local PDF and search these paragraph IDs:
| Topic | Paragraphs |
|---|---|
| Contract criteria | 606-10-25-1 … 25-8 |
| Combination | 606-10-25-9 |
| Modifications | 606-10-25-10 … 25-13 |
| Identifying POs / series / distinct | 606-10-25-14 … 25-22 |
| Satisfaction / over time / PIT | 606-10-25-23 … 25-37 |
| TP / VC / constraint | 606-10-32-2 … 32-14 |
| Financing / noncash / payable to customer | 606-10-32-15 … 32-27 |
| Allocation / SSP | 606-10-32-28 … 32-41 |
| Contract balances | 606-10-45-1 … 45-5 |
| Disclosures / RPO | 606-10-50-1 … 50-23 |
| Implementation guidance / examples | 606-10-55-… |
(Exact PDF pagination varies by publisher build; paragraph IDs are stable.)
11. Engine test obligations (minimum)
See the exhaustive catalog: 20-asc606-scenario-catalog.md and concrete cards 21-asc606-priority-scenario-cards.md.
Minimum families (also in catalog):
- Single-PO ratable open → recognize → deferred rollforward
- Bill before recognize → liability increases then releases
- Recognize before bill → contract asset then clears on invoice
- Prospective upgrade mid-term
- Cumulative catch-up case (synthetic) — A606-E-8 / NEW
- CN reduces unrecognized first; overflow reverses recognized
- Terminate voids remaining
- Multi-PO relative SSP (Complete maturity)
- VC constraint prevents over-recognition (Complete)
- Locked period + PPA path
- Collectibility / implicit concession
- Material right / upfront fee (when in scope)
- RPO disclosure
Smoke quarry supplies numeric expectations via accounting equality, not sheet shape.
12. Non-goals of this spec
- Reproducing the entire FASB PDF in-repo
- Tax law, statutory local GAAP overlays (books/policies later)
- Legal interpretation for auditors — finance owns sign-off; we own deterministic implementation of chosen policies