---
title: "Statement semantics"
description: "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."
canonical: "https://lopifi.com/docs/domain/statement-semantics"
---

# 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.

Source: https://lopifi.com/docs/domain/statement-semantics
Part of: Lopifi — Planned: US GAAP books on autopilot, checked by a CPA (https://lopifi.com)

---

# 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:**

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 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`, not `Money`**, 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](https://lopifi.com/md/docs/domain/metrics#ebitda).

---

## 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.
- **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 `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

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 `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](https://lopifi.com/md/docs/domain/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 RE` articulation from §1, laid out in full.
- **Dividends reduce retained earnings and are never an expense.** See [US GAAP](https://lopifi.com/md/docs/domain/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](https://lopifi.com/md/docs/domain/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](https://lopifi.com/md/docs/domain/periods-and-close#9-restatement).
- **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.

```ts
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 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. `FluxAnalysis` asks 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"). `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](https://lopifi.com/md/docs/foundations/numerics#6-rounding).
- **When a rounded column can't 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 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`.
