Reference · Strategy & market
Strategy & Market Models
Load when **Strategy & market**.
Part of the Financial Modeling skill · loaded on demand from SKILL.md
Four recipes: market sizing (TAM/SAM/SOM), revenue build, unit economics (LTV/CAC), pricing & elasticity. Shared mechanics in references/build-engine.md. All four are scenario-driven (Base/Bull/Bear via a scn selector and CHOOSE). These are the models that most often pair with a strategy deck or a fundraise.
Market Sizing — TAM/SAM/SOM (market-sizing)
Size a market two independent ways — top-down funnel and bottom-up units × price — and triangulate to a defensible range.
When: "market size", "TAM build", "TAM/SAM/SOM", "top-down vs bottom-up".
Tabs: Cover · Assumptions · Top-Down · Bottom-Up · Triangulation · Sensitivity (penetration × ARPU) · Checks. Named: scn, tol, SAM/SOM midpoints.
Assumptions: scn (1/2/3); top-down block (broad population, % addressable, % serviceable, target penetration %); bottom-up block (reachable accounts, ARPU/yr, adoption %, SOM share of SAM %); scenario multipliers (penetration, ARPU) pulled active with =CHOOSE(scn,...); ramp block (start penetration, steady-state penetration, years to steady state).
Top-Down (downward funnel, each row × one filter): addressable =BroadPop*%Addressable; SAM =Addressable*%Serviceable; penetration applied =TargetPen*PenMultiplier; SOM =SAM*PenetrationApplied.
Bottom-Up: SAM =ReachableAccounts*ARPU*Adoption; SOM =SAM*SOMShare; TAM (grossed up) =ReachableAccounts/%Serviceable*ARPU.
Triangulation: Top-Down vs Bottom-Up columns for TAM/SAM/SOM; gap =ABS(TD-BU)/AVERAGE(TD,BU); chosen range Low =MIN, High =MAX, Mid =AVERAGE. 5-year SOM ramp: penetration each year =StartPen+(SteadyPen-StartPen)*MIN(year/YearsToSteady,1); SOM =SAM_mid*penetration_year.
Sensitivity: two-variable Data Table, row input = ARPU, column input = penetration, corner = SOM midpoint.
Checks: TAM ≥ SAM ≥ SOM; top-down vs bottom-up within tol on SOM (PASS/FAIL); all % between 0 and 1, all sizes ≥ 0; ramp penetration never exceeds steady state.
Inputs: broad starting figure + meaning, addressable/serviceable filters, ARPU/price + reachable accounts, target penetration & SOM share, tolerance band, scenario multipliers.
Example: 500,000 businesses, 60% addressable, 50% serviceable; ARPU 2,000, 80% adoption, 150,000 reachable → bottom-up SAM ≈ 240M, top-down ≈ 300M; gap ≈ 22% inside a 30% tolerance → PASS; present 240–300M SAM with a 5y SOM ramp 2%→8%. Illustrative.
Revenue Build — driver-based forecast (revenue-build)
Build revenue bottom-up from a customer/units roll-forward (beginning, adds, churn, ending) rather than a single growth %.
When: "bottom-up revenue", "ARR build", "driver-based forecast", "customer roll-forward".
Tabs: Cover · Drivers · Revenue Build · Summary · Sensitivity (adds × churn) · Checks. Named: scn, ending-ARR cell.
Drivers: scn; starting customers, ARPU/period, monthly churn %; acquisition either marketing spend + CAC (adds = spend/CAC) or funnel (leads × conversion); scenario multipliers for adds and churn pulled active with =CHOOSE(scn,...); optional product-line price × volume block.
Revenue Build (period headers once, referenced everywhere; absolute refs to drivers so rows fill):
- Beginning
=PriorEnding(period 1=StartingCustomers). - New adds
=Spend/CAC*AddsMultor=Leads*Conversion*AddsMult. - Churned
=Beginning*Churn*ChurnMult. - Ending
=Beginning+Adds-Churned. - Revenue
=Ending*ARPU(or=SUMPRODUCT(price_range,volume_range)for product lines); ARR=Revenue*12for monthly subscription.
Summary: annual revenue =SUM(year's monthly cells); YoY =ThisYear/PriorYear-1; ending customers per year; active scenario =CHOOSE(scn,"Base","Bull","Bear").
Sensitivity: Data Table, row input = churn, column input = an adds driver, corner = ending ARR.
Checks: roll-forward Ending=Beginning+Adds-Churned every period; continuity Beginning_t=Ending_{t-1}; YoY within a sane cap/floor; customers & revenue ≥ 0; churn between 0 and 1.
Inputs: starting customers/units + ARPU/price, acquisition mechanism, churn + period length, scenario multipliers, horizon.
Example: start 1,000, ARPU 50/mo, churn 3%/mo; spend 100,000, CAC 500 → 200 adds/mo; month-1 churn ≈ 30, ending ≈ 1,170; over 36 months revenue ramps; Bull = 1.2x adds, 0.8x churn. Illustrative.
Unit Economics — LTV/CAC & cohorts (unit-economics)
Is a customer worth more than it costs to acquire: CAC, contribution, retention, LTV (two ways), LTV/CAC, payback, backed by a cohort grid.
When: "unit economics", "LTV/CAC", "CAC payback", "cohort retention".
Tabs: Cover · Assumptions · Cohorts (retention grid) · Unit Economics · LTV-CAC · Checks. Named: scn, tol, CAC, retention cell.
Assumptions: scn; S&M spend/period, new customers; ARPU/mo, gross margin %; monthly churn % (retention =1-churn); discount rate/mo; scenario multipliers (churn, ARPU) pulled active.
Unit Economics: CAC =Spend/NewCustomers; effective ARPU =ARPU*ARPUMult; gross profit/customer-month = effARPU*GM%; monthly retention =1-Churn*ChurnMult; CAC payback (months) =CAC/GrossProfitPerMonth (or cohort-aware: cumulative GP per cohort month until it crosses CAC); avg lifetime (months) =1/(Churn*ChurnMult).
Cohorts: month headers 0..N across, cohort labels down; retained % month 0 = 1, later =prior*MonthlyRetention; active customers =retained%*NewCustomers; revenue =active*effARPU; contribution =revenue*GM%.
LTV-CAC: closed-form LTV =ARPU*GM%/(Churn*ChurnMult); discounted-cohort LTV =SUMPRODUCT(contribution_per_customer_row, 1/(1+DiscRate)^month_index); LTV/CAC =DiscountedLTV/CAC; payback echo.
Checks: closed-form vs discounted LTV within tol; retention monotonically non-increasing within each cohort; payback positive & within a cap; same ARPU/margin/churn used in grid and ratios; margins & retention 0–1; CAC & LTV ≥ 0. Guard churn = 0 (#DIV/0!).
Inputs: S&M spend + new customers (same period), ARPU/mo + GM%, churn + discount rate, # cohorts & months, scenario multipliers + tolerance.
Example: S&M 200,000, 400 customers → CAC 500; ARPU 50, 80% GM → 40 GP/mo, payback 12.5 mo; churn 4%/mo → 25-mo lifetime, LTV ≈ 1,000, LTV/CAC ≈ 2.0x. Illustrative.
Pricing Model — price-volume & elasticity (pricing-model)
Choose a price by modeling how volume responds, then find the contribution-maximizing price across a grid.
When: "pricing model", "price-volume curve", "elasticity analysis", "tiered pricing".
Tabs: Cover · Assumptions · Price-Volume (grid) · Tiers (optional) · Sensitivity (price × elasticity) · Checks. Named: scn, price-grid range, contribution range.
Assumptions: scn; reference price P0, reference volume Q0; elasticity (negative, e.g. −1.5); variable cost/unit; price grid min/max/step; scenario multipliers (elasticity, Q0) pulled active.
Price-Volume: price grid A =min, then =prior+step until >max; volume (constant-elasticity) =Q0*(price/P0)^elasticity — or linear =Q0*(1+elasticity*(price-P0)/P0) floored at 0; revenue =price*volume; unit margin =price-VarCost; contribution =unit margin*volume; optimal price =INDEX(price_col, MATCH(MAX(contrib_col), contrib_col, 0)); max contribution =MAX(contrib_col).
Tiers (optional): per tier price, mix % (sum 100%), total volume; tier volume =mix%*total; tier contribution =volume*(price-VarCost); blended price =SUMPRODUCT(price,volume)/SUM(volume); total tiered contribution =SUM.
Sensitivity: Data Table, row input = elasticity, column input = a single price cell feeding contribution, corner = contribution at the chosen price.
Checks: volume ≥ 0 across the grid; clear interior contribution peak (not pinned to a grid edge — widen the grid if it fails); positive margin at the optimal price; tier mix = 100%; elasticity negative. Guard P0 > 0 (the power form misbehaves at zero).
Inputs: reference price & volume (a known demand point), elasticity (negative) & variable cost, grid min/max/step, optional tier prices/mix/volume, scenario multipliers.
Example: P0 100, Q0 10,000, elasticity −1.5, cost 40; at 100 → contribution 600,000; sweeping 60–160 by 5, contribution peaks at an interior price (~120) where unit-margin gain offsets volume loss; a 70%@90 / 30%@140 tier mix → blended 105. Illustrative.