Statement semantics
What each statement means, how it's structured, and what the components must therefore enforce.
1. The three statements, and how they connect
They are not three reports. They are three views of one set of facts, and they tie to each other. A product that renders them without proving the ties is rendering three unrelated tables.
P&L Balance Sheet Cash Flow
───── ───────────── ─────────
Net income ──────────────→ Retained earnings
└──────────────────────────────────────────────────→ (starting point,
indirect method)
Cash ←───────────────────── Ending cash
The three articulations Lopifi asserts and displays:
- Net income → retained earnings.
Opening RE + Net income − Dividends = Closing RE - Cash flow → balance sheet cash.
Opening cash + Net change in cash = Closing cash, and closing cash, cash equivalents and restricted cash equal the balance sheet lines that hold them. - The accounting equation.
Assets = Liabilities + Equity
Each is rendered as a visible check, not assumed. When one fails, that is the primary state of the screen — a balance sheet that doesn't balance is not a balance sheet with a small problem, it's not a balance sheet.
2. Profit & loss
Structure
Revenue ← gross
less: Returns, allowances, discounts ← contra-revenue
Net revenue ← subtotal, single rule
Cost of revenue / COGS
══ Gross profit ══ ← subtotal + margin %
Operating expenses
Sales & marketing
Research & development
General & administrative
══ Operating income ══ ← subtotal + margin %
Other income / (expense)
Interest income
Interest expense
FX gain / (loss)
══ Income before tax ══
Income tax expense
══ Net income ══ ← double rule
Rules the component enforces
- Margin rows are
Percent, notMoney, and visually distinguished. A percentage in a column of dollars must not look like dollars. - Expense lines are
polarity="inverted". An increase in COGS is not good news. This is the default for every account classified as an expense, and it's read from the account type, not chosen by the caller. - Contra-revenue is indented under revenue and parenthesized, netting to a "Net revenue" subtotal. Never shown as a separate expense.
- Gross profit requires a COGS classification. If the chart of accounts has no COGS, the component omits the gross profit subtotal rather than showing a gross margin equal to revenue, which is a lie by omission.
- Expense captions will need a breakdown. ASU 2024-03 (ASC 220-40) requires public business entities, for annual periods beginning after 15 December 2026, to disaggregate relevant expense captions in a footnote into purchases of inventory, employee compensation, depreciation, intangible amortization and other — so the account-to-line mapping must carry a natural classification as well as a functional one.
- Segments follow the CODM. ASU 2023-07 (ASC 280) requires public entities to disclose, by reportable segment, the significant expenses regularly provided to the chief operating decision maker — again a dimension pivot, not a separate ledger.
- EBITDA is not a P&L line. It's non-GAAP. If shown, it appears below net income in a clearly separated reconciliation block — see metrics.
3. Balance sheet
Structure
ASSETS
Current assets
Cash and cash equivalents
Accounts receivable, net ← net of allowance (contra)
Inventory
Prepaid expenses
══ Total current assets ══
Non-current assets
Property, plant & equipment, net ← net of accumulated depreciation
Right-of-use assets
Intangible assets, net
══ Total non-current assets ══
══ TOTAL ASSETS ══ ← double rule
LIABILITIES
Current liabilities
Accounts payable
Accrued liabilities
Deferred revenue, current
Current portion of long-term debt ← the reclass line, see below
══ Total current liabilities ══
Non-current liabilities
══ Total liabilities ══
EQUITY
Common stock and APIC
Retained earnings
Accumulated other comprehensive income ← CTA lives here
══ Total equity ══
══ TOTAL LIABILITIES AND EQUITY ══ ← double rule
Rules
- It is an "as of" a date, not a period.
BalanceSheettakes aDate, never a range. A balance sheet labeled "September 2026" is a category error the type system prevents. - The balance check is a first-class UI element.
Assets 4,281,900 = Liabilities 1,840,200 + Equity 2,441,700 ✓. When it fails, the difference is stated prominently — never a silently unbalanced statement. - Current/non-current split is the norm. IFRS requires it unless a liquidity-order presentation is more reliable (IAS 1, carried into IFRS 18 from 2027); US GAAP permits unclassified balance sheets in some industries. Classification comes from the account, and the boundary — twelve months, or the operating cycle if longer — is measured from the as-of date, not from today.
- The current-portion reclass is visible. Long-term debt maturing within twelve months moves to current liabilities. A user seeing a large jump in current liabilities needs to see that it's a reclass, not new borrowing — so the line is named explicitly, not merged into "Other current".
- Ordering follows the framework. US GAAP: most liquid first. IFRS: commonly least liquid first.
frameworkprop drives it. - Retained earnings ties to the P&L. The component asserts
Opening RE + Net income − Distributions = Closing REand surfaces the reconciliation on hover or drill-down.
4. Cash flow statement
The statement most products skip, and the one lenders and boards actually read.
Indirect method (the common one)
Net income ← from the P&L
Adjustments to reconcile to cash:
Depreciation and amortization ← non-cash, added back
Stock-based compensation ← non-cash
Provision for credit losses ← non-cash
(Gain) / loss on disposal ← non-cash, sign flipped
Changes in operating assets and liabilities:
(Increase) / decrease in AR ← note the sign convention
(Increase) / decrease in inventory
Increase / (decrease) in AP
Increase / (decrease) in deferred revenue
══ Net cash from operating activities ══
══ Net cash from investing activities ══ ← capex, acquisitions, disposals
══ Net cash from financing activities ══ ← debt principal, equity, dividends paid
══ Net change in cash ══
Cash at beginning of period
══ Cash at end of period ══ ← MUST equal the BS cash lines
Rules
- The working-capital sign convention is inverted and it confuses everyone. An increase in AR is a use of cash — money you earned but haven't collected — so it appears as a negative. The component labels these lines
(Increase) / decrease in …exactly as shown, because the parenthetical is what makes the sign readable. - Ending cash must equal the balance sheet. Cash, cash equivalents and restricted cash (ASC 230 after ASU 2016-18) tie to the lines that hold them, with a reconciliation when they sit on more than one line. Asserted and displayed. This is the single most useful integrity check in the whole statement family.
- Non-cash adjustments must trace to real accounts. D&A on the cash flow ties to the depreciation and amortization posted in the period.
- Interest and dividends are classified by the standard, not by intuition. Under US GAAP, interest paid, interest received and dividends received are operating (ASC 230-10-45-16, -45-17); dividends paid are financing (ASC 230-10-45-15). Only debt principal sits in financing. IAS 7 allows a policy choice — narrowed by IFRS 18 from 2027 — so
frameworkdrives classification, never a per-line toggle. - Direct method is supported but requires a reconciliation to the indirect result, because US GAAP requires that reconciliation for disclosure anyway (IFRS does not).
- Free cash flow is not a GAAP line. If shown, it's below the statement in a labeled non-GAAP block with its definition stated — see metrics.
5. Supporting statements
| Statement | What it shows | Component |
|---|---|---|
| Trial balance | Every account, debit and credit columns, proving they're equal | TrialBalance |
| Statement of equity | Opening equity → net income → issuances → distributions → OCI → closing | EquityRollForward |
| AR aging | Receivables by bucket, tying to the AR control account | AgingTable |
| AP aging | Payables by bucket, tying to the AP control account | AgingTable |
| Fixed asset register | Cost, accumulated depreciation, NBV, by asset | ScheduleTable |
Every supporting statement ties to a control account on the balance sheet, and the tie is displayed. An AR aging that totals to something other than the AR balance means either the aging or the ledger is wrong, and finding out at audit is expensive.
6. Comparatives
- Comparatives must match on five axes: basis, framework, entity set, presentation currency, and period type. Mixing is blocked at the type level, not warned about at render.
- Every column states its own resolved period. No column is ever labeled "Prior" or "Current".
- A restated comparative is labeled "Restated" in the column header with a footnote naming the reason. Always. See periods & close.
- Reclassified prior-period figures are disclosed. If this year's presentation moved a line, the comparative moved too, and that must be stated — otherwise the variance is an artifact of presentation, not performance.
7. Variance and flux analysis
The reviewer's actual job at close: explain what moved and why.
type Variance = {
current: Money;
comparative: Money;
absolute: Money;
relative: PercentChange; // discriminated — see numerics
material: boolean; // BOTH thresholds exceeded
explanation?: {
text: string;
author: string;
at: Date;
driver?: "volume" | "price" | "mix" | "timing" | "one-off" | "error";
};
};
Rules:
- A variance with no comparative base renders
n/a, never100%or∞. Growth from zero is genuinely unknowable. - Material variances require an explanation before the review section of the close can be gated as done. Unexplained material variances are the reviewer's worklist.
- The driver taxonomy matters. "Revenue up 12%" is not an explanation; "volume up 18%, price down 5%, mix neutral" is.
FluxAnalysisprompts for a driver, not just free text. - Both absolute and relative are shown. Either alone misleads: 200% on $12, or $40,000 on $8M.
- The materiality threshold in force is displayed, so a reviewer knows what is being hidden from them.
8. Presentation and rounding
- Statements are commonly presented in thousands or millions. When they are, the header says so — "in thousands, except per-share amounts" — and it is not optional.
StatementTabletakes ascaleprop and renders the disclosure automatically. - Rounded statements still foot. Round once at the display boundary and use largest-remainder allocation so subtotals equal the sum of their rounded parts. See numerics.
- When a rounded column genuinely cannot foot, disclose it. A
† Amounts may not sum due to roundingfootnote beats a total that's off by one with no explanation. - Per-share amounts are never scaled. In a statement presented in thousands, EPS stays in dollars and cents, which is why the disclosure says "except per-share amounts".
9. Statement header — required fields
Every statement, on screen, in export, and in print, carries all of these. A statement missing any of them is not usable as evidence.
Northwind Holdings Ltd. and subsidiaries ← entity / consolidation scope
Consolidated Statement of Profit or Loss ← statement name (framework-aware)
For the three months ended 30 September 2026 ← resolved period, or "As at" for a BS
Accrual basis · IFRS · Presented in USD ← basis, framework, currency
In thousands, except per-share amounts ← scale, when scaled
Generated 4 Oct 2026 09:12 UTC · Period: closed ← provenance and period state
This block is a component (StatementHeader), not per-page markup, precisely so it cannot be forgotten.