Three-Statement Model
When to use
Use whenever a projection needs to link the income statement, balance sheet, and cash flow statement together rather than treating them as three separate, disconnected spreadsheets — especially before presenting a model to a senior audience, where an unchecked balance sheet that doesn't actually balance is one of the fastest ways to lose credibility in the room.
What it does
Builds a driver-based P&L, rolls the balance sheet forward year by year, and derives the cash flow statement from the changes between periods via a bundled calculator, then runs two integrity checks every year: does total assets equal total liabilities plus equity, and does the balance sheet's cash balance match the cash flow statement's closing cash exactly. A model that fails either check is not yet a usable model, regardless of how reasonable the underlying assumptions look.
Method
- Set revenue and margin drivers explicitly: starting revenue, growth rate, gross margin, and opex as a percentage of revenue — the same driver-based discipline as driver-based-budget-builder, extended across multiple years.
- Set working capital drivers: DSO and DPO, which determine how accounts receivable and accounts payable roll forward each year and directly drive the operating cash flow.
- Set capex and depreciation assumptions, tied to revenue or a stated capital plan, which drive the investing cash flow and the balance sheet's PP&E roll-forward.
- Run the bundled calculator (
scripts/three_statement.py) to get the full year-by-year P&L, cash flow statement, and balance sheet, along with the two integrity checks for every year.
- Treat a failed balance check as a hard stop, not a rounding issue to note and move past. If assets don't equal liabilities plus equity, there's a real error in the model's linkage, and every number downstream of that year is unreliable until it's fixed.
- Treat a failed cash-tie check the same way — if the balance sheet's cash doesn't match the cash flow statement's ending cash, the two statements aren't actually linked, they're two separate calculations that happen to look similar.
- Extend the simplified structure deliberately when a real model needs more — this build keeps debt static and doesn't model interest expense, which is intentional for a clean base case; pair with debt-schedule-model when the capital structure and interest expense need to flow through the model explicitly.
Inputs
- Starting balance sheet (cash, AR, inventory, PP&E, AP, debt, equity)
- Revenue growth rate, gross margin, opex percentage
- DSO, DPO, capex as a percentage of revenue, depreciation rate
- Number of years to project
- Config saved as JSON matching the format documented at the top of
scripts/three_statement.py
Output format
Year-by-year P&L summary, cash flow statement (CFO, CFI, CFF, net change in cash), and balance sheet totals; explicit balance check and cash-tie check result for every year; final-year ending cash and equity.
Example
A three-year projection shows revenue growing from $6.9M to $9.1M, with the balance check and cash-tie check both passing at $0 variance every single year — confirming the model is genuinely integrated, not three separately-built statements that happen to look plausible next to each other. If a drivers change had introduced an inconsistency (say, capex not flowing correctly into the PP&E roll-forward), the balance check would have caught it immediately rather than letting a broken model reach a senior audience.
Common pitfalls
- Building three statements that were never actually checked to tie together, presenting a model that looks complete but doesn't hold up to scrutiny.
- Treating a small balance-check variance as immaterial rounding instead of tracing it to the actual linkage error.
- Modeling revenue and costs without modeling the working-capital and capex mechanics that actually drive the cash flow and balance sheet, producing a P&L-only model dressed up as three statements.
1---2name: three-statement-model3description: Builds an integrated P&L, balance sheet, and cash flow statement from driver assumptions via a bundled calculator that runs real integrity checks every year, does the balance sheet balance and does cash on the balance sheet tie to the cash flow statement's closing balance, instead of trusting a model that was never actually checked. Use whenever the user needs a financial model that links all three statements, is building a multi-year projection, or has a model where the balance sheet was never actually verified to balance.4---56# Three-Statement Model78## When to use9Use whenever a projection needs to link the income statement, balance sheet, and cash flow statement together rather than treating them as three separate, disconnected spreadsheets — especially before presenting a model to a senior audience, where an unchecked balance sheet that doesn't actually balance is one of the fastest ways to lose credibility in the room.1011## What it does12Builds a driver-based P&L, rolls the balance sheet forward year by year, and derives the cash flow statement from the changes between periods via a bundled calculator, then runs two integrity checks every year: does total assets equal total liabilities plus equity, and does the balance sheet's cash balance match the cash flow statement's closing cash exactly. A model that fails either check is not yet a usable model, regardless of how reasonable the underlying assumptions look.1314## Method151. **Set revenue and margin drivers explicitly**: starting revenue, growth rate, gross margin, and opex as a percentage of revenue — the same driver-based discipline as driver-based-budget-builder, extended across multiple years.162. **Set working capital drivers**: DSO and DPO, which determine how accounts receivable and accounts payable roll forward each year and directly drive the operating cash flow.173. **Set capex and depreciation assumptions**, tied to revenue or a stated capital plan, which drive the investing cash flow and the balance sheet's PP&E roll-forward.184. **Run the bundled calculator** (`scripts/three_statement.py`) to get the full year-by-year P&L, cash flow statement, and balance sheet, along with the two integrity checks for every year.195. **Treat a failed balance check as a hard stop**, not a rounding issue to note and move past. If assets don't equal liabilities plus equity, there's a real error in the model's linkage, and every number downstream of that year is unreliable until it's fixed.206. **Treat a failed cash-tie check the same way** — if the balance sheet's cash doesn't match the cash flow statement's ending cash, the two statements aren't actually linked, they're two separate calculations that happen to look similar.217. **Extend the simplified structure deliberately when a real model needs more** — this build keeps debt static and doesn't model interest expense, which is intentional for a clean base case; pair with debt-schedule-model when the capital structure and interest expense need to flow through the model explicitly.2223## Inputs24- Starting balance sheet (cash, AR, inventory, PP&E, AP, debt, equity)25- Revenue growth rate, gross margin, opex percentage26- DSO, DPO, capex as a percentage of revenue, depreciation rate27- Number of years to project28- Config saved as JSON matching the format documented at the top of `scripts/three_statement.py`2930## Output format31Year-by-year P&L summary, cash flow statement (CFO, CFI, CFF, net change in cash), and balance sheet totals; explicit balance check and cash-tie check result for every year; final-year ending cash and equity.3233## Example34A three-year projection shows revenue growing from $6.9M to $9.1M, with the balance check and cash-tie check both passing at $0 variance every single year — confirming the model is genuinely integrated, not three separately-built statements that happen to look plausible next to each other. If a drivers change had introduced an inconsistency (say, capex not flowing correctly into the PP&E roll-forward), the balance check would have caught it immediately rather than letting a broken model reach a senior audience.3536## Common pitfalls37- Building three statements that were never actually checked to tie together, presenting a model that looks complete but doesn't hold up to scrutiny.38- Treating a small balance-check variance as immaterial rounding instead of tracing it to the actual linkage error.39- Modeling revenue and costs without modeling the working-capital and capex mechanics that actually drive the cash flow and balance sheet, producing a P&L-only model dressed up as three statements.