Cash Flow Forecasting: The 13-Week Rolling Forecast Method
This guide provides a simple, CFO-grade method to manage your company's liquidity. By building a 13-week rolling cash forecast, you can see your cash runway by the week, strategically steer collections and payments, and eliminate financial surprises. It's a system built for founders — and this page ships the actual model: a formula-backed workbook with sample data plus the sample Beancount ledger behind its first two weeks (see downloads below).
Two things this guide is not: a forecast is forward-looking estimates you type in, while accounting actuals are bank movements already posted in your ledger — the Monday routine below copies the latter over the former by hand. Nothing here syncs automatically: the workbook has no macros or external connections, and no step pulls from your bank or Beancount on its own.
Why 13 Weeks?
A 13-week forecast is the gold standard for operational cash management for several key reasons:
- Short-Term Control: It covers approximately one business quarter, giving you a clear view of your immediate liquidity. This horizon is long enough to include 2–3 payroll cycles, tax remittances, and typical vendor payment terms, but short enough to remain highly accurate and actionable.
- Receipts & Disbursements View: The forecast uses the "direct method," focusing purely on cash in and cash out. This isn't about accrual accounting or profitability; it's about what will actually hit or leave your bank account, ensuring the forecast ties directly to your bank balance.
- Rolling, Not Static: This isn't a one-time budget. Each week, you drop the week that just passed, add a new week at the end (week 13), and update your assumptions. This keeps the forward-looking horizon constant, turning forecasting into a dynamic, weekly discipline.
What You’ll Build
- A Single Spreadsheet: The core of the system is one sheet with 13 columns (Week 1 through Week 13) and clearly defined sections: Opening Cash, Receipts, Disbursements, Net Cash, and Ending Cash.
- Category Mapping: A simple system to map transactions from your ledger to the forecast categories (e.g., all payments from Stripe are mapped to "Customer Receipts"; Gusto payments are mapped to "Payroll"). The workbook's Vendor Mapping tab already encodes this map, including the bank/card no-double-count rule — start from it rather than inventing your own.
- A Weekly Rhythm: A repeatable process for updating the forecast, tracking variance (forecast vs. actual), and a set of pre-defined triggers for taking action when financial thresholds are hit.
Download the starter files
Skip the blank-page setup: this guide ships a formula-backed workbook with sample data, plus the sample ledger behind its first two weeks.
- 13-week forecast workbook (XLSX, v1.0.0) — cash-flow-forecast-13-week.xlsx. Editable assumptions, formula-chained weeks and a vendor-mapping tab; replace the blue sample cells with your own numbers.
- Sample ledger and actuals (Beancount ledger,
.bean) — sample.bean. Balanced example ledger with the worked W1–W2 bank actuals matching the workbook's first two weeks.
How the starter files work (read this before typing)
Sheets. The workbook (cash-flow-forecast-13-week.xlsx, v1.0.0) has three sheets:
- Forecast — the 13 dated weeks, assumptions, receipts, disbursements, net/ending cash.
- Vendor Mapping — the ledger→category map with the bank/card cash-count rule per source.
- Notes — mechanics, scenario toggles and version, duplicated from the generator so the file explains itself offline.
Time basis. Weeks are Monday-start, W1 beginning 2026-09-14 through W13 beginning 2026-12-07 (row 2 of Forecast; edit these dates when you adopt the model — every formula is week-relative, so the chain survives). A transaction belongs to the week containing its posting date, Monday through Sunday.
Units. Whole USD throughout (number format #,##0). The sample company is a seed-stage SaaS opening at 85,000 with weekly payroll alternating 0 / 11,000, monthly rent, and a 900/week loan autopay.
What you type vs. what computes. Blue cells are manual inputs; everything else is a formula:
- Inputs: opening balance
B5(85,000), togglesB6/B7(1.0), floorB8(40,000), receipt bases rows 12–14, disbursement bases rows 17–26, and the row-2 week dates. - Formulas (shown for column B, week 1 — every later week shifts the column letter): Opening
B10 = $B$5(weeks 2–13 instead carry forward, e.g.C10 = B29); Total ReceiptsB15 = B12*$B$6+B13*$B$7+B14; Total DisbursementsB27 = SUM(B17:B26); NetB28 = B15-B27; EndingB29 = B10+B28. - Recalculation is Automatic and the file sets
fullCalcOnLoad, so Excel, LibreOffice and Numbers recompute on open (the file stores no cached formula values). Change a blue cell and all 13 weeks move — e.g. setting the collection toggleB6to 1.2 takes W1 receipts from 12,200 to 14,600 and W1 ending cash from 87,500 to 89,900. - Regenerate the pristine file any time with
yarn generate:cash-flow-forecast(generator:scripts/generate-cash-flow-forecast.py, writer openpyxl 3.1.5;--verifyre-opens the file and asserts every total cell holds a real formula).
Sample vs. your data. Every blue cell ships with sample numbers — they are the worked example, not your business. Replace them with your own figures week by week; the two toggles (B6 scales all customer receipts, B7 scales all prepaids) are the only thing meant to stay generic, for scenario play. The sample ledger's W1–W2 actuals equal the workbook's W1–W2 sample forecast by construction, so forecast-vs-actual variance there is zero: that is the reconciliation target, not a claim about your books.
Structure (The Rows You Need)
Your forecast sheet should be structured with the following rows to capture all cash movements. This is the Forecast sheet's layout in the download (receipts rows 12–14, disbursements rows 17–26, totals rows 10/15/27–29) — read it as the map, not a second spec.
-
Opening Cash Balance (This must tie to the prior week’s Ending Cash Balance)
-
Receipts (Cash In)
- Customer Receipts: Cash you expect to collect from existing invoices (Accounts Receivable).
- New Bookings/Prepaids: Upfront payments you expect from new deals closing within the 13-week window.
- Other Inflows: Any other cash coming in, such as tax refunds, interest income, or grant funding.
-
Disbursements (Cash Out) — 10 rows on the sheet (rows 17–26):
- Payroll: The full cash cost, including net pay to employees and all employer-side payroll taxes.
- Contractors & Freelancers: Payments to non-employees.
- Cloud/Hosting (COGS): Core infrastructure costs like AWS, GCP, etc.
- SaaS/Tools: All your software subscriptions.
- Marketing: Ad spend, agency fees, and other brand-related costs.
- Rent/Office: Physical office costs.
- Legal & Accounting: Professional services fees.
- Taxes & Fees: Sales tax remittances and other government payments.
- Debt Service: Both principal and interest payments on any loans.
- One-Offs: Lumpy, infrequent payments like annual insurance premiums, security deposits, or hardware/capex (laptops, equipment) — anything without its own row above lands here.
-
Net Cash Flow (= Total Receipts − Total Disbursements)
-
Ending Cash Balance (= Opening Cash + Net Cash Flow)
The Rolling Mechanics (as built in the workbook)
The logic of the rolling forecast is simple and powerful — and in the download it is already wired as formulas on the Forecast sheet (rows in parentheses):
Opening Cash (Week 1) = Opening balance assumption— cellB10 = $B$5.Opening Cash (Week n) = Ending Cash (Week n−1)— e.g.C10 = B29(row 10, weeks 2–13).Total Receipts (Week n) = Customer Receipts × collection toggle + Prepaids × bookings toggle + Other— e.g.B15 = B12*$B$6+B13*$B$7+B14(row 15).Total Disbursements (Week n) = SUM of the 10 category rows— e.g.B27 = SUM(B17:B26)(row 27).Net Cash (Week n) = Total Receipts − Total Disbursements— e.g.B28 = B15-B27(row 28).Ending Cash (Week n) = Opening Cash + Net Cash— e.g.B29 = B10+B28(row 29).
Your Weekly Monday Morning Rhythm (against this workbook):
- Roll the Window: Move the entire forecast forward one week — shift every week's blue inputs one column left (old Week 2 becomes the new Week 1), clear the last column, and date it as the new Week 13 in row 2. The carry-forward formulas (
C10 = B29, …) re-anchor automatically; spot-check that the new Week 1's Opening equals last week's Ending. - Update with Actuals: Overwrite last week's blue forecast cells with the week's actual bank movements from the mapping below (query, split, paste — by hand). Then confirm the week's Ending Cash cell equals your actual combined bank balance (
Assets:Bank:Checking+Assets:Bank:Savings): if it doesn't, the mapping is wrong, not the bank. - Re-estimate the Future: Update the blue cells for the upcoming 2–4 weeks with the freshest information you have (newly sent invoices, upcoming vendor payments, confirmed payroll dates).
Mapping from Beancount to Your Forecast
Bank-cash scope (the rule that prevents double counting). Weekly actuals are postings to Assets:Bank:* only — one scope that settles both traps:
- Credit cards: a card purchase posts to
Liabilities:CreditCard:*and moves no bank cash, so it is not counted when charged. Cash leaves once, at settlement (the bank→card payment). Counting the charge plus the settlement counts the same spend twice. In the sample ledger, W1 holds 420.00 USD of Amex SaaS charges (liability only, ignored) beside the 600.00 USD August-statement settlement (counted). The naive "bank outflows + card charges" total for W1 is 10,120.00 USD — exactly 420.00 too high; the workbook counts 9,700.00. - Internal transfers: a Checking↔Savings sweep has two opposite bank legs, so it nets to zero inside this scope and is excluded from both receipts and disbursements. The sample's 3,000.00 USD (W1) and 1,500.00 USD (W2) sweeps would otherwise inflate both sides by those amounts.
- Corollary: map the bank legs, not the Income/Expense legs. Loan principal is not an expense but is a bank outflow (the sample's 900.00 USD autopays = 800 principal + 100 interest, all counted under Debt Service); a card purchase is an expense but is not yet a bank outflow.
Receipts/disbursements split. From the exported bank legs: positive legs are receipts, negative legs are disbursements, transfer legs excluded. Category map (same as the Vendor Mapping tab): Stripe/PayPal payouts → Customer Receipts; new-customer wires → New Bookings / Prepaids; bank interest/grants → Other Inflows; Gusto/ADP → Payroll; AWS/GCP → Cloud/Hosting; bank-paid SaaS → Software/SaaS; landlord → Rent; law firm → Legal/Accounting; tax authority → Taxes & Fees; loan autopay → Debt Service.
- Handling Sales Tax: Even though sales tax isn't revenue, it's a cash flow item. Treat collections of sales tax as a cash receipt and the remittance to the government as a disbursement. The revenue impact lives in your accrual books, but the cash movement matters here.
Worked week: W1 end to end (2026-09-14 – 2026-09-20)
Opening bank cash is 85,000.00 (Checking 80,000 + Savings 5,000 on 2026-09-13). The ledger's W1 bank legs, after excluding the 3,000.00 sweep pair:
| Forecast line | Bank legs | Amount |
|---|---|---|
| Customer Receipts | Stripe 12,000 | 12,000.00 |
| Other Inflows | Bank interest 200 | 200.00 |
| Total Receipts | B15 = B12×B6+B13×B7+B14 = 12,000×1 + 0×1 + 200 | 12,200.00 |
| Contractors | 1,500 | 1,500.00 |
| Cloud/Hosting | AWS 2,200 | 2,200.00 |
| Software/SaaS | Amex settlement 600 (charges excluded) | 600.00 |
| Marketing | Agency 1,000 | 1,000.00 |
| Rent | Landlord 3,500 | 3,500.00 |
| Debt Service | Loan autopay 900 | 900.00 |
| Total Disbursements | B27 = SUM(B17:B26) | 9,700.00 |
| Net | B28 = B15−B27 | +2,500.00 |
| Ending | B29 = B10+B28 = 85,000 + 2,500 | 87,500.00 |
Roll-forward into W2. C10 = B29, so W2 opens at 87,500.00. Its bank legs give receipts 8,000 (Stripe) + 5,000 (prepaid) + 200 (interest) = 13,200.00 and disbursements 11,000 (Gusto payroll) + 1,500 + 2,200 + 600 (bank-debited SaaS) + 1,000 + 900 = 17,200.00; net −4,000.00, ending 83,500.00 — exactly the workbook's W2 column. Forecast-vs-actual variance is zero for these two weeks by construction; that is your proof the mapping works, applied to one week at a time from W3 on.
Reproduce it (verified 2026-09-09, Beancount 3.2.3 + beanquery 0.2.0)
uvx --from beancount bean-check public/downloads/cash-flow-forecast/sample.bean
yarn check:cash-flow-actualsThe checker runs bean-check (the ledger's own balance assertions prove each week's ending cash), the export queries below, and an independent Python roll-forward asserting all three agree — W1 12,200.00 / 9,700.00 / 87,500.00, W2 13,200.00 / 17,200.00 / 83,500.00:
SELECT date, narration, account, position
FROM date >= 2026-09-14 AND date <= 2026-09-20
WHERE account ~ "^Assets:Bank" ORDER BY date;
SELECT sum(position) AS net
FROM date >= 2026-09-14 AND date <= 2026-09-20
WHERE account ~ "^Assets:Bank";
SELECT sum(position) AS bank_cash
FROM close ON 2026-09-21 WHERE account ~ "^Assets:Bank";(Shift the dates by 7 for W2, closing on 2026-09-28.) One BQL limitation to know: this beanquery version cannot filter postings by sign, so the receipts/disbursements split is applied to the exported rows — positive bank legs to receipts, negative to disbursements, sweep pairs excluded — exactly as the checker does.
The Update Rhythm (30–45 Minutes Weekly)
- Pull Actuals (15 min): Export the week's postings to
Assets:Bank:*(run the queries above, or download transactions from your bank accounts — card charges stay out; only the settlement payment counts). Confirm that your "Ending Cash" for the prior week perfectly matches your actual combined bank balance (Checking + Savings). This reconciliation is non-negotiable. - Review Accounts Receivable (10 min): List all outstanding invoices and slot them into the week you expect payment. Be conservative and apply realistic collection lags based on past performance.
- Review Accounts Payable & Payroll (10 min): Slot the due dates for all known upcoming bills. Prefill your payroll dates and amounts for the entire quarter. Stage non-critical disbursements for Fridays to preserve cash optionality during the week.
- Variance Meeting (10 min): Briefly compare last week’s forecast to the actual results. Note the causes of any significant differences and decide if you need to adjust your forecasting rules going forward.
Accuracy and Decision-Making
Accuracy Rules of Thumb
- Weeks 1–2: Aim for ±5–10% error. These dates and amounts should be highly certain.
- Weeks 3–6: Expect ±10–20% error. This period will be a mix of known bills and pattern-based estimates.
- Weeks 7–13: This part of the forecast is directional. It's driven by your sales pipeline and run-rate expenses.
Confidence Codes: To make the forecast easier to read, mark each forecast row with a confidence code: Committed (e.g., payroll, rent), Likely (e.g., invoices to good customers), or Upside (e.g., new deals from the pipeline).
Triggers & Actions (Decide These in Advance)
A forecast is useless without a plan. Pre-define your actions for when you hit certain thresholds.
- Minimum Cash Floor: For example, your rule might be "We must maintain cash ≥ 1.5× the next full payroll amount at all times." If the forecast shows you'll breach this floor, you immediately execute a pre-agreed plan, such as a collections sprint and a pause on all discretionary spending.
- Runway Guardrail: For example, "If the Ending Cash in Week 13 implies less than X months of burn, we will initiate our financing plan." This could involve seeking a term sheet, offering customers a discount for revenue prepayment, or drawing on a credit line.
- Large Outflow Rule: For example, "Any single non-payroll disbursement greater than 5% of our current cash balance must be approved two weeks in advance and have a fallback plan."
Template and Scenarios
Simple Category Set (For a Seed-Stage SaaS)
- Receipts: Customer Receipts, Other Inflows (interest, refunds, grants)
- Disbursements: Payroll (net + ER taxes), Contractors, Cloud/Hosting (COGS), Software/SaaS (OpEx), Marketing (Paid/Brand), Rent/Office, Legal/Accounting, Taxes & Fees, Debt Service, One-Offs / Annuals
- Calculated: Net Cash, Ending Cash
Template (already built in the download; copy this to rebuild blank)
The table below is the Forecast sheet's shape — same rows, same formulas — for rebuilding on a blank sheet. In the download, row 2 already holds the week-starting dates (W1 2026-09-14 through W13 2026-12-07) and every total is wired; freeze below row 3 and right of column A (B4 in the file) to match.
| Row / Week | W1 | W2 | W3 | ... | W13 |
|---|---|---|---|---|---|
| Opening Cash | |||||
| --- RECEIPTS --- | |||||
| Customer Receipts | |||||
| New Prepaids/Upfront | |||||
| Other Inflows | |||||
| Total Receipts | =SUM() | =SUM() | =SUM() | =SUM() | |
| --- DISBURSEMENTS --- | |||||
| Payroll (Net + ER Taxes) | |||||
| Contractors | |||||
| Cloud/Hosting (COGS) | |||||
| Software/SaaS (OpEx) | |||||
| Marketing | |||||
| Rent/Office | |||||
| Legal/Accounting | |||||
| Taxes & Fees | |||||
| Debt Service | |||||
| One-Offs / Annuals | |||||
| Total Disbursements | =SUM() | =SUM() | =SUM() | =SUM() | |
| Net Cash | =Receipts-Disbursements | ||||
| Ending Cash | =Opening+Net |
Scenario Toggles (Keep it Lightweight)
You can build simple scenario planning without creating a complex model. Add a "toggle" cell at the top of your sheet for key drivers. For example:
Collection slowdown toggle B6: [1.0](Change to 1.2 to model a 20% slowdown in collections — every week's Total Receipts recomputes viaCOL15 = COL12*$B$6+COL13*$B$7+COL14)New-bookings toggle B7: [1.0](Change to 0.8 to model a 20% miss vs. plan)
These are the actual assumption cells on the Forecast sheet — no extra wiring needed.
Learning and Avoiding Mistakes
Variance Tracking (Make Learning Compound)
In the week that just closed, add two columns: "Last Week's Forecast" and "Actual." Calculate the variance. When you review, tag the reasons for major differences: collection delay, scope slip, unplanned vendor purchase, timing shift. If the same type of variance repeats, change your model's underlying rule. For example, if collections are consistently a week late, change your default collection lag assumption from 21 days to 28 days.
Common Pitfalls (Avoid These)
- Mixing Accrual and Cash: This forecast is for cash only. Revenue recognized, depreciation, and other accrual concepts belong in your main ledger, not here.
- Forgetting Lumpy Annuals: Annual insurance premiums, large SaaS renewals, and quarterly tax payments can be huge surprises. Schedule them in your forecast as soon as you know about them.
- Ignoring Sales Tax Cash: Even if it’s a pass-through liability, the cash is in your bank account until you remit it. Model both the inflow and the outflow.
- Not Reconciling: If your forecast's Ending Cash doesn't match your actual combined bank balance (Checking + Savings; card balances excluded), you have a mapping error — usually a counted card charge or a kept sweep. You must fix it before you can trust the forecast.
- No Clear Owner: Assign one person the responsibility of updating the forecast every single week. Name a deputy for vacations.
Quick Beancount Tie-Ins
- Chart of Accounts: Keep your cash buckets clean (e.g.,
Assets:Bank:Checking,Assets:Bank:Savings,Liabilities:CreditCard:Amex). Weekly actuals are theAssets:Bank:*legs only — the card account exists so settlements have somewhere to come from, not as a second source of outflows. - Don't use the Income Statement as the check: Fava's Income Statement is accrual — it books card purchases when charged and ignores loan principal — so it will disagree with this cash forecast by design. The cash check is the bean-query export + roll-forward above (
yarn check:cash-flow-actuals), which must tie to Ending Cash every week. - Documentation: When you have a large one-off item, attach the invoice PDF in your Beancount
documents/folder and link to it in your forecast's notes column.
Board/Investor Pack (One Slide)
- Graph: A simple line chart of your Ending Cash by week for all 13 weeks. Add a horizontal line showing your minimum cash floor.
- Table: A small table showing the W1–W13 Ending Cash numbers, plus a bulleted list of the top 5 largest inflows and outflows expected in the quarter.
- Notes: A few bullet points on key assumptions that have changed since the last update and any triggers you have hit or expect to hit.