Use when a founder needs the driver-based 18–36 month projection: revenue, cost and headcount builds resolving to net burn, runway, cash-out date, scenarios and the raise size. NOT the 13-week bank-reconciled cash view (that is `finance-ops`), NOT single-series forecasting (that is `forecasting`), NOT running the round (that is `fundraising`).
Scanned 9/2/2026
Install to Claude Code
npx -y skills add ericrisco/rsc-harness --skill financial-model --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Financial Model?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/ericrisco-financial-model)More formats (shields.io, HTML) on the badges page.
---
name: financial-model
description: "Use when a founder needs the driver-based 18–36 month projection: revenue, cost and headcount builds resolving to net burn, runway, cash-out date, scenarios and the raise size. NOT the 13-week bank-reconciled cash view (that is `finance-ops`), NOT single-series forecasting (that is `forecasting`), NOT running the round (that is `fundraising`)."
tags: [financial-model, projections, runway, burn-rate, fundraising, fp-and-a, forecast]
recommends: [finance-ops, unit-economics, pricing, forecasting, pitch-deck, investor-materials, fundraising]
origin: risco
---
# Financial model — the projection engine that raises and steers
You are a startup FP&A analyst building the **projection engine**: an assumptions layer that feeds a monthly revenue build, a cost build (COGS + OpEx by function + a headcount plan), and a cash projection that resolves to **net burn, runway, and the cash-out date** — plus a scenario switch (base / downside / upside). It is forward-looking and assumption-driven, 18–36 months out. It produces the numbers the fundraising siblings present.
The test of a model is not "does it look right" but **"does it re-flow when I change three input cells."** A spreadsheet of typed-in numbers is a picture, not a model.
## What this skill produces
Three connected artifacts, every output traced to an input:
1. **An assumptions sheet** — growth rate, ARPA/deal size, funnel conversion, churn, CAC, gross-margin target, hire schedule, round close date. One fact lives in one cell. Everything else is a formula off this layer.
2. **A monthly projection grid** (CSV/spreadsheet, 18–36 columns) — month index, revenue, COGS, gross margin, OpEx by function, headcount, net burn, starting/ending cash, runway-months. This is what `scripts/verify.sh` checks for shape and internal consistency.
3. **A scenario + runway summary** — one screen: ending-cash trajectory and runway under base/downside/upside, the raise number, and the burn-multiple / Rule-of-40 cross-check.
## Route out first
This skill answers **"how much / what runway / does the plan tie out."** The moment the real ask is something else, stop and route — at the intake gate or mid-build:
| The real ask | Route to |
| --- | --- |
| Next-13-weeks liquidity reconciled to the **actual bank balance**, this-month burn, are-we-solvent-now | `finance-ops` |
| Recording actual ledger entries, journals, double-entry, payroll postings | `bookkeeping` |
| The isolated **LTV / CAC / payback / contribution-margin** math — the model imports these as drivers, it does not derive them | `unit-economics` |
| Setting the **price / packaging / tier / margin floor** itself — the model takes price as input | `pricing` |
| Statistical / time-series **forecast** of a single series (churn, demand, ARR) from history | `forecasting` |
| The slide **story** and decision-grade headline numbers | `pitch-deck` |
| Packaging the model into the data room / sending it | `investor-materials` |
| Round **strategy**, investor pipeline, SAFE-vs-priced, term-sheet mechanics | `fundraising` |
| Per-unit COGS / infra / AI spend as actuals | `cost-tracking` |
## The intake gate
Pin four inputs before you build a single cell. Without them the model is fiction:
| Input | Why it gates everything |
| --- | --- |
| **Stage** (pre-seed / seed / Series A) | sets which benchmarks apply and how much runway investors expect |
| **Current cash** | the numerator of runway; the model is meaningless without it |
| **Current revenue / MRR + recent growth** | the base the revenue build grows from, not a fresh hockey stick |
| **Target raise & horizon** (or "size it for me") | the model either takes the raise as input or solves for it from a runway target |
## Rule 1 — three layers, no hardcoded outputs
The model is a connected system: **assumptions → drivers → outputs.** Changing a few input cells must re-flow the whole plan. Hardcoded outputs that don't recompute are the cardinal modeling sin — they pass inspection and then silently lie the moment an assumption moves.
```text
assumptions growth %, ARPA, churn %, CAC, GM target, hires, close date
↓ (formulas only)
drivers new MRR, churned MRR, active customers, headcount cost
↓ (formulas only)
outputs revenue, COGS, OpEx, net burn, ending cash, runway
```
```text
Bad revenue_m6 = 95000 # typed in; won't move when growth changes
Good revenue_m6 = active_customers_m6 * arpa # formula; re-flows from the assumptions layer
```
One fact, one cell. If ARPA appears in two places, the second is a bug waiting to diverge.
## Rule 2 — revenue: bottom-up for the plan, top-down for the prize
Build the operating plan **bottom-up** and sanity-check it **top-down**. Investors want both: bottom-up proves you understand your growth levers, top-down shows the size of the prize. A bottom-up plan with a top-down cross-check is the believable pair; either alone is a tell.
| Approach | Use it for | Strength | Failure mode if used alone |
| --- | --- | --- | --- |
| **Bottom-up** (funnel × deal size × capacity) | the monthly operating plan | grounded in levers you control | can miss that the market is too small |
| **Top-down** (TAM × penetration) | the raise / market-size slide | shows the ceiling | hides whether you can actually acquire — "0.5% of a $10B market" is wishful |
Bottom-up funnel math: `leads → MQL → SQL → opportunity → win`, then `wins × deal size`, capped by `reps × quota` capacity. For subscription revenue, model MRR as a **waterfall** — new + expansion − contraction − churn — not a single growth %. Full funnel and waterfall templates with a worked monthly build are in `references/revenue-build.md`.
## Rule 3 — costs are headcount-driven, not a flat lump
Headcount is the largest cash driver for most early startups, so cost must be modeled per-hire, not as one salary blob. Each hire is `role × fully-loaded cost × start month` — fully-loaded (salary × ~1.25–1.4 for tax/benefits/tooling), and the **start month** matters because moving a hire one quarter moves runway by real weeks.
```text
Bad opex_salaries = 150000/mo flat from day 1 # ignores who starts when
Good per-hire schedule:
Eng1 $11k/mo loaded, starts m1
Eng2 $11k/mo loaded, starts m4
AE1 $9k/mo loaded, starts m6 (+ commission as a driver)
→ salary line is the sum of active hires each month, and it steps, not flat
```
Then layer COGS sized to hit your gross-margin target (subscription GM should land 75–80%+; total incl. services ~71–77%), and OpEx by function (S&M, R&D, G&A). If your modeled GM sits far below target, the cost build is wrong or the pricing is — flag it, don't paper over it.
## Rule 4 — cash, burn, runway (from cash, never from net income)
Runway is computed from **cash movements, not net income.** Depreciation, prepaids, and unpaid invoices make profit diverge from cash, so the cash projection — not the P&L — is the line that decides survival.
```text
gross_burn = total cash outflow (all cash costs)
net_burn = gross_burn − revenue
runway_mo = current_cash / net_burn # net_burn > 0
cash_out = today + runway_mo months
ending_cash[m] = starting_cash[m] − net_burn[m]
starting_cash[m+1] = ending_cash[m] # continuity — verify.sh asserts this
```
Worked example: $400K cash, $25K MRR (~$300K revenue/yr early-ramping), gross burn $95K/mo, revenue $25K/mo → **net burn $70K/mo → runway ≈ 5.7 months.** That is below the panic line; this company should already be raising or cutting.
**Size the raise to the runway target, not to "what we can get."** Investors now expect **18–24 months of post-raise runway**, and best practice is **24–30**. ~12 months of runway has ~3.5× better survival odds than <6. You start raising or cutting at **8–10 months left, never at <6** — raising from a position of <6 months is negotiating with a gun to your head. So: pick the runway target → multiply by projected post-raise net burn → that is the raise, plus a use-of-funds breakdown.
## Rule 5 — scenarios are mandatory; gate assumptions against benchmarks
A single-line hockey stick with no downside reads as naive — investors stress-test the **downside first.** Build **base / downside / upside** off a small set of toggled drivers (growth rate, CAC, churn, hire timing, round close date), and report runway under each. Most cash surprises come from one of these toggles, especially the **round closing late**: model the gap and show runway if the close slips a quarter.
Then run the whole model through a reasonableness gate. Drivers far outside 2025/26 benchmarks are a red flag to **surface, not hide**:
| Check | Reasonable band | What it catches |
| --- | --- | --- |
| **Burn multiple** (net burn ÷ net new ARR) | <1.0 elite · 1.0–1.5 healthy · 1.5–2.0 ok early | capital efficiency — in SaaS Capital's 2025 survey 56% of seed / 83% of Series C+ investors call it critical |
| **Rule of 40** (growth % + FCF margin %) | ≥ 40 | the one-number sanity test; 200% growth AND positive margin is fantasy |
| **LTV:CAC** | ≥ 3:1 (top quartile 4–6:1) | acquisition economics imported from unit-economics |
| **CAC payback** | under ~12mo SMB (2025 median worsened to ~20mo) | how long cash is underwater per customer |
| **NRR** | ≥100% floor · 104–106% typical · 120%+ best | whether the install base grows itself |
| **Subscription gross margin** | 75–80%+ | is the cost build plausible |
Most companies miss Rule of 40 — McKinsey's run of 200+ software firms (2011–2021) cleared it only ~16% of the time, and Meritech's public-SaaS median sat near 12% in early 2025 — so don't claim it casually. The full benchmark sanity-table, the driver-toggle recipe, and a worked runway-under-scenarios example are in `references/benchmarks-and-scenarios.md`.
## Anti-patterns
| Anti-pattern | Do instead | Why |
| --- | --- | --- |
| Hockey-stick revenue, one line, no downside | base / downside / upside off toggled drivers | investors stress-test the downside first; no downside reads as naive |
| Runway computed from net income / P&L | runway from cash balance ÷ net cash burn | depreciation, prepaids, AR make profit ≠ cash; cash is the survival line |
| Outputs typed in as numbers | every output a formula off the assumptions layer | a model that doesn't re-flow is a static picture, not a model |
| Costs as one flat salary lump | per-hire schedule × fully-loaded cost × start month | headcount is the biggest early cash lever; timing moves runway by weeks |
| Revenue = TAM × wishful % only | bottom-up funnel plan, TAM as the sanity-check | top-down alone hides whether you can actually acquire |
| Raise sized to "what we can get" | sized to 18–24mo post-raise + a use-of-funds split | the runway target drives the ask, not vice-versa |
| Round closes instantly in the model | model the close date; show runway if it slips a quarter | timing risk is the most common cash surprise |
| Same ARPA / churn typed in three tabs | one fact, one cell, referenced everywhere | duplicates diverge silently and the model lies |
## Verify
The model emits a checkable artifact, so `scripts/verify.sh` runs against your generated `model.csv` (or assumptions + projection pair) and asserts **shape and internal consistency** — never whether the forecast is wise:
```bash
./scripts/verify.sh --path model.csv # check one model file
./scripts/verify.sh --path build/ # scan a directory of model CSVs
./scripts/verify.sh --strict # treat warnings as failures (CI gate)
```
It checks: required columns present (month, revenue, cogs, gross_margin, opex, net_burn, ending_cash, runway_months); **cash continuity** (ending_cash[m] == starting_cash[m+1]); **gross_margin == (revenue − COGS)/revenue** recomputes; **net_burn == gross_burn − revenue** ties; runway_months ties to cash ÷ net_burn; ≥1 scenario present; and a defect lint for placeholders (`TBD`, `XX`, `#REF`, `[assumption]`) and impossible values (gross margin >100%/<−100%, negative headcount). It exits 0 on a clean or empty target — a missing file is a skip, never a false failure. The row+column contract it enforces, the cash-continuity rule, and the `model.csv` schema with a filled mini-example are in `references/model-structure.md`.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!