Skip to content

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:

  1. Net income → retained earnings. Opening RE + Net income − Dividends = Closing RE
  2. 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.
  3. 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, not Money, 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. BalanceSheet takes a Date, 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. framework prop drives it.
  • Retained earnings ties to the P&L. The component asserts Opening RE + Net income − Distributions = Closing RE and 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 framework drives 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, never 100% 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. FluxAnalysis prompts 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. StatementTable takes a scale prop 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 rounding footnote 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.

Built against this document

The surfaces that implement what this argues — running, computing, or shaped by it.

Told when this spec changes

The docs are the contract the components are built against. When one changes, the component changes with it — and the copy in your repo does not. One email when that happens.

One address, no list rental, unsubscribe in one click.

Works in your QuickBooks Online or Xero file

Get your books closed every month

Lopifi is building AI bookkeeping that keeps your books closed on US GAAP as transactions happen, with a CPA review every quarter, for $200 a month. We’re not open yet.

$200/month when we open. No card now.