Schedules, accruals & roll-forwards
Every balance sheet account needs a schedule behind it, and the schedule has to tie to the GL. Most accounting products ship a ledger and statements and leave the schedules in spreadsheets. That handoff is where closes break.
1. The universal roll-forward#
Every schedule in accounting has the same shape. Encode it once.
Opening balance 84,220.00 ← must equal prior period closing
+ Additions 22,400.00
− Releases / amortization (18,900.00)
± Adjustments (500.00)
─────────────────────────────────────────────
Closing balance 87,220.00
═════════════════════════════════════════════
GL balance at Sep 30, 2026 87,220.00
Difference 0.00 ✓ Tied
RollForward is one component with a configurable column set. Prepaids, accruals, deferred revenue, fixed assets, intangibles, leases, equity, allowances, and inventory reserves are all this shape.
Non-negotiable rules:
- Opening must equal the prior period's closing. The component asserts it. A break here means someone edited history.
- The closing balance must tie to the GL. The component computes and displays the tie itself.
- The difference line is always visible, because it's the number the user is working to zero.
- A non-zero difference is the primary state of the screen, with the amount, an "Investigate" action, and a required explanation field.
- Every movement traces to journal entries. Clicking
Additions 22,400.00drills to the entries that make it up, and they sum to the line.
2. Prepaid expenses#
Cash paid now, expense recognized over time.
type PrepaidItem = {
vendor: string;
description: string;
invoiceRef: string;
totalAmount: Money;
serviceStart: Date;
serviceEnd: Date;
method: "straight-line" | "usage" | "manual";
monthlyAmortization: Money; // derived for straight-line
amortizedToDate: Money;
remaining: Money; // totalAmount − amortizedToDate
glAccount: string; // the expense account it releases to
};
UI rules:
- Partial first and last months are prorated by day, not treated as whole months. A policy starting Sep 18 amortizes 13/30 of a month in September. Straight-line-by-month is a simplification that leaves a stub at the end, so the component states which convention it's using.
remainingis the balance sheet number. The schedule total must equal the prepaid GL account.- Items fully amortized in the period are shown, then dropped. Rows that vanish without notice make the roll-forward impossible to follow.
- A prepaid with a service end date in the past and a non-zero balance is an exception, flagged prominently. It usually means an amortization entry was missed.
3. Accrued liabilities#
Expense incurred, invoice not received.
Auto-reversal is the whole component. Without it, the expense is double-counted when the invoice arrives and is coded to expense. Coding the invoice against the accrued liability also works, but only if someone remembers to.
Sep accrual: Dr Professional fees 12,000 / Cr Accrued liabilities 12,000
Oct 1 reversal: Dr Accrued liabilities 12,000 / Cr Professional fees 12,000
Oct invoice: Dr Professional fees 11,400 / Cr Accounts payable 11,400
Net Oct effect: professional fees (600) — a 600 credit, the true-up, automatically
UI rules:
AdjustingEntryFormdefaultsautoReverse: truefor accruals and displays the reversal date inline: "Reverses Oct 1, 2026".- The scheduled reversal is visible in the next period before it posts, so a reviewer sees it coming.
- Estimate vs. actual is tracked. The schedule shows what was accrued, what the actual turned out to be, and the true-up. That history is how estimates improve, and auditors ask for it.
- Accruals aging beyond two periods are flagged. A liability accrued three months running with no invoice is either a bad estimate or a missing vendor.
4. Deferred revenue (ASC 606 / IFRS 15)#
Cash received or billed, revenue not yet earned. It mirrors prepaids and carries more regulatory structure than any other schedule.
The five-step model, as it shows up in the UI:
- Identify the contract
- Identify the performance obligations — the unit of recognition
- Determine the transaction price
- Allocate the price to obligations — by standalone selling price
- Recognize revenue as each obligation is satisfied
type PerformanceObligation = {
contractId: string;
description: string; // "Platform subscription", "Implementation"
allocatedPrice: Money; // step 4 — uses largest-remainder allocation
standaloneSellingPrice: Money;
recognitionMethod: "ratable" | "point-in-time" | "input-measure" | "output-measure" | "usage"; // ASC 606 measures of progress
serviceStart?: Date;
serviceEnd?: Date;
recognizedToDate: Money;
deferredBalance: Money;
};
UI rules:
- Allocation across obligations uses largest-remainder so the allocated amounts sum exactly to the transaction price. Allocations that miss by a cent are a common bug.
- Contract asset vs. contract liability are different balance sheet lines. Consideration received (or unconditionally due) ahead of delivery is a contract liability (deferred revenue). Revenue recognized before the right to payment is unconditional is a contract asset; recognized with an unconditional right but not yet invoiced is an unbilled receivable. Within a contract the position is presented net, as one asset or one liability (required). Across contracts it's never netted, and the component prevents it.
- The revenue waterfall is a first-class view. It shows how much of the current deferred balance recognizes in each future period, the number every SaaS board asks for.
- Variable consideration and constraints are flagged, not modeled. The estimate is a judgment, so the UI makes sure it's documented and reviewed and leaves the number to the accountant.
5. Fixed assets & depreciation#
type FixedAsset = {
tag: string;
description: string;
category: string; // drives default life and method
cost: Money;
inServiceDate: Date; // NOT the purchase date — depreciation starts here
usefulLifeMonths: number;
salvageValue: Money;
method: "straight-line" | "declining-balance" | "sum-of-years" | "units-of-production";
convention: "full-month" | "mid-month" | "half-year" | "mid-quarter";
accumulatedDepreciation: Money;
netBookValue: Money; // cost − accumulated
disposal?: { date: Date; proceeds: Money; gainLoss: Money };
};
UI rules:
- In-service date, not purchase date. An asset bought in March and installed in June depreciates from June. People get this wrong often, so the form labels it.
- The convention is visible. Half-year, mid-month and mid-quarter conventions change the first and last period's expense, and a user reconciling to a tax schedule needs to know which is in force.
- Book and tax depreciation are separate schedules. They use different lives and methods, and the difference creates a deferred tax item. The component supports parallel books and shows the difference.
- Disposal computes gain/loss and shows the working:
Proceeds − NBV = Gain/(Loss). Removing an asset without recognizing gain or loss is a misstatement. - A worked straight-line example. Equipment costing $48,000 with a $3,000 salvage value and a 60-month life depreciates
(48,000 − 3,000) ÷ 60 = 750a month. Sold after 26 months for $25,000: accumulated depreciation is 19,500, NBV is 28,500, and the disposal posts Dr Cash 25,000 / Dr Accumulated depreciation 19,500 / Dr Loss on disposal 3,500 / Cr Equipment 48,000. - NBV must never go below salvage value. The component asserts it, and a schedule that would breach it is an error state.
- Fully depreciated assets still in service are shown, greyed. Their NBV equals salvage value (often zero) but they exist, and dropping them from the register loses the asset.
6. Intangibles and amortization#
Same shape as fixed assets, with these differences:
- Goodwill and indefinite-lived intangibles are not amortized. They're tested for impairment instead (US GAAP private companies may elect to amortize goodwill over up to ten years). The schedule shows them with no amortization row and an impairment test date.
- Impairment is a judgment event, recorded with its trigger, its measurement basis, and its approver. Goodwill impairment is the excess of a reporting unit's carrying amount over its fair value, capped at the goodwill (ASU 2017-04); a long-lived asset group is first tested for recoverability on undiscounted cash flows (ASC 360-10-35-17).
- Internal-use software is changing. ASU 2025-06 (ASC 350-40), effective for annual periods beginning after December 15, 2027, removes the preliminary / development / post-implementation stages: costs are capitalized once management has authorized and committed funding and it is probable the project will be completed and used as intended, with significant development uncertainty resolved first. A capitalization schedule should therefore record the date the threshold was met, not a stage.
7. Leases (ASC 842 / IFRS 16)#
Both frameworks put nearly all leases on the balance sheet: a right-of-use asset and a lease liability.
Lease liability = PV of lease payments not yet paid, at the discount rate
ROU asset = Lease liability + prepaid lease payments + initial direct costs − lease incentives received
UI rules:
- The discount rate is displayed and its source stated. It's the implicit rate if determinable, otherwise the incremental borrowing rate, and an entity that is not a public business entity may elect a risk-free rate by class of asset (ASU 2021-09). It drives every number in the schedule, and it's a judgment.
- Short-term leases may stay off the balance sheet. A lease of twelve months or less with no purchase option reasonably certain to be exercised can be expensed straight-line by policy election (ASC 842-20-25-2); the schedule records the election rather than an empty ROU line.
- Under ASC 842, operating vs. finance classification changes the P&L and the balance sheet presentation. Operating leases produce a single straight-line lease expense. Finance leases split into amortization and interest, presented as separate lines or disclosed. IFRS 16 has no lessee classification, so every lease is depreciation plus interest. The component renders both and labels which one it's showing.
- The ROU asset and the lease liability amortize on different curves and diverge over the lease term, so
ScheduleTablerenders them in parallel columns instead of one schedule. - Modifications and remeasurements are events, recorded with dates and reasons, that produce a new schedule from that point. The original is never edited.
- The maturity analysis (undiscounted payments by year, reconciled to the discounted liability) is a required disclosure and a first-class view.
8. Allowances and provisions#
Valuation allowances against assets (credit losses, inventory obsolescence) and estimated liabilities (warranty, refund liabilities for expected returns).
UI rules:
- The methodology is displayed alongside the number. "Allowance = 1% of current + 4% of 1-30 + 10% of 31-60 + 35% of 61-90 + 100% of 90+, adjusted for current conditions and forecasts", with the calculation shown and each input traceable to the aging.
- The true-up is visible. Opening allowance → provision expense → write-offs → recoveries → closing allowance. A roll-forward like everything else.
- A write-off is not a provision. Writing off a specific receivable reduces both AR and the allowance with no P&L impact; increasing the provision hits the P&L. Mixing them up is a classic error, so the UI names each action distinctly.
- CECL / expected-credit-loss models (ASC 326-20) are supported as an input to the methodology, not modeled by the component. Lifetime losses are booked from day one, so a current invoice carries an allowance too. ASU 2025-05, effective for annual periods beginning after December 15, 2025, lets any entity assume current conditions at the balance sheet date persist for current AR and contract assets, and lets entities that are not public business entities also consider collections received after the balance sheet date. The component records which election is in force and the collection cut-off date used. The judgment belongs to the accountant, and the UI records it and shows the working.
9. Recurring and schedule-generated entries#
Entries a schedule produces automatically each period: amortization, depreciation, revenue recognition, straight-line lease expense.
UI rules:
- They are
source: "system"and read-only. A wrong output means a wrong schedule, so the UI sends the user to the schedule instead of the entry. - They are previewable before posting.
SchedulePreviewshows the full set of entries the period will produce, with totals, before anything posts, so nothing the schedules generate surprises the close. - A schedule that fails to generate is a blocking close exception and shows up in the close checklist.
- Posting is a batch with one audit record, not N unrelated entries. Reversing a batch reverses all of it.
10. The schedule inventory#
Every balance sheet account maps to exactly one supporting schedule type. AccountTieOut is built on this mapping, and an account without one is a finding.
| Account | Schedule | Component |
|---|---|---|
| Cash | Bank reconciliation | ReconciliationView |
| Accounts receivable | AR aging + allowance roll-forward | AgingTable · RollForward |
| Inventory | Inventory roll-forward + reserve | RollForward |
| Prepaid expenses | Prepaid amortization schedule | ScheduleTable |
| Fixed assets | Fixed asset register + depreciation | ScheduleTable |
| Intangibles | Amortization schedule + impairment | ScheduleTable |
| ROU assets | Lease schedule | ScheduleTable |
| Accounts payable | AP aging | AgingTable |
| Accrued liabilities | Accrual schedule with true-ups | ScheduleTable |
| Deferred revenue | Recognition waterfall by obligation | RevenueWaterfall |
| Lease liabilities | Lease amortization + maturity analysis | ScheduleTable |
| Debt | Debt schedule + covenant compliance | ScheduleTable · CovenantMonitor |
| Equity | Statement of changes in equity | StatementOfChangesInEquity |
| Any other BS account | Account reconciliation | AccountTieOut |