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*AddsMult or =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*12 for 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.