Financial Modeling skill for Codex
Runway you can trace back to one input. Codex builds startup financial models the way an FP&A lead would: one assumptions tab, revenue and headcount builds that match how the company sells, a monthly P&L and cash flow, and a single scenario switch. Every output traces to a labelled input, hardcodes inside formulas get flagged, and a checks tab proves cash and the balance sheet tie before anyone sees runway.
curl -fsSL codexskills.dev/install.sh \ | sh -s -- financial-modeling Installs to ~/.agents/skills/financial-modeling/ for every project on this machine.
curl -fsSL codexskills.dev/cli.mjs -o codex-skills.mjsnode codex-skills.mjs install financial-modeling The CLI also searches, updates and removes skills. Run it with no arguments to pick from a list. Needs Node 20.12+.
curl -fsSL codexskills.dev/install.sh \ | sh -s -- --project financial-modeling Installs to .agents/skills/financial-modeling/ in the current repository. Commit it and everyone who runs Codex there gets it.
curl -fsSLO codexskills.dev/downloads/financial-modeling.zipunzip -o financial-modeling.zip -d ~/.agents/skills/ The archive holds the skill folder with its generated agents/openai.yaml. Unzip into .agents/skills/ to scope it to a repo.
& ([scriptblock]::Create((irm codexskills.dev/install.ps1))) financial-modeling PowerShell 5.1 or 7. Installs to %USERPROFILE%\.agents\skills\. Add -Project for the current repo.
104-line POSIX script. No sudo, no telemetry. Read install.sh
Use it in Codex
Start a prompt with $financial-modeling, or pick it from /skills.
You can also just describe the task: Codex reads the description below and loads the playbook when your request matches.
What Codex reads before loading it
Builds and audits driver-based startup financial models in Excel or Google Sheets - assumptions tab, revenue and headcount builds, monthly P&L, cash flow, runway and scenario switches - with no hardcoded numbers inside formulas and a balance check that proves the model ties. Use when asked for a startup financial model, a 3-statement model, a runway or burn forecast, a fundraising model for investors, or to review and fix an existing forecast spreadsheet.
Use it when
- You need a monthly P&L, cash flow and runway forecast for a startup
- Preparing a model to share with investors during a fundraise
- An inherited spreadsheet forecast has to be checked before a board meeting
- Leadership wants base, downside and upside cases from one workbook
Use something else when
- You only need to track spending against an approved budget: use budget-tracking
- You need SaaS metric definitions and cohort maths rather than a forecast: use saas-metrics
- The task is formula syntax or a single broken lookup: use excel-formulas
How to check the result
The Checks tab returns TRUE for every month: balance sheet balances, cash ties between statements, no error cells, and the first forecast month lines up with the last month of actuals.
The mistake it prevents
Treating annual prepaid contracts as monthly revenue and cash at the same time, which distorts both burn and runway.
A good startup model is one where every output traces back to a labelled input, a founder can change one assumption and watch runway move, and the cash at the bottom of the cash flow equals the cash on the balance sheet every month. Precision is not the goal; transparent, defensible assumptions are.
This skill builds models; it does not give investment, tax or accounting advice. Say so when the model will be used for fundraising, debt covenants, audits or tax filings, and recommend an accountant review the statements before they leave the company.
Before building
- Ask, or infer from files, the purpose: runway planning, fundraising, budget-setting or board reporting. Purpose decides horizon and granularity:
| Purpose | Horizon | Granularity | Statements |
|---|---|---|---|
| Runway / burn | 18-24 months | Monthly | P&L + cash flow |
| Seed / Series A raise | 36 months (+2 annual years) | Monthly, annual roll-up | P&L, cash flow, simple balance sheet |
| Annual budget | 12 months | Monthly | P&L by department + cash |
| Later-stage / debt | 3-5 years | Monthly then quarterly | Full three statements |
- Collect actuals: last 6-12 months of P&L (export from QuickBooks or Xero as CSV), bank balance, current headcount with salaries and start dates, pricing, and customer or subscription counts. Model forward from real numbers, never from zero.
- Check the repo or folder for an existing model,
AGENTS.mdnotes on file formats, and whether the user works in Excel or Google Sheets. Do not mix: Google Sheets lacks some Excel functions (and vice versa), so write formulas for the target. - If the model is code-generated (openpyxl, ExcelJS), plan to recalculate it in a real engine before trusting outputs. openpyxl writes formulas but never computes them.
Workbook structure
One direction of flow: inputs on the left/top, calculations in the middle, outputs at the end. Never reference a cell on a later tab from an assumption.
| Tab | Contains |
|---|---|
Cover | Purpose, version, date, author, scenario selected, key outputs (runway, cash low point) |
Assumptions | Every input, one per row, with unit, source and owner columns |
Revenue | Customer/volume build -> bookings -> revenue (recognised) -> collections |
Headcount | One row per role: department, start month, salary, benefits load |
OpEx | Non-headcount costs by department, driven by % of revenue, per-head or fixed |
PL | Monthly income statement, linked only from builds |
CashFlow | Net income adjusted for working capital, capex, financing |
BalanceSheet | Cash, AR, AP, deferred revenue, equity; check row |
Actuals | Imported historical data, untouched, for variance |
Checks | Every integrity check in one place, summing to a single TRUE/FALSE |
Formatting conventions (state them on the Cover tab):
- Blue font = hardcoded input. Black = formula. Green = link from another tab.
- Time runs left to right, one column per month, same columns on every calc tab so column F is always the same month everywhere.
- A row header in column A, units in column B, totals or start values in column C.
Revenue build patterns
Pick the build that matches how the business actually sells:
| Model | Driver chain |
|---|---|
| Self-serve SaaS | Visitors x signup rate x paid conversion -> new customers; existing x (1 - monthly churn); x ARPA |
| Sales-led SaaS | Reps (ramped) x quota attainment -> new ARR; + expansion - churn; MRR = ARR / 12 |
| Marketplace | GMV = orders x AOV; revenue = GMV x take rate |
| Transactional / e-commerce | Sessions x conversion x AOV; COGS per order; return rate |
| Services | Billable heads x utilisation x hours x rate |
Example SaaS rows (Excel, months in columns F onward, inputs on Assumptions):
New customers F12 =ROUND(F10 * Assumptions!$C$8 * Assumptions!$C$9, 0)
Churned F13 =ROUND(E14 * Assumptions!$C$10, 0)
Ending cust. F14 =E14 + F12 - F13
MRR F16 =F14 * Assumptions!$C$11
Rules for revenue:
- Separate bookings (contract signed), billings (invoice sent), revenue (recognised over the service period) and collections (cash in). Annual prepaid contracts create deferred revenue and front-loaded cash; monthly ones do not.
- Ramp new sales reps (for example 0%, 25%, 50%, 75%, 100% over five months) instead of assuming full quota from day one.
- Growth assumptions expressed as month-over-month rates compound fast; show the implied annual figure next to each so nobody types 15% MoM by accident.
Headcount and costs
- One row per person or planned hire, with start month; cost formula multiplies salary
/ 12 by a benefits and payroll-tax load (commonly 1.15-1.30 in the US; ask for the
real figure) and by a flag
=IF(F$3>=$D20,1,0)for months after start. - Headcount usually drives 60-80% of early-stage spend. Get it right before polishing anything else.
- Per-head costs (software seats, equipment, recruiting fees) link to headcount counts, not to hardcoded totals.
- COGS for SaaS: hosting, third-party APIs, payment processing, support staff. Keep it separate from OpEx so gross margin is honest.
Cash, runway and scenarios
Net burn = -(ending cash - starting cash) for months where cash falls
Runway (months) = ending cash / average net burn of the last 3 months
Cash low point = MIN(cash row) and the month it occurs (INDEX/MATCH or XLOOKUP)
Scenario switch: put Scenario (1 = base, 2 = downside, 3 = upside) on Assumptions,
keep three columns of values per driver, and select with
=CHOOSE($C$3, D8, E8, F8) or =INDEX(D8:F8, $C$3). One switch drives the whole model;
never maintain three copies of the workbook.
Downside cases worth building by default: revenue 30% below plan with costs unchanged, a fundraise that lands six months late, and churn doubled.
Integrity checks
Put each on Checks and show the combined result on Cover:
- Balance sheet balances every month:
=ROUND(Assets - Liabilities - Equity, 2) = 0. - Cash on
CashFlowequals cash onBalanceSheetevery month. - Revenue on
PLequals the sum fromRevenue; headcount cost equalsHeadcounttotal. - No errors anywhere:
=SUMPRODUCT(--ISERROR(PL!F5:AO80)) = 0. - Actuals months tie to the accounting export within rounding.
Building with code
When generating the workbook programmatically, write formulas as strings so the model stays live, then recalculate with LibreOffice before reading results:
from openpyxl import Workbook
from openpyxl.styles import Font
wb = Workbook()
a = wb.active; a.title = "Assumptions"
a["A8"], a["C8"] = "Signup rate", 0.03
a["C8"].font = Font(color="0000FF") # blue = input
pl = wb.create_sheet("PL")
pl["F12"] = "=ROUND(F10*Assumptions!$C$8,0)"
wb.save("model.xlsx")
# Round-trip through LibreOffice so formulas get cached values (needs LibreOffice installed)
soffice --headless --convert-to xlsx --outdir recalculated model.xlsx
python3 -c "from openpyxl import load_workbook as l; print(l('recalculated/model.xlsx', data_only=True)['PL']['F12'].value)"
If the check prints None, nothing was calculated: open the file in Excel or Sheets
instead and report that outputs are unverified until then.
For cell styling, named ranges and charts, see the xlsx-spreadsheets skill. For formula debugging, see excel-formulas.
Auditing an existing model
- Trace three key outputs (revenue in month 24, ending cash, runway) back to inputs
- Search for hardcoded numbers inside formulas (
=F10*1.05,+25000) - Check that every row uses the same formula across all months (a broken pattern in one column is the most common silent error)
- Confirm units: monthly vs annual rates, thousands vs units, percent stored as 5 vs 0.05
- Look for circular references (interest on average cash is a classic); break them with prior-month balances instead of enabling iterative calculation
- Compare first forecast month to last actual month for implausible jumps
- Sanity-check ratios against stage: gross margin, S&M as % of revenue, revenue per employee
Gotchas
- Mixing cash and accrual: a 12-month prepaid deal is 1/12 revenue per month but full cash up front. Models that show both as revenue overstate runway or understate it.
- Hiring plans that start every role on the 1st of the next month make burn jump in steps that do not happen; stagger by realistic recruiting time.
- Churn applied to new customers in their first month double-counts; apply it to the opening balance.
- Percent growth applied to a small base produces absurd year-3 numbers. Cap or switch to capacity-driven drivers (reps, marketing spend) after year one.
- Taxes, VAT/sales tax and payroll timing are jurisdiction-specific; flag them as assumptions for the accountant rather than inventing rates.
Output contract
Deliver the workbook plus a short note:
## Model summary - <company>, <scenario>, v<n> (<date>)
- Starting cash: $X (as of <date>); runway: N months; cash low point: $Y in <month>
- Revenue: $A ARR at month 12, $B at month 24; key drivers: <3 bullets with values>
- Headcount: N now -> M at month 24; burn peaks at $Z/month in <month>
- Checks: all passing | <list failures>
- Assumptions needing confirmation: <list, each with owner>
- Not modelled: <taxes, debt, FX, ...> - review with an accountant before external use What the zip contains
SKILL.md plus the interface file below. Nothing runs on install.
agents/openai.yaml
Gives the Codex app a display name, a one-line description and a starter prompt for this skill.
interface:
display_name: "Financial Modeling"
short_description: "Runway you can trace back to one input"
default_prompt: "$financial-modeling Build a 36-month financial model for our seed raise from these QuickBooks exports and the hiring plan" About this skill
Written and maintained by the Codex Skills editors to the same editorial standard as every skill here: a selective description, a real workflow, known pitfalls and a way to verify the work. First published , last updated . MIT licensed. Something wrong or out of date? Tell us.