Statement semantics
The P&L, balance sheet and cash flow statement are three views of one set of facts, and they tie to each other. This page covers how each one is structured and what the statement components enforce as a result.
1. The three statements, and how they connect#
A product that renders the three statements 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 one renders as a visible check. When one fails, that's the primary state of the screen, because a balance sheet that doesn't balance is unusable however small the difference.
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 shouldn't look like dollars. - Expense lines are
polarity="inverted". An increase in COGS isn’t good news. Every account classified as an expense gets this by default, read from the account type instead of 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 December 15, 2026, to disaggregate relevant expense captions in a footnote into purchases of inventory, employee compensation, depreciation, intangible amortization and other. The account-to-line mapping therefore has to 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. That's another dimension pivot over the same 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. - 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, never from today.
- The current-portion reclass is visible. Long-term debt maturing within twelve months moves to current liabilities. A user who sees current liabilities jump needs to know it's a reclass and not new borrowing, so the line gets its own name instead of disappearing into "Other current".
- Ordering follows the framework. US GAAP puts the most liquid first, IFRS commonly the least liquid. The
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#
Most products skip this statement. Lenders and boards read it closely.
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 ← removed: the proceeds are investing cash
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 signs run backwards from intuition. An increase in AR is a use of cash (you earned it but haven't collected it), 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. The component asserts the tie and displays it, and it's the most useful integrity check in the 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 follow the standard's classification. 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 changes in equity | Equity components across, movements down: opening → net income → OCI → dividends → issuances → buybacks → share-based compensation → closing | StatementOfChangesInEquity |
| 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.
Statement of changes in equity#
The fourth statement explains every movement in equity between two balance sheets. ASC 505 (Equity) is the Codification topic for the accounts it presents.
Common APIC Retained AOCI Treasury NCI
stock earnings stock
Balance as of 31 Aug 2026 ─────────── the prior balance sheet ───────────
Net income ✓ ✓ ← ties to the P&L
Other comprehensive income ✓ ✓
Dividends declared ✓ ✓
Shares issued ✓ ✓
Repurchase of shares ✓
Share-based compensation ✓
Balance as of 30 Sep 2026 ──────────── this balance sheet ───────────────
every row also sums across into Total equity
Rules:
- It foots both ways. Each column walks
opening + movements = closing, and each row sums across to the total column. The cross-foot proves the two directions agree: the closing balances summed across equal the total column walked down. A grid that foots one way only can still be wrong. - The closing row comes from the ledger, not from the rows above it. A closing row computed from the movements always foots, which proves nothing. The component takes the reported closing balances and shows the difference in the grid when the walk misses.
- It articulates. The net income row equals net income on the P&L (consolidated net income, when there's a non-controlling interest: the row's total, split between the parent's retained earnings and the interest). The opening row equals the prior balance sheet's equity lines, and the closing row equals this one's. The retained earnings column is the
Opening RE + Net income − Dividends = Closing REarticulation from §1, laid out in full. - Dividends reduce retained earnings and are never an expense. See US GAAP.
- Treasury stock is contra-equity, in its natural position and parenthesized, never presented as an asset.
- Other comprehensive income goes to AOCI, not to retained earnings. Translation differences (CTA) live here, per the FX rules in multi-entity and FX.
- Non-controlling interests are a separate column after a subtotal attributable to the parent.
6. Comparatives#
- Comparatives must match on five axes: basis, framework, entity set, presentation currency, and period type. Mixing is blocked at the type level.
- 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. See periods & close.
- Reclassified prior-period figures are disclosed. If this year's presentation moved a line, the comparative moved too, and the statement says so. Otherwise readers take a presentation change for a change in performance.
7. Variance and flux analysis#
At close, the reviewer's job is to 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 has no meaningful percentage. - Material variances require an explanation before the review section of the close can be gated as done. The unexplained ones are the reviewer's worklist.
- Explanations name a driver. "Revenue up 12%" restates the number. "Volume up 18%, price down 5%, mix neutral" explains it.
FluxAnalysisasks for a driver alongside the free text. - Both absolute and relative are shown. Either alone misleads, as with 200% on $12 or $40,000 on $8M.
- The 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 has to say so ("in thousands, except per-share amounts").
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 can't 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 September 30, 2026 ← resolved period, or "As of" for a BS
Accrual basis · IFRS · Presented in USD ← basis, framework, currency
In thousands, except per-share amounts ← scale, when scaled
Generated Oct 4, 2026 09:12 UTC · Period: closed ← provenance and period state
The block is a component (ReportHeader; StatementTable renders the same fields from its own header) instead of per-page markup, so nobody can forget it. Notes to the statements are numbered anchors (StatementNotes), and a line points at its note with NoteRef.