Here's how the linkages work, where they break, and how to build one in Google Sheets that holds together under pressure.
What "Three Statement" Actually Means
The three statements aren't just three tabs in a spreadsheet. They're one model expressed 3 ways:
- Income statement (P&L): Revenue minus expenses equals net income over a period
- Balance sheet: Assets = Liabilities + Equity at a point in time
- Cash flow statement: Reconciles net income to actual cash movement
The key mechanical link: net income from the P&L flows into retained earnings on the balance sheet, and into the operating section of the cash flow statement. Depreciation, a non-cash expense that reduces net income, gets added back on the cash flow statement. Changes in working capital (accounts receivable, inventory, accounts payable) show up as adjustments between the two.
According to the CFA Institute's Financial Reporting and Analysis curriculum, "the cash flow statement provides information that complements the income statement and balance sheet" — specifically, it explains why a profitable company can run out of cash. A company with $2M in net income but $3M in receivables growth consumes, not generates, cash.
The Linkages That Break Most Models
Most three statement models fall apart in the same 3 places.
1. The debt-cash circularity. Interest expense on the income statement depends on debt balances on the balance sheet. But debt balances depend on cash flows, which depend on net income, which includes interest expense. This circular reference causes Excel and Sheets to throw errors unless you enable iterative calculation (File → Settings → Calculation → Enable iterative calculation in Google Sheets).
2. Depreciation in two places. PP&E on the balance sheet decreases by depreciation each period. That same depreciation hits the income statement as an expense and gets added back on the cash flow statement. If you hardcode it in one place and formula-reference it in another, they'll drift the moment someone updates an assumption.
3. The retained earnings roll. Ending retained earnings = beginning retained earnings + net income − dividends. This roll lives on the balance sheet, but many analysts forget to wire the beginning balance to the prior period's ending balance. The model appears to balance in year 1 and breaks in every year after.
A model where assets ≠ liabilities + equity isn't a three statement model. It's a three tab model, which is a different and worse thing.
Building the Structure in Google Sheets
A clean three statement model uses at least 5 tabs:
| Tab | Purpose |
|---|---|
| Assumptions | All inputs in one place — growth rates, margins, capex % of revenue, tax rate |
| Income Statement | Revenue → EBITDA → EBIT → EBT → Net Income |
| Balance Sheet | Assets, liabilities, equity with prior-period roll |
| Cash Flow | Operating, investing, financing sections |
| Checks | Balance sheet check, cash flow tie-out, hardcoded cell audit |
The Checks tab is what separates models people trust from models people recreate from scratch.
The Income Statement
Build revenue first. If you're modeling a SaaS company:
B5: =Assumptions!B3 // Year 1 ARR
C5: =B5*(1+Assumptions!B4) // Year 2: prior year × (1 + growth rate)
Keep margins as assumptions. Don't hardcode =B5*0.72 — put 0.72 in the Assumptions tab and reference it. Three months from now, you'll thank yourself.
Depreciation should reference the depreciation schedule that feeds the balance sheet, not a separate assumption:
B18: ='Balance Sheet'!B_DepreciationSchedule
The Balance Sheet
The hardest part is the equity section. This is where most models fail:
// Retained Earnings
B_RetainedEarnings: =C_RetainedEarnings_PriorYear + 'Income Statement'!B_NetIncome - B_Dividends
Cash on the balance sheet should be the output of the cash flow statement, not an input:
B_Cash: ='Cash Flow'!B_EndingCash
That single formula is the core mechanical link. If you break it, your balance sheet will balance with the wrong cash number — which is the worst kind of wrong.
The Cash Flow Statement
Start with net income from the P&L. Add back non-cash items. Adjust for working capital changes:
// Operating Cash Flow
B_CFO:
+ 'Income Statement'!B_NetIncome
+ 'Income Statement'!B_Depreciation
- ('Balance Sheet'!B_AccountsReceivable - 'Balance Sheet'!PY_AccountsReceivable)
- ('Balance Sheet'!B_Inventory - 'Balance Sheet'!PY_Inventory)
+ ('Balance Sheet'!B_AccountsPayable - 'Balance Sheet'!PY_AccountsPayable)
Working capital changes are sign-sensitive in a way that trips people up. An increase in receivables is a use of cash (you earned revenue but haven't collected it). An increase in payables is a source of cash (you owe money but haven't paid it yet). Get these backwards and the model will be off by twice the working capital swing.
The Checks Tab
Add a dedicated checks tab with at least these 3 formulas:
// Balance Sheet Check (should equal 0)
=SUM('Balance Sheet'!TotalAssets) - SUM('Balance Sheet'!TotalLiabilitiesAndEquity)
// Cash Tie-Out (should equal 0)
='Balance Sheet'!EndingCash - 'Cash Flow'!EndingCash
// Hardcoded Cell Count (should equal 0 outside Assumptions tab)
=COUNTIF('Income Statement'!B5:Z100,">"&0)-COUNTFORMULA(...)
Color code these: green for 0, red for anything else. If you share a model where the balance sheet check is hidden and broken, someone will find it. They always find it.
Where the Model Gets Complicated: Debt Schedules
For LBO models or any company with meaningful debt, you need a separate debt schedule. It tracks:
- Beginning debt balance
- New borrowings
- Repayments (often tied to a cash sweep formula)
- Ending balance → feeds balance sheet
- Interest expense → feeds income statement
The revolver (revolving credit facility) adds complexity because it's often sized to plug any cash shortfall — meaning it's a function of the cash flow statement, which is a function of the income statement, which includes interest expense from the revolver. This is the circularity problem in its most common form.
As of April 2026, Google Sheets handles circular references through iterative calculation, which converges after a set number of iterations (default: 50). For most debt models, this resolves cleanly. Set the convergence threshold to 0.001 or lower.
Where AI Actually Helps
Building the skeleton of a three statement model is mechanical work — the kind of thing where you know exactly what needs to happen but don't want to spend 2 hours on tab structure and formula hygiene.
ModelMonkey can draft the initial structure from a description ("build a 5-year three statement model for a SaaS company with ARR, churn, and a revolving credit facility"), including the cross-tab formula references and the checks tab. What it can't do is validate whether your business assumptions make sense — that's still your job. But getting from blank spreadsheet to balanced model in under 10 minutes instead of 2 hours is the actual value proposition.
The model it produces still needs your assumptions. But the plumbing is wired.
Common Errors and What Causes Them
| Error | Root Cause |
|---|---|
| Balance sheet out by exactly net income | Retained earnings roll missing or double-counted |
| Cash flow ties but balance sheet doesn't | Hardcoded cash on balance sheet instead of referencing CF statement |
| Model breaks in year 2+ | Beginning balance hardcoded instead of referencing prior period ending |
| #REF! errors across tabs | Sheet renamed after formulas were written |
| Balance sheet "balances" but shouldn't | Plug cell hiding the real error |
The plug cell is the most dangerous. Some analysts add a balancing plug — a number that makes assets equal liabilities + equity — to hide the error. A reviewer who sees a perfectly balanced sheet with a single unexplained line item knows exactly what happened.