Most Anaplan estates model the P&L beautifully and stop there. Revenue is driver-based, headcount rolls into compensation, opex has owners — and then the treasurer still forecasts cash in a spreadsheet, because the model has no balance sheet. That gap is where the interesting questions live: how much cash do we have in month seven, do we breach the covenant, and how much of the funding gap is just receivables getting slower?
This tutorial builds an integrated three-statement model in Anaplan: profit and loss, balance sheet, and an indirect cash flow statement that is derived rather than typed. The key idea, and the one that makes this tractable in a multidimensional engine, is that the cash flow statement is not an input — it is the arithmetic of balance sheet movements plus a handful of P&L lines.
The architecture before the formulas
Follow DISCO (see the DISCO blueprint) and give each statement its own layer. A workable module map:
SYS00 Time Settings -- first period flag, FY flags, closing period
SYS01 Entity Properties -- functional currency, consolidation flags
SYS02 Account Properties -- statement, sign, cash-flow category
INP01 Revenue & Margin Drivers
INP02 Opex & Headcount Drivers
INP03 Working Capital Assumptions -- DSO, DPO, DIO
INP04 Capex & Depreciation Policy
INP05 Financing Assumptions -- drawdowns, repayments, rates, dividends
INP06 Opening Balance Sheet -- one-time, or fed from the GL
CAL10 P&L Build
CAL20 Fixed Assets Roll-Forward
CAL30 Working Capital
CAL40 Debt & Interest
CAL50 Balance Sheet Roll-Forward
CAL60 Cash Flow (Indirect)
OUT01 Statements Pack
OUT02 Covenant & Liquidity Checks
Dimensionality: keep the statements at Entity x Time x Version, and only add product or channel detail on the P&L drivers that genuinely need it. A balance sheet dimensioned by product is a cell-count disaster and a modelling fiction — nobody has receivables by SKU.
Time granularity. Build monthly, with the model's Time Range starting one period before your forecast so the opening balance sheet has somewhere to live. Do not model the balance sheet at week level unless treasury genuinely plans weekly; if they do, split the model — a weekly 13-week cash flow fed by the monthly plan, not a weekly everything.
Step 1: the account structure and sign convention
Use a single Accounts hierarchy with statement sections as parents (Revenue, COGS, Opex, ... Current Assets, Non-Current Assets, Current Liabilities, Equity), and a SYS02 Account Properties module carrying:
Statement(list-formatted: P&L / BS)Cash Flow Category(list-formatted: Operating / Investing / Financing / Non-Cash / Excluded)Natural Sign(Boolean:TRUE= stored positive)
Pick one sign convention and enforce it. The convention that causes the least pain: store everything in its natural reporting sign — revenue positive, costs positive, assets positive, liabilities and equity positive — and flip signs only in output views and in the cash flow derivation. Mixed conventions inside calculation modules are the single largest source of tie-out bugs in financial models.
Step 2: the P&L, ending at the lines cash flow needs
Your P&L build likely exists already. What matters for integration is that it exposes these as clean line items in CAL10 P&L Build:
Revenue
COGS
Gross Profit = Revenue - COGS
Operating Expenses
EBITDA = Gross Profit - Operating Expenses
Depreciation = CAL20 Fixed Assets.Depreciation Charge
Amortisation = CAL20 Fixed Assets.Amortisation Charge
EBIT = EBITDA - Depreciation - Amortisation
Net Interest = CAL40 Debt & Interest.Net Interest Expense
Profit Before Tax = EBIT - Net Interest
Tax Charge = MAX(0, 'Profit Before Tax' * INP01.Effective Tax Rate)
Net Income = 'Profit Before Tax' - 'Tax Charge'
Note that depreciation and interest are references, not inputs. They come from the roll-forwards. That is what makes the statements integrated.
Step 3: roll-forwards are the whole trick
Every balance sheet line follows the same shape:
Opening = IF SYS00.First Period? THEN INP06.Opening Balance ELSE PREVIOUS(Closing)
Closing = Opening + Movements
PREVIOUS() on a monthly time scale is the workhorse here. Two rules keep it safe:
- Roll forward at the leaf time level only. Set the summary method on
OpeningandClosingtoFormulaor to a closing-balance summary rather thanSum, otherwise the quarter total shows three months of opening balances added together. Movement line items keepSum. - Never chain
PREVIOUS()across a line item that itself usesPREVIOUS()on a different module unless you have mapped the dependency order. Anaplan will tell you about a genuine circular reference; it will not tell you that your quarter totals are nonsense.
Fixed assets (CAL20)
Opening NBV = IF SYS00.First Period? THEN INP06.Opening NBV ELSE PREVIOUS('Closing NBV')
Capex = INP04.Capex Plan
Depreciation Charge = 'Opening NBV' * INP04.Depreciation Rate / 12 + Capex * INP04.First Year Rate / 12
Disposals NBV = INP04.Disposals
Closing NBV = 'Opening NBV' + Capex - 'Depreciation Charge' - 'Disposals NBV'
If capex matters enough to model asset by asset, build a separate module dimensioned by an asset list with in-service dates and useful lives, and feed the summary here. Do not dimension the whole balance sheet by asset.
Working capital (CAL30) — drive it from days, because that is how the business argues about it:
Receivables Closing = INP03.DSO * 'CAL10 P&L Build'.Revenue * 12 / SYS00.Days in Year
Inventory Closing = INP03.DIO * 'CAL10 P&L Build'.COGS * 12 / SYS00.Days in Year
Payables Closing = INP03.DPO * ('CAL10 P&L Build'.COGS + Cash Opex) * 12 / SYS00.Days in Year
Receivables Movement = 'Receivables Closing' - PREVIOUS('Receivables Closing')
With the first-period case handled by the opening balance sheet, exactly as above. Days-based drivers give planners one lever each and make the sensitivity story obvious: a five-day DSO slip is instantly visible as a cash number.
Step 4: debt, interest, and the circularity everyone hits
Interest depends on debt, debt depends on the cash need, the cash need depends on net income, and net income depends on interest. Excel resolves this by iterating. Anaplan does not iterate — a genuine circular reference is a build error.
Three legitimate ways out, in order of how often they are the right answer:
- Calculate interest on the opening balance.
Interest = Opening Debt * Rate / 12. It is the standard convention in most corporate plans, it is defensible, and it removes the circularity outright. Start here. - Interest on opening balance plus scheduled movements only. Include contractually known drawdowns and repayments from
INP05, but not the revolver plug. Slightly more precise, still acyclic. - A bounded manual iteration. Build the revolver draw as a small number of explicit passes (
Pass 1,Pass 2,Pass 3line items), each computing interest on the previous pass's debt. Converges in two or three passes for realistic rates. Use only when the CFO insists on average-balance interest, and document it, because the next builder will not guess it.
The revolver plug itself:
Cash Before Financing = PREVIOUS('Closing Cash') + CAL60.'Net Cash Flow Before Revolver'
Revolver Draw = MAX(0, INP05.Minimum Cash - 'Cash Before Financing')
Revolver Repay = MIN(PREVIOUS('Revolver Closing'), MAX(0, 'Cash Before Financing' - INP05.Minimum Cash))
Revolver Closing = PREVIOUS('Revolver Closing') + 'Revolver Draw' - 'Revolver Repay'
This is the one place a slightly awkward formula earns its keep: it turns "we will need funding at some point" into a dated, sized number.
Step 5: derive the cash flow statement, do not type it
Now the payoff. CAL60 Cash Flow (Indirect) contains almost no assumptions — it is movements and sign flips:
Net Income = CAL10.'Net Income'
Add back Depreciation = CAL20.'Depreciation Charge'
Add back Amortisation = CAL20.'Amortisation Charge'
Change in Receivables = -CAL30.'Receivables Movement'
Change in Inventory = -CAL30.'Inventory Movement'
Change in Payables = CAL30.'Payables Movement'
Change in Provisions/Other = CAL50.'Other Liabilities Movement'
Cash from Operations = SUM of the above
Capex = -CAL20.Capex
Disposal Proceeds = INP04.'Disposal Proceeds'
Acquisitions = -INP04.Acquisitions
Cash from Investing = SUM of the above
Net Debt Movement = CAL40.'Debt Movement' + CAL40.'Revolver Draw' - CAL40.'Revolver Repay'
Equity Issued = INP05.'Equity Issued'
Dividends Paid = -INP05.'Dividends'
Cash from Financing = SUM of the above
Net Cash Flow = 'Cash from Operations' + 'Cash from Investing' + 'Cash from Financing'
Opening Cash = IF SYS00.First Period? THEN INP06.'Opening Cash' ELSE PREVIOUS('Closing Cash')
Closing Cash = 'Opening Cash' + 'Net Cash Flow'
Then — and this is the part people skip — feed Closing Cash back into CAL50 Balance Sheet Roll-Forward as the cash line. Cash is the only balance sheet line whose closing balance comes from the cash flow statement rather than the other way round. Everything else flows the opposite direction.
Non-cash movements are where tie-outs die. FX translation of foreign subsidiaries, revaluations, right-of-use asset recognition, share-based payment, and reclassifications all move the balance sheet without moving cash. Give each one an explicit line item in the relevant roll-forward, tag it Non-Cash in SYS02, and exclude it from the movement that flows into CAL60. If you consolidate multiple currencies, the FX effect on cash belongs on its own line at the bottom of the cash flow statement — our multi-currency and CTA tutorial covers the translation mechanics.
Step 6: the checks that prove it works
Build OUT02 and put it on the builder's UX page, not buried in a module:
Balance Check = 'Total Assets' - ('Total Liabilities' + 'Total Equity')
Balance OK? = ABS('Balance Check') < 0.5
Cash Tie Check = CAL50.'Cash Closing' - CAL60.'Closing Cash'
Equity Tie Check = 'Equity Closing' - (PREVIOUS('Equity Closing') + CAL10.'Net Income' - INP05.Dividends + 'Other Equity Movements')
Retained Earnings Check = ...
Worst Balance Check = ABS of the largest breach across all periods and entities
Use a tolerance, not an exact zero — floating point and rounded inputs will leave pennies. Format the checks as conditionally coloured Booleans on a UX card so a red tile appears the moment someone adds a balance sheet line and forgets its cash flow treatment.
Diagnostic habits that save hours:
- Check the first period separately. Most tie-out failures are opening balance sheet failures, and the opening balance sheet must itself balance before anything downstream can.
- Break the balance check by section. A single aggregate difference tells you nothing; assets-vs-liabilities by section points straight at the guilty roll-forward.
- Add a "movements not in cash flow" reconciliation. Total balance sheet movement, less everything mapped to a cash flow category, less everything tagged non-cash, should be zero. When someone adds a line item, this is the check that catches it.
Step 7: make it usable, then make it fast
On the UX side, give planners the three statements as separate pages with a shared entity and version context selector, plus a scenario comparison page. Lock the derived statements with Dynamic Cell Access so nobody types into a calculated balance, and keep all inputs on clearly labelled driver pages.
On performance: roll-forward chains with PREVIOUS() are inherently sequential, so the usual levers apply — turn off summary methods on intermediate line items, keep the statement modules narrow-dimensioned, avoid SELECT on Time, and do not put IF SYS00.First Period? logic inside a line item that is also heavily dimensioned when a small system module can carry the flag. Our formula performance tuning tutorial goes deeper, and if your driver structure requires genuinely sparse dimensionality, the Hyperblock or Polaris decision is worth revisiting before you scale entities.
For the opening balance sheet and actuals, integrate rather than type: pull trial balance data from the GL on a schedule so the forecast always starts from a closed period. The integration tooling comparison covers the options, and mapping the chart of accounts to your Anaplan account hierarchy in a SYS module — never in the import definition — keeps the mapping visible and auditable.
A sensible build order
- Opening balance sheet, and prove it balances.
- Fixed assets roll-forward with capex and depreciation feeding the P&L.
- Working capital from days-based drivers.
- Balance sheet roll-forward with a hard-coded zero cash line.
- Cash flow derivation, then connect cash back into the balance sheet.
- Debt, interest on opening balance, and the revolver plug.
- Checks module and UX pages.
- Only then: scenarios, covenants, and any average-balance refinements.
Each step should leave the balance check at zero. If you build all seven and then start debugging, you will spend longer finding the break than you spent building.
Where we help
We build integrated financial statement models in Anaplan for finance teams that have outgrown a spreadsheet cash flow — including the GL integration, the covenant and liquidity reporting, and the audit trail that treasury and auditors ask for. See Anaplan for the Office of the CFO and Anaplan Financial Management Consulting, or get in touch with your current statement pack and we will tell you what a connected version would take.