Spreadsheet model builder
Skill SkillMedev/document-studio/skills/spreadsheet-model-builder
Structures spreadsheet models a second analyst can audit - separated input/calc/output sheets, one-formula-per-row hygiene, built-in error checks, and a documented cover sheet. Use when someone asks "how should I structure this model", "clean up this spreadsheet before the board sees it", "why does my model break when I insert a column", or is building any forecast or calculator others will review. Do NOT use for the SaaS revenue logic itself - use revenue-modeling instead; for a full FP&A operating model use fpa-model; for personal or department budgets use budget-builder; for cash timing use cash-flow-forecast; for GAAP statement construction use financial-statement-builder.From its SKILL.md
npx -y skills add SkillMedev/document-studio --skill spreadsheet-model-builderAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
7.3 KB, ~1.5k tokens by cl100k_base, as published. Nobody here has run it
Spreadsheet Model Builder
A spreadsheet model is judged by whether a second analyst can verify it without a guided tour. The costly failure is not a wrong formula - it is a hidden wrong formula: a hardcoded number buried in cell F47, an inconsistent row that Ctrl+\ would have caught, a scenario someone ran by overtyping inputs and never restoring. This skill builds models where errors have nowhere to hide.
Operating procedure
Structure comes before formulas: retrofitting sheet separation onto a finished tangle costs more than the model did.
Step 1: gather inputs
- What question the model answers and who reviews it. A model only the builder reads can cut corners; a reviewed model cannot.
- The time axis: granularity (monthly/quarterly), horizon, and history vs forecast boundary.
- Every assumption the user already holds, each with a source. Anything unsourced gets written down anyway - labeled a guess in the note column, never silently blended with sourced numbers.
- How many scenarios are needed. Decide now: each scenario is a column on the Inputs sheet, never a separate file.
Step 2: lay out the sheet structure
Separate sheets with single roles:
- Inputs (or Assumptions) - every editable variable lives here, and only here.
- Calcs - derived values only; no raw inputs, nothing typed by hand.
- Output (or Summary) - the numbers a reader cares about, linked from Calcs.
- Data - raw imported or pasted data, never edited by hand.
- Cover - what the model does, key assumptions, what changed in the last update.
The iron rule: no hardcoded number inside a formula, anywhere. If a value might ever change, it is an input. =D12*1.05 is a bug even when 5% is correct today, because nobody will find it when it stops being correct.
Step 3: build the Inputs sheet
- Group assumptions by theme: revenue, costs, headcount, timing.
- Every row carries a clear label, units, and the basis for the number in an adjacent note column ("per signed MSA", "mgmt guess", "trailing 6-mo actual").
- Color-code inputs distinctly (blue text on white is the convention) so an auditor identifies editable cells at a glance without a legend.
- Date the assumption set on the sheet.
- Scenarios (base / upside / downside) are side-by-side columns with one live selector cell; formulas read the selected column via INDEX, so switching scenarios is one edit, and no one ever overtypes the base case.
Step 4: write formulas to hygiene rules
- One formula per row, consistent across all columns. If row 5 computes differently in column D than in column E, something is wrong. Audit with Ctrl+\ (Windows) / Cmd+\ (Mac), which highlights row inconsistencies instantly.
- Nested IFs at most two levels deep; a third level becomes a lookup table or a helper row.
- No INDIRECT - it hides dependencies from the audit trail and breaks refactoring.
- No volatile functions (NOW, RAND, OFFSET, TODAY) in calculation paths - they recalculate on every edit and make "what changed" undetectable.
- INDEX+MATCH (or XLOOKUP) over VLOOKUP - it survives column insertion; VLOOKUP's hardcoded column index is a deferred error.
- Flow left-to-right and top-to-bottom; a formula should reference cells above or to its left, not reach forward.
Step 5: add an error-check block
At the top of the Output sheet, build explicit checks that read PASS/FAIL: balance items tie out, bridges reconcile, percentages sum to 100%, no negative headcount. Format FAIL in red. A model with zero checks is not conservative - it is unverified.
Step 6: format for navigation
- Freeze the top row and leftmost label column on every sheet.
- One date format everywhere (YYYY-MM or MMM-YY).
- Text labels left-aligned, numbers right-aligned, column headers centered; consistent column widths within a section.
- Never merge cells in data ranges - merging breaks sorting, filtering, and fill-down formulas.
Step 7: write the Cover sheet
Three things, before sharing: what the model does, what the key assumptions are, and what changed in the last update. A model without a cover note is incomplete.
Worked artifact: model skeleton with real numbers
A 12-month subscription forecast, showing the layout (revenue logic itself belongs to revenue-modeling):
INPUTS Base Upside Note
Starting customers 400 400 billing system, Jan
New customers / month 30 40 trailing 3-mo avg / stretch
Monthly churn rate 2.5% 2.0% trailing 6-mo actual
ARPA ($/mo) 90 95 price list / planned increase
Scenario selector: [Base] <- one cell drives everything
CALCS (monthly columns Jan..Dec, one formula per row)
Customers BOP = prior month EOP (Jan = starting input)
New customers = Inputs new/month
Churned = Customers BOP * churn rate
Customers EOP = BOP + New - Churned Jan: 400+30-10 = 420
MRR = Customers EOP * ARPA Jan: 420*90 = $37,800
OUTPUT
Dec EOP customers: 617 Dec MRR: $55,530 ARR run-rate: $666,360
CHECKS: EOP - BOP - New + Churned = 0 each month -> PASS
Customer count never negative -> PASS
Every number in CALCS traces to a blue input; changing churn to 3.0% requires editing exactly one cell.
Deliverable
Produce a workbook with the five-sheet structure, a scenario-column Inputs sheet with units and source notes on every assumption, a Calcs section passing the Ctrl+\ consistency audit, an error-check block reading PASS on all checks, and a dated Cover sheet stating purpose, key assumptions, and last change.
Do NOT
- Do not hardcode any number in a formula - the model dies by a thousand buried constants.
- Do not run scenarios by overtyping inputs; the base case never comes back intact.
- Do not use VLOOKUP with a literal column index, INDIRECT, or volatile functions in calculation paths.
- Do not merge cells in data ranges or vary a row's formula midway across columns.
- Do not ship without an error-check block; "it looked right" is not verification.
- Do not mix sourced numbers and guesses without labeling - the note column exists so reviewers can weight each assumption.
Quality bar
The model ships only when: every editable cell is blue and lives on Inputs; Ctrl+\ finds zero inconsistent rows; every check in the error block reads PASS; every assumption carries units and a source or "guess" label; scenarios switch from one selector cell; and a second analyst can trace any Output number to its inputs in under a minute without asking the builder anything.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.