Skip to main content

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 — so the workbook keeps them apart. You freeze a copy of your plan as a dated baseline, type each closed week's bank cash onto a separate Actuals sheet, and read the difference on a Variance sheet; the plan you compare against is never overwritten. 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​

  1. One Forecast Grid: 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. Three companion sheets with the same rows keep a frozen Baseline of that plan, the Actuals your bank recorded, and the Variance between them.
  2. 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.
  3. A Weekly Rhythm: A repeatable process for recording actuals, reviewing variance against the baseline you committed to, re-estimating the weeks ahead, 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.1.0) — cash-flow-forecast-13-week.xlsx. Editable assumptions, formula-chained weeks, a values-only Baseline snapshot, an Actuals sheet, a formulas-only Variance sheet and a vendor-mapping tab. Every sample number is the worked example — replace it with your own (see Sample vs. your data below).
  • Sample ledger and actuals (Beancount ledger, .bean) — sample.bean. Balanced example ledger whose W1–W2 bank cash is exactly what the workbook's Actuals sheet holds for its first two weeks.

How the starter files work (read this before typing)​

Sheets. The workbook (cash-flow-forecast-13-week.xlsx, v1.1.0) has six sheets, in this order:

  • Forecast — your live plan: the 13 dated weeks, assumptions, receipts, disbursements, net/ending cash. Edit it as often as you like.
  • Baseline — a values-only snapshot of Forecast rows 2–29, labelled with a version in B31 and an as-of date in B32. It holds no formulas, so nothing you do elsewhere can change it.
  • Actuals — the bank cash each closed week really moved, entered by you: a status in row 3 (complete or partial), category amounts in the same rows as Forecast, and an optional statement balance in row 30.
  • Variance — formulas only: Actual − Baseline for every category and total, matched by week-start date, plus a legend explaining each status word. It never reads Forecast.
  • Vendor Mapping — the ledger→category map with the bank/card cash-count rule per source.
  • Notes — mechanics, the weekly review, scenario toggles and version, duplicated from the generator so the file explains itself offline.

All four week grids share one layout: weeks W1–W13 are columns B–N, row 2 holds each week's start date, opening cash is row 10, receipts rows 12–14 (total 15), disbursements rows 17–26 (total 27), net row 28 and ending row 29. So B12 is W1 customer receipts on every one of them.

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 — and carry them to Baseline and Actuals when you capture your baseline). 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. On Forecast, blue cells are manual inputs and everything else is a formula (Actuals works the same way with its own inputs, described under Capture a baseline and the weekly review below):

  • Inputs: opening balance B5 (85,000), toggles B6/B7 (1.0), floor B8 (40,000), the three receipt category bases, the ten disbursement category bases, and the week-starting dates on Forecast.
  • 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 Receipts B15 = B12*$B$6+B13*$B$7+B14; Total Disbursements B27 = SUM(B17:B26); Net B28 = B15-B27; Ending B29 = 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 toggle B6 to 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; --verify re-opens the file and asserts every total cell holds a real formula).

Sample vs. your data. Three things ship pre-filled, and all three are the worked example, not your business:

  • the blue cells on Forecast (the sample company's current plan);
  • the snapshot on Baseline, version B1 as of 2026-09-11 — the plan as it stood before the first two weeks closed;
  • the W1–W2 entries on Actuals (columns B–C), which are the bank cash in the sample ledger (sample.bean, above). W3–W13 are left blank.

Because the sample Baseline and Actuals differ, the Variance sheet opens on a real comparison: W1 ends +500 ahead of plan and W2 +300 (see Variance review below). Before your own first review, replace all three: type your plan on Forecast, clear the sample Actuals entries, and capture your own Baseline over B1 (steps below). The two toggles (B6 scales all customer receipts, B7 scales all prepaids) are the only thing meant to stay generic, for scenario play.

Coming from v1.0.0? The Forecast sheet's layout did not change, so you can carry your plan across deliberately: in your old file copy the input ranges only — B2:N2 (dates), B5:B8, B12:N14 and B17:N26 — and paste them as values at the same addresses in the new file's Forecast, never over the formula rows. v1.0.0 kept no baseline, so any past week you overwrote with actuals has no recoverable plan: type those weeks' bank cash onto Actuals and start your first Baseline from today's Forecast.

Structure (The Rows You Need)​

Your forecast sheet should be structured with the following rows to capture all cash movements. How the workbook is laid out: the rows below live on Forecast (the 13 dated weeks with Opening Cash, three receipt categories, ten disbursement categories, Net and Ending), and Baseline, Actuals and Variance repeat them row for row; Vendor Mapping maps ledger sources to these categories, including the bank/card no-double-count rule, and Notes explains the mechanics offline. On Forecast, receipts group as Customer Receipts, New Bookings/Prepaids and Other Inflows; disbursements group as Payroll, Contractors, Cloud/Hosting, Software/SaaS, Marketing, Rent, Legal & Accounting, Taxes & Fees, Debt Service and One-Offs; totals roll Opening → Total Receipts → Total Disbursements → Net → Ending.

  • 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)

    • 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)

Worked 13-week sample (USD)​

The table below is the workbook's Forecast sheet for the sample company, week by week — the current plan, re-forecast after W1 and W2 closed, so those two columns now hold what the bank actually did. W1 and W2 are ledger actuals — they equal the totals yarn check:cash-flow-actuals derives from sample.bean (receipts 12,200 / 13,200, disbursements 9,700 / 17,200, closing 87,500 / 83,500). W3–W13 are workbook assumptions from the generator's sample bases (not posted in the ledger). The plan the company committed to beforehand is preserved separately on Baseline and differs from these W1–W2 columns; Variance review below compares the two. Currency is whole USD; Closing = Opening + Receipts − Disbursements each week.

LineW1W2W3W4W5W6W7W8W9W10W11W12W13
Opening85,00087,50083,50092,50082,00081,00072,00080,00072,80075,30063,80079,80071,800
Receipts12,20013,20015,2009,20018,2008,20014,20014,20012,2009,20022,2009,20012,200
Disbursements9,70017,2006,20019,70019,20017,2006,20021,4009,70020,7006,20017,2009,700
Net2,500-4,0009,000-10,500-1,000-9,0008,000-7,2002,500-11,50016,000-8,0002,500
Closing87,50083,50092,50082,00081,00072,00080,00072,80075,30063,80079,80071,80074,300

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 — cell B10 = $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).

The same rows exist on Actuals as plain totals (B15 = SUM(B12:B14), B27 = SUM(B17:B26), B28 = B15-B27, B29 = B10+B28, C10 = B29), with the week's actual opening cash typed once in Actuals!B10. Actuals has no toggles and never refers to another sheet.

Capture a baseline (once per horizon)​

Do this when your Forecast holds the plan you want to be measured against — before the first week closes.

  1. Copy the plan as values. Select Forecast!B2:N29 and copy. Select Baseline!B2 and paste values only — Excel: Paste Special → Values; LibreOffice: Paste Special → Values Only; Numbers: Edit → Paste Formula Results. A normal paste would bring live formulas across and the "baseline" would silently follow every later edit.
  2. Label it. Type a version (for example B1) in Baseline!B31 and today's date in Baseline!B32. Both sit below the pasted block, so a later capture never overwrites them.
  3. Line up the weeks. Copy Baseline!B2:N2 and paste values at Actuals!B2, so both sheets name the same 13 week-start dates, and type the bank balance you start with in Actuals!B10.

From here, typing actuals, editing Forecast or moving a toggle recalculates Forecast and Variance and leaves Baseline exactly as captured.

Your weekly Monday review (against this workbook)​

  1. Record the week on Actuals — never on Forecast. In the column whose row-2 date is the Monday that just closed, type the week's bank cash per category in rows 12–14 and 17–26 (mapping below). Type 0 where no cash moved: a blank cell means "not entered yet", not zero. Put the bank statement's closing balance in row 30; row 31 should then read 0. Anything else is a mapping error — usually a counted card charge or a kept sweep — not a bank error.
  2. Check the week is complete. Type complete in row 3 once every category row holds a number, or partial while the week is still open (the drop-down offers both). Variance compares a week only when it is complete, every category is entered and the Actuals date equals the Baseline date in the same column.
  3. Read Variance. Row 3 names each week's state; only compared weeks show numbers, and every other state shows n/a, never 0, so an unentered week cannot pass for "on plan". Signs are Actual − Baseline (column O repeats them): receipts, net and ending positive = more cash than planned; disbursements positive = more spending than planned. Row 29 is cumulative — it includes every earlier week — and exists only while every week up to it is compared. Rows 32–35 express the totals as a share of the baseline (n/a when the baseline is zero).
  4. Re-estimate the future on Forecast. Update the blue cells for the next 2–4 weeks with the freshest information (newly sent invoices, upcoming vendor payments, confirmed payroll dates). To keep a full 13-week look-ahead, roll the Forecast window: shift its blue inputs, including the row-2 dates, one column left (old Week 2 becomes Week 1), then clear column N and give it the new Week 13 date. The carry-forward formulas re-anchor automatically; Baseline, Actuals and Variance are not touched.

Roll the review horizon (a deliberate step, not a weekly one)​

Baseline and Actuals stay on the horizon you captured until you decide to move them — typically when the Forecast has rolled a month or a quarter ahead, or the plan changed enough that you want a new yardstick.

  1. Archive. Save a copy of the workbook (for example cash-flow-forecast-B1.xlsx). It keeps the old baseline, its actuals and their variance together; the working file keeps no history.
  2. Clear the actual inputs. On Actuals, clear rows 3, 12–14, 17–26 and 30 in columns B–N, and B10. Leave C10:N10, rows 15 and 27–29 and row 31 alone — they are formulas.
  3. Capture a new baseline from today's Forecast with the next version (B2) and today's date, then line up the Actuals dates and opening balance exactly as in Capture a baseline above.

Never insert or delete week columns. If you re-capture a baseline but forget to re-date Actuals, every affected week shows date mismatch instead of comparing a week against a different week's plan.

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.

Beancount excerpt that feeds W1​

Every posting below also exists in the shipped sample.bean. Saved alone, this excerpt passes uvx --from beancount bean-check and produces the table's W1 receipts (12,200), disbursements (9,700) and closing (87,500) once you apply the bank-cash scope above (exclude the Checking↔Savings sweep from both sides; count the Amex settlement, not the liability charges).

option "title" "Cash forecast sample — W1 excerpt"
option "operating_currency" "USD"
 
2026-09-13 open Assets:Bank:Checking USD
2026-09-13 open Assets:Bank:Savings USD
2026-09-13 open Liabilities:CreditCard:Amex USD
2026-09-13 open Liabilities:Loan USD
2026-09-13 open Equity:Opening-Balances USD
2026-09-13 open Income:Sales USD
2026-09-13 open Income:Interest USD
2026-09-13 open Expenses:Contractors USD
2026-09-13 open Expenses:Cloud USD
2026-09-13 open Expenses:Software USD
2026-09-13 open Expenses:Marketing USD
2026-09-13 open Expenses:Rent USD
2026-09-13 open Expenses:Interest USD
 
2026-09-13 * "Opening balances"
  Assets:Bank:Checking            80000.00 USD
  Assets:Bank:Savings              5000.00 USD
  Liabilities:CreditCard:Amex      -600.00 USD
  Liabilities:Loan               -20000.00 USD
  Equity:Opening-Balances        -64400.00 USD
 
2026-09-14 * "Stripe" "Customer receipts W1"
  Assets:Bank:Checking            12000.00 USD
  Income:Sales                   -12000.00 USD
 
2026-09-15 * "Contractor" "Contractors W1"
  Expenses:Contractors              1500.00 USD
  Assets:Bank:Checking             -1500.00 USD
 
2026-09-15 * "AWS" "Cloud hosting W1"
  Expenses:Cloud                    2200.00 USD
  Assets:Bank:Checking             -2200.00 USD
 
2026-09-16 * "Bank" "Checking -> Savings sweep"
  Assets:Bank:Savings               3000.00 USD
  Assets:Bank:Checking             -3000.00 USD
 
2026-09-17 * "SaaS vendor" "Amex SaaS charges"
  Expenses:Software                  250.00 USD
  Liabilities:CreditCard:Amex       -250.00 USD
 
2026-09-17 * "SaaS vendor" "Amex SaaS charges"
  Expenses:Software                  170.00 USD
  Liabilities:CreditCard:Amex       -170.00 USD
 
2026-09-18 * "Amex" "August statement settlement"
  Liabilities:CreditCard:Amex        600.00 USD
  Assets:Bank:Checking              -600.00 USD
 
2026-09-19 * "Landlord" "Rent W1"
  Expenses:Rent                     3500.00 USD
  Assets:Bank:Checking             -3500.00 USD
 
2026-09-19 * "Agency" "Marketing W1"
  Expenses:Marketing                1000.00 USD
  Assets:Bank:Checking             -1000.00 USD
 
2026-09-19 * "Bank" "Interest W1"
  Assets:Bank:Checking               200.00 USD
  Income:Interest                   -200.00 USD
 
2026-09-19 * "Lender" "Loan autopay W1"
  Liabilities:Loan                   800.00 USD
  Expenses:Interest                  100.00 USD
  Assets:Bank:Checking              -900.00 USD

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 value in Actuals!B10. The ledger's W1 bank legs, after excluding the 3,000.00 sweep pair, go into column B of the Actuals sheet; every category not listed is typed as 0, and row 3 is set to complete:

Actuals line (cell)Bank legsAmount
Customer Receipts (B12)Stripe 12,00012,000.00
Other Inflows (B14)Bank interest 200200.00
Total ReceiptsB15 = SUM(B12:B14) = 12,000 + 0 + 20012,200.00
Contractors (B18)1,5001,500.00
Cloud/Hosting (B19)AWS 2,2002,200.00
Software/SaaS (B20)Amex settlement 600 (charges excluded)600.00
Marketing (B21)Agency 1,0001,000.00
Rent (B22)Landlord 3,5003,500.00
Debt Service (B25)Loan autopay 900900.00
Total DisbursementsB27 = SUM(B17:B26)9,700.00
NetB28 = B15−B27+2,500.00
EndingB29 = B10+B28 = 85,000 + 2,50087,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 on Actuals (and on the re-forecast Forecast sheet). The statement balances 87,500 and 83,500 sit in Actuals!B30:C30, so row 31 reads 0 for both weeks: that is your proof the mapping works. What the weeks did against the plan is a separate question, answered on Variance below.

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-actuals

The 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)​

  1. 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) and type them onto the Actuals sheet. Confirm that the week's Ending Cash on Actuals perfectly matches your actual combined bank balance (Checking + Savings) — row 31 reads 0. This reconciliation is non-negotiable.
  2. 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.
  3. 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.
  4. Variance Meeting (10 min): Open the Variance sheet and walk the week's compared column: which categories moved, in which direction, and what that did to cumulative ending cash. 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 / WeekW1W2W3...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 via COL15 = 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 Review (Make Learning Compound)​

The workbook does the bookkeeping of variance for you: Variance = Actual − Baseline, per category and per total, for every week whose Actuals are complete and dated like the Baseline. Your job is to explain the numbers. 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.

Worked comparison (the shipped sample). Baseline B1 was captured on 2026-09-11 from an opening of 85,000; the Actuals are the sample ledger's bank cash. Signs follow the Variance sheet: receipts, net and ending positive = more cash than planned, spending positive = more spent than planned.

WeekBaseline in / out / endingActual in / out / endingΔ receiptsΔ spendingΔ netΔ ending (cumulative)
W1 (2026-09-14)12,000 / 10,000 / 87,00012,200 / 9,700 / 87,500+200−300+500+500
W2 (2026-09-21)13,200 / 17,000 / 83,20013,200 / 17,200 / 83,5000+200−200+300
W3 (2026-09-28)15,200 / 6,000 / 92,400not enteredn/an/an/an/a

Reading it the way the Variance sheet lays it out:

  • W1, +500. Customer receipts came in 200 above the 11,800 planned (Variance!B12 = +200) and AWS billed 2,200 against a planned 2,500 (Variance!B19 = −300: less spending, favorable). 85,000 + 12,200 − 9,700 = 87,500 actual against 85,000 + 12,000 − 10,000 = 87,000 planned.
  • W2, +300. Receipts landed exactly on plan, but the bank-paid SaaS bill was 600 against a planned 400 (Variance!C20 = +200: more spending, adverse). Net for the week is −200, so the cumulative ending lead shrinks from +500 to +300 (Variance!C29): 87,500 + 13,200 − 17,200 = 83,500 against 87,000 + 13,200 − 17,000 = 83,200.
  • W3 onward, not observed. Nothing has been entered, so every cell shows n/a — not a comforting 0.
  • As percentages (rows 32–33): W1 receipts +1.67% and spending −3.00%; W2 receipts 0.00% and spending +1.18%.

Two tags come out of this: the AWS estimate is running high, and the bank-paid SaaS line was planned 200 too low. Both are fixes to Forecast's assumptions — Baseline B1 stays as it is, so next quarter you can still see how far off the original plan was.

Common Pitfalls (Avoid These)​

  • Overwriting the Plan: Typing actuals over Forecast cells (or re-pasting the Baseline every week) destroys the plan you were meant to be measured against. Actuals go on Actuals; the Baseline changes only when you deliberately roll the horizon.
  • 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 the week's Ending Cash on Actuals 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 the Assets: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)​

  1. Graph: A simple line chart of your Ending Cash by week for all 13 weeks. Add a horizontal line showing your minimum cash floor.
  2. 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.
  3. 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.

Set up accounting you can trust

Start a free ledger now, or use the startup guide and founder community when you want more context.