GameBooth — Operating System

Canonical source: model/ in the repo. Generated 2026-10-12 11:22 UTC. Aggregates and pseudonymous IDs only.

$1.28
contribution per review
inf
coaches to break-even
no financing line
cumulative cash turns positive (18-mo horizon)

How this model changes

This page is generated — nothing on it is editable, and the retired Google Sheet is not the model anymore. Every number here derives from exactly one input surface: model/assumptions.yaml in the repo.

To change an assumption: edit assumptions.yaml → the regression tests in model/test_model.py run (13 fixtures pin the math itself; a wrong model that renders is worse than one that doesn't) → commit → CI re-renders and re-deploys this page. The change arrives with a diff, an author, and a timestamp — a model change is a code change, reviewable and revertable like any other.

Two kinds of values never need a hand edit: measured drivers overlay automatically from the weekly prod snapshot (ops/weekly/*.json) when their sample clears the n≥5 floor, and computed figures (everything not chip- tagged below) follow from the inputs. If a number on this page looks wrong, the fix is in the yaml or in model/model.py — never in this page.

Drivers & assumptions — the honesty column

InputValueBasisNote
starting_active_coaches1✓ actual
Danny
coach_monthly_churn0.00◐ measured (n=5)
parents_invited_per_coach_per_month0.00◐ measured (n=6)
invite_to_first_purchase_conversion0.35● guess insufficient (n=1)
parent_monthly_retention0.00◐ measured (n=6)
Highest-leverage unknown. Enters as 1/(1-r).
reviews_per_active_parent_per_month2.00● guess insufficient (n=3)
price_per_review13.64◐ measured (n=11)
PLAN ticket, not a decree: $20 is the recommended list price for coaches onboarded from Sept 2026 (Danny + Derek grandfathered at $15) — the modeled average as the mix shifts. Decision: decisions/2026-08-20-season-one-plan.md, partially superseding 2026-08-19-price-per-review.md. The measured lens keeps showing the real average ($15.00, n=7, weekly overlay) until reality moves — plan vs measured divergence here is honest and intentional.
base_take_rate0.20◆ decision
premium_take_rate0.28◆ decision
free_reviews_per_coach_month0◆ decision
SET TO 0 2026-08-20 (season-one plan, decisions/2026-08-20-season-one-plan.md) — the allowance cost ~$9/coach/mo in waived take and was the single cheapest profitability lever. Danny + Derek conversation still owed; their reaction is a reversal condition.
matched_share0.00✓ actual
No platform_matched transactions exist yet. The projection uses the RAMP below instead — a plan, not an estimate (sheet Model row 22).
coach_reference_hourly_rate120▢ canvas
minutes_per_async_clip5▢ canvas
minutes_per_sync_session60▢ canvas
stripe_pct_of_gmv0.03▤ vendor
stripe_fixed_per_txn0.30▤ vendor
infra_cost_per_review0.75● guess
coach_onboarding_cost40● guess
fixed_monthly_costs250● guess
one_time_legal6000● guess
Founder-absorbed startup capital — excluded from the operating lines, visible on the card.
activity[1.0, 1.0, 1.0, 0.7, 0.4, 0.3, 0.3, 0.4, 1.0, 1.0, 1.0, 1.0]● guess
ontario_aaa_players3978▢ canvas
ontario_rep_players18414▢ canvas
na_u14_18_players292687▢ canvas
na_supplemental_spend_tam117848450▢ canvas
na_platform_revenue_tam3814765▢ canvas
wallet_budget_aaa_annual2000▢ canvas
wallet_budget_a_annual500▢ canvas

Measured overlays this build:

  • reviews_per_active_parent_per_month: REFUSED — insufficient (n=3); assumption kept
  • parents_invited_per_coach_per_month: promoted to measured
  • invite_to_first_purchase_conversion: REFUSED — insufficient (n=1); assumption kept
  • parent_monthly_retention: promoted to measured
  • coach_monthly_churn: promoted to measured
  • price_per_review: promoted to measured

Changed since previous snapshot:

  • reviews_per_active_parent_per_month: 1.33 (n=6) → 1.33 (n=3) [2026-10-05 → 2026-10-12]
  • parents_invited_per_coach_per_month: 0.20 (n=5) → 0.00 (n=6) [2026-10-05 → 2026-10-12]
  • invite_to_first_purchase_conversion: 6.00 (n=1) → 2.00 (n=1) [2026-10-05 → 2026-10-12]
  • price_per_review: 15.00 (n=8) → 13.64 (n=11) [2026-10-05 → 2026-10-12]

Sensitivity — plausible ranges (never ±% flexing)

Each bar answers: if this driver alone moved across its plausible range (everything else held at base), where does contribution per coach per month land? range of outcomes today's base case $0 — left of it, each coach LOSES the platform money
Invites / coach / month ◐ measured n=6 swing $9.87
at 4 → $3.59 · at base 0 → $0.00 · at 15 → $13.47
Half lever, half guess — onboarding prompts and invite tooling can move it, so it is partly under our control.
Parent monthly retention ◐ measured n=6 swing $0.00
at 45% → $0.00 · at base 0% → $0.00 · at 85% → $0.00
Convex: enters as 1/(1-r), so the upside compounds. The band is this wide because there is zero evidence — the widest-and-least-known driver on the board, and the only one whose improvement accelerates.
Reviews / active parent / month ● guess swing $0.00
at 1 → $0.00 · at base 2 → $0.00 · at 3.5 → $0.00
The frequency thesis of the whole business. Below ~1.5 the unit economics stop working at any scale.
Invite → first purchase ● guess swing $0.00
at 20% → $0.00 · at base 35% → $0.00 · at 55% → $0.00
Cheapest driver on the board to resolve — measurable on the first ten invites. (Early beta cohort: 0.667 on n=6, above this whole range.)
Price per review (USD) ◐ measured n=11 swing $0.00
at $10 → $0.00 · at base $13.64 → $0.00 · at $30 → $0.00
A decision, not a guess. Better than linear on contribution because Stripe's $0.30 fixed fee does not scale with price.
Base take rate ◆ decision swing $0.00
at 15% → $0.00 · at base 20% → $0.00 · at 25% → $0.00
A decision, and the LEAST consequential thing on this list. You could argue about take rate for a week and change the outcome by a fraction of what one honest retention measurement would.

Sorted by swing, descending — and the priority rule is the biggest swing that is also a ● guess: a decision can be argued in a meeting, a guess can only be resolved by measurement. Ranges are explicit plausible bounds in assumptions.yaml, never a ±% flex.

What-if — steady state, live

Sliders explore; they change nothing. A real change is a commit to assumptions.yaml. Held fixed while you slide:

free_reviews_per_coach_month 0 ◆ decisionstripe_pct_of_gmv 0.03 ▤ vendorstripe_fixed_per_txn 0.30 ▤ vendorinfra_cost_per_review 0.75 ● guessfixed_monthly_costs 250 ● guess

Driver trends — weekly snapshots

Reviews / active parent / month
1.33 (n=3)
Invites / coach / month
0 (n=6)
Invite → first purchase
2 (n=1)
Parent monthly retention
0 (n=6)
Coach monthly churn
0 (n=5)
Price per review (USD)
13.64 (n=11)

One small multiple per driver — different scales never share an axis. Series are sparse: the weekly export began 2026-08-18.

18-month projection

Every column below is COMPUTED from these assumptions (hover a chip for its note; change any of them via assumptions.yaml, never here):

parent_monthly_retention 0.00 ◐ measured n=6parents_invited_per_coach_per_month 0.00 ◐ measured n=6invite_to_first_purchase_conversion 0.35 ● guessreviews_per_active_parent_per_month 2.00 ● guesscoach_monthly_churn 0.00 ◐ measured n=5price_per_review 13.64 ◐ measured n=11base_take_rate 0.20 ◆ decisionpremium_take_rate 0.28 ◆ decisionfree_reviews_per_coach_month 0 ◆ decisionstripe_pct_of_gmv 0.03 ▤ vendorstripe_fixed_per_txn 0.30 ▤ vendorinfra_cost_per_review 0.75 ● guessfixed_monthly_costs 250 ● guesscoach_onboarding_cost 40 ● guess

Plus two plans (decisions, not estimates — projection: in the yaml): coaches added per month (shown as +n in the Coaches column) and the platform-matched share ramp (0 → 18% from month 10, which is what lifts the blended take rate late in the table).

CONVENTION: reviews are driven off ending parents — optimistic in a growing book. Cumulative cash from a zero starting balance.

Pessimistic — every unknown at its plausible low
−$5,155.89
cash at M18 · cash-positive: never
Measured today
−$5,580.00
cash at M18 · cash-positive: never
Optimistic — every unknown at its plausible high
$28,564.97
cash at M18 · cash-positive: M3
$0.00$28,564.97−$5,580.00M1M6M12M18

uncertainty band (the four unknown drivers — retention, invites, frequency, conversion — ALL at their plausible lows or highs simultaneously; a compound floor and ceiling, not forecasts) · measured today · plan (yaml values, no measured overlay) · price and take rate are decisions, held identical in every scenario.

Measured vs. plan vs. needed

DriverMeasured todayPlanNeeded
Parent monthly retention0.0% (measured n=6)70.0%64.8%
Invites / coach / month0.00 (measured n=6)8.007.19
Reviews / active parent / month2.00 (guess)2.001.80
Invite → first purchase35.0% (guess)35.0%31.4%
Cash at month 18−$5,580.00$630.79target: ≥ $0
Cash-positive monthneverM17target: by M18

"Needed" = the value of that ONE driver that turns cash positive by M18 holding every other driver at plan. Measured values carry their current sample-size and seasonality limits — check each driver's basis badge before treating a red line as fate.

⚑ Startup capital — founder-absorbed and excluded from every line above, kept visible on purpose: $6,000.00 one time legal. Reclassified 2026-08-20; Alex (CFO) can reverse — see decisions/2026-08-20-startup-capital-excluded-from-operating-model.md.

Month-by-month detail — measured today

MoSeason Coaches ParentsReviews BillableRevenue AbsorbedFixed Onboard NetCash
1 Sep×14.00 +30.000.000.00$0.00$0.00$250.00$120.00−$370.00−$370.00
2 Oct×17.00 +30.000.000.00$0.00$0.00$250.00$120.00−$370.00−$740.00
3 Nov×19.00 +20.000.000.00$0.00$0.00$250.00$80.00−$330.00−$1,070.00
4 Dec×111.00 +20.000.000.00$0.00$0.00$250.00$80.00−$330.00−$1,400.00
5 Jan×113.00 +20.000.000.00$0.00$0.00$250.00$80.00−$330.00−$1,730.00
6 Feb×114.00 +10.000.000.00$0.00$0.00$250.00$40.00−$290.00−$2,020.00
7 Mar×115.00 +10.000.000.00$0.00$0.00$250.00$40.00−$290.00−$2,310.00
8 Apr×0.715.000.000.000.00$0.00$0.00$250.00—−$250.00−$2,560.00
9 May×0.415.000.000.000.00$0.00$0.00$250.00—−$250.00−$2,810.00
10 Jun×0.315.000.000.000.00$0.00$0.00$250.00—−$250.00−$3,060.00
11 Jul×0.315.000.000.000.00$0.00$0.00$250.00—−$250.00−$3,310.00
12 Aug×0.418.00 +30.000.000.00$0.00$0.00$250.00$120.00−$370.00−$3,680.00
13 Sep×121.00 +30.000.000.00$0.00$0.00$250.00$120.00−$370.00−$4,050.00
14 Oct×123.00 +20.000.000.00$0.00$0.00$250.00$80.00−$330.00−$4,380.00
15 Nov×125.00 +20.000.000.00$0.00$0.00$250.00$80.00−$330.00−$4,710.00
16 Dec×126.00 +10.000.000.00$0.00$0.00$250.00$40.00−$290.00−$5,000.00
17 Jan×127.00 +10.000.000.00$0.00$0.00$250.00$40.00−$290.00−$5,290.00
18 Feb×128.00 +10.000.000.00$0.00$0.00$250.00$40.00−$290.00−$5,580.00

Market & penetration

NA supplemental-coaching spend (U14-18 hockey)
$118M / yr
assumed per-tier budgets — canvas-grade
Platform take-rate ceiling, hockey vertical
$3.81M ARR
20% take · assumed velocities · before down-tier/US/soccer expansion
The Ontario wedge
3,978 AAA
inside a 18,414-player rep pool (AAA+AA+A, U14-18)
Parentsvs. AAA wedgevs. rep pool
Break-even book — at plan drivers53 parents1.3% of Ontario AAA0.3% of the Ontario rep pool
Break-even book — at measured todaynan parentsnan% of Ontario AAAnan% of the Ontario rep pool
Projection at M180 parents0.0% of Ontario AAA0.0% of the Ontario rep pool

Wallet sanity: the plan asks an active parent for $364.00/year (frequency × price × season) — against assumed family budgets of $500.00 (A-tier) to $2,000.00 (AAA) for supplemental coaching.

Market numbers are canvas-grade — registration counts are sourced (USA Hockey / Hockey Canada), but the dollar TAMs inherit ASSUMED per-tier budgets and velocities. Canonical source + caveats: strategy/market-analysis.md.

Unit economics — per review

price_per_review 13.64 ◐ measured n=11base_take_rate 0.20 ◆ decisionstripe_pct_of_gmv 0.03 ▤ vendorstripe_fixed_per_txn 0.30 ▤ vendorinfra_cost_per_review 0.75 ● guess
$2.73Platform take$0.70Stripe absorbed$0.75Infra$1.28Contribution

The free allowance is NOT free to the platform: allowance reviews earn zero take but still incur the Stripe + infra legs above. Coach pitch: async net $130.94/effective-hour = 1.09× sync net; throughput 12.00× — publish the net multiple only.

Raise gates

GateThresholdBase caseStatus
active_coaches56✓ passing
coaches_retained_90d3—◌ no data yet
total_paying_parents50—◌ no data yet
reviews_per_active_parent_per_month2.502.00✗ BASE CASE FAILS
month3_parent_retention0.40—◌ no data yet
monthly_gmv3000—◌ no data yet
platform_matched_transactions10✗ BASE CASE FAILS
consecutive_months_positive_contribution2—◌ no data yet
legal_posture_counsel_signoff1—◌ no data yet

Open issues snapshot as of 2026-10-12 11:22 UTC — the tracker itself (GitHub Issues) is canonical; this tab is a render. P0 = blocks the beta · P1 = before break-even · P2 = before raise · P3 = someday.

TrackP0P1P2P3Total
driver121620452
obligation5117—23
table-stakes223432593

Drivers with open work: coach-churn, conversion, dc, frequency, g2r, infra-cost, invites, matched-premium, retention. ● no open work: price — an unworked driver is a modeling claim nobody is testing.

P0 — 19 open

#TitleLabelsMilestone
#309Two north stars (G2R + Delivering Coaches) + pods — rollout indexdriver · platform · g2rM1 First Cohort
#307Game-window parameter + submission-lag distribution in the Friday reportdriver · platform · g2rM1 First Cohort
#306"Which game?" picker in the send flow (replaces ops tagging of sched_game_id)driver · parent · g2rM1 First Cohort
#305Miss-reason prompt: one question when a game's window closes with no submissiondriver · parent · g2rM1 First Cohort
#304Reviewer name + "covering for <primary> this week" on backup reviewsdriver · parent · g2rM1 First Cohort
#303Pod-scoped backup access to the athlete record, loggeddriver · records · dcM1 First Cohort
#302SLA void: full refund on missed delivery SLA + no-transfer-after-void guarddriver · payments · dcM1 First Cohort
#301Clip queue routing: primary first, backup on claim-window expiry or awaydriver · matching · dcM1 First Cohort
#300platform_params table with per-row snapshotting (claim window, SLA, game window)driver · platform · dcM1 First Cohort
#299Coach away ranges (exams, playoffs)driver · coach · dcM1 First Cohort
#298Pods: pod entity, membership, and a primary coach per familydriver · matching · dcM1 First Cohort
#292Decision record: G2R + Delivering Coaches north stars, pods, and the driver label settable-stakes · platformM1 First Cohort
#280Referral/admin invite: admit a parent with no coach, then platform-match (parent→parent + concierge path)driver · matching · matched-premiumM1 First Cohort
#205Coach home V1.4: Queue rowstable-stakes · coachM1 First Cohort
#103Coach agreementobligation · coach · needs-counselM1 First Cohort
#102Privacy Policyobligation · platform · needs-counselM1 First Cohort
#101Terms of Serviceobligation · platform · needs-counselM1 First Cohort
#88COPPA: consent record storage and audit trailobligation · platform · needs-counselM1 First Cohort
#87COPPA: verifiable parental consent flowobligation · parent · needs-counselM1 First Cohort

P1 — 50 open

#TitleLabelsMilestone
#332Parent opening a review link sees "Couldn't load this review — Unauthorized"table-stakes · parent · feedbackM1 First Cohort
#331iPhone fullscreen review playback is broken — overhaul the in-page fallback (and decide the playback architecture)table-stakes · review · feedbackM1 First Cohort
#324Coaches can edit a note on an already-delivered review (pause-point PUT has no draft check)table-stakes · review—
#319Coach Studio: first-frame marker only pauses once, and clips freeze at the loop point in Chrometable-stakes · reviewM1 First Cohort
#317Free first review signup bonus — GameBooth pays the coach's rate (PARKED)driver · payments · conversion—
#314Coach can still fetch a clip's signed playback URL for unpaid or cancelled requestsobligation · reviewM1 First Cohort
#313Stripe webhook advances a request without checking payment_status (async payment methods)obligation · paymentsM1 First Cohort
#312Refunds and disputes made outside the app don't block the coach transferobligation · paymentsM1 First Cohort
#308DC continuity: coaches counted in consecutive 4-week windowsdriver · platform · dcM1 First Cohort
#266Game In Review: jersey-only anonymization for non-subject minorsobligation · platformM2 Break-even
#257Coach invite link forces 'create new player' — parents can't attach an existing player to a second coachdriver · parent · invites · feedbackM1 First Cohort
#233Coach home roadmap — V1 Your bench (epic)table-stakes · coachM1 First Cohort
#208Coach home V1.7: First-day state (V1)table-stakes · coachM1 First Cohort
#207Coach home V1.6: Sent to familytable-stakes · coachM1 First Cohort
#206Coach home V1.5: Kids on your benchtable-stakes · coachM1 First Cohort
#204Coach home V1.3: Up next cardtable-stakes · coachM1 First Cohort
#203Coach home V1.2: Impact countstable-stakes · coachM1 First Cohort
#201Coach onboarding console — Phase 3: metrics + bulk actions + polishtable-stakes · coachM2 Break-even
#200Coach onboarding console — Phase 2: pipeline progress + nudgestable-stakes · coachM1 First Cohort
#174Post-payment Stripe redirect lands parents on the old pages.dev origin → logged-out "Invitation only" (VIEWER_SITE_URL not cut over)table-stakes · paymentsM1 First Cohort
#173Prod clip uploads broke on gamebooth.ca — R2 clips bucket CORS not updated in the domain migration (smoke blind spot)table-stakes · captureM1 First Cohort
#171Coach-page finished-review view renders sub-optimally on iPhonetable-stakes · review · feedback—
#169Coach waitlist is write-only — nothing surfaces a /for-coaches signupdriver · coach · invitesM2 Break-even
#158Guard against deploying prod from a stale main (silent worker-revert class)table-stakes · platformM1 First Cohort
#143Public coach profile page (gamebooth.ca/<coach-handle>) — satisfies Stripe Connect's website requirement and gives coaches a shareable presencedriver · coach · coach-churn · feedbackM2 Break-even
#141Instrument and test the invite→first-purchase conversion funneldriver · parent · conversionM2 Break-even
#119iOS/iPad device-test pass on the live parent and coach surfacestable-stakes · platformM1 First Cohort
#118Telestrator finger-draw on iPad scrolls the screen / exits fullscreentable-stakes · review · feedbackM1 First Cohort
#115Resilient clip uploads — chunked/resumable transfer that survives flaky home networkstable-stakes · capture · feedbackM2 Break-even
#114Upload accepts non-video files silently — VidSwap/Pixellot ZIP renamed .mp4 played as a black screen for the coachtable-stakes · capture · feedbackM2 Break-even
#104Confirm agent-of-payee exemption posture with counselobligation · payments · needs-counselM2 Break-even
#98No-contact policy between coach and athlete outside the platformobligation · platform · needs-counselM2 Break-even
#97SafeSport-aligned policy and coach agreementobligation · coach · needs-counselM2 Break-even
#96Coach background checks (Checkr or Sterling)obligation · coachM1 First Cohort
#91COPPA: separate opt-in for session-follow-up captureobligation · payments · needs-counselM2 Break-even
#90COPPA: parental access, review and deletion rightsobligation · parent · needs-counselM2 Break-even
#84Automated backups and restore testtable-stakes · platformM2 Break-even
#82Admin consoletable-stakes · platformM2 Break-even
#81Per-review cost instrumentationdriver · platform · infra-costM1 First Cohort
#77SPIKE: will a roster-struggling coach pay 25-30% on a matched player?driver · matching · matched-premium · spikeM2 Break-even
#76SPIKE: where does the first unattached parent come from?driver · matching · matched-premium · spikeM2 Break-even
#71Refunds, disputes and chargebacksobligation · paymentsM2 Break-even
#70Pre-authorized standing arrangement for session follow-upsdriver · payments · retentionM2 Break-even
#63Coach vetting rubricdriver · coach · retention · canvas-blockerM2 Break-even
#61Coach earnings transparency: publish net-of-take figuresdriver · coach · coach-churnM1 First Cohort
#59Coach dashboard: queue, earnings, rosterdriver · coach · coach-churnM2 Break-even
#43Review quality rubric encoded in the toolingdriver · review · retention · canvas-blockerM2 Break-even
#40GameBooth-handled video cuttingdriver · review · coach-churnM2 Break-even
#32Clip trimming before submissiondriver · capture · infra-costM2 Break-even
#26Duplicate athlete record detection and mergetable-stakes · recordsM2 Break-even

P2 — 70 open

#TitleLabelsMilestone
#334DELETE /api/clips/:id fails with a foreign-key error for any clip that ever had a review requesttable-stakes · parentM2 Break-even
#333JoyClip iPhone fullscreen: apply the #331 safe-area frame sizing (scroll lock already shared)table-stakes · reviewM1 First Cohort
#326Telemetry: record which narration clip errored on parent playback, and whytable-stakes · review · feedbackM3 Raise-ready
#325Coach waitlist email check accepts display-name addresses and runs its regex before the length captable-stakes · platform—
#320Short coach-note narrations silently dropped on Chrome OS + Bluetooth headphonestable-stakes · review · feedbackM3 Raise-ready
#315Worker CI: voice-clone test files flake intermittently (coach-voice-clone, voice-archive, voice-clone-cleanup)table-stakes · platform—
#310Dev tier emails real coaches — gate non-prod email to an allowlisttable-stakes · platform—
#271GIR: send picker should only offer coaches connected to this player (F1)driver · parent · conversion · feedbackM3 Raise-ready
#269Revisit & streamline the Send to Coach UX (Game In Review)driver · parent · conversion · feedbackM3 Raise-ready
#264Game In Review: monetization — subscription (report) + per-clip reviewsdriver · payments · retentionM3 Raise-ready
#258Game In Review: AI-suggested, player-confirmed game review (epic)driver · review · frequencyM3 Raise-ready
#252Parent home roadmap — V4 Personal touches (epic)table-stakes · parentM2 Break-even
#251Parent home roadmap — V3 The story, when you look (epic)table-stakes · parentM2 Break-even
#250Parent home roadmap — V2 What they want to see next (epic)table-stakes · parentM2 Break-even
#249Coach AI Assistant (A1–A5) — the supply side for both home roadmaps (epic)table-stakes · reviewM2 Break-even
#248S1: Next-clip ask — shared coach↔parent loop (epic)driver · coachM2 Break-even
#247Shared services across parent & coach homes — roadmap alignment (index)table-stakes · platformM2 Break-even
#246Harden GET /parents/:id/reviews: allowlist response columns (drop rr.* Stripe/transfer IDs)table-stakes · parent—
#243Goalie coaches may need a distinct Parent User Journey (clip composition), cross-sportdriver · parent · coach-churn · spike, feedback—
#236Coach home roadmap — V4 Families write back (epic)table-stakes · coachM2 Break-even
#235Coach home roadmap — V3 Know your kids (epic)table-stakes · coachM2 Break-even
#234Coach home roadmap — V2 Momentum (epic)table-stakes · coachM2 Break-even
#226Coach home V4.6: First-day state (V4)table-stakes · coachM2 Break-even
#225Coach home V4.5: Notes on kid cards + drawertable-stakes · coachM2 Break-even
#224Coach home V4.4: New-note notificationtable-stakes · coachM2 Break-even
#223Coach home V4.3: "From the families" paneltable-stakes · coachM2 Break-even
#222Coach home V4.2: Notes servicetable-stakes · coachM2 Break-even
#221Coach home V4.1: Thank-you note box (parent app)table-stakes · coachM2 Break-even
#220Coach home V3.5: First-day state (V3)table-stakes · coachM2 Break-even
#219Coach home V3.4: Kid history drawertable-stakes · coachM2 Break-even
#218Coach home V3.3: Returning-family contexttable-stakes · coachM2 Break-even
#217Coach home V3.2: Kid cards on the benchtable-stakes · coachM2 Break-even
#216Coach home V3.1: Per-kid history querytable-stakes · coachM2 Break-even
#215Coach home V2.7: First-day state (V2)table-stakes · coachM2 Break-even
#214Coach home V2.6: "Watched N x" on sent reviewstable-stakes · coachM2 Break-even
#213Coach home V2.5: Reviews-per-week charttable-stakes · coachM2 Break-even
#212Coach home V2.4: Monthly count + avg turnaroundtable-stakes · coachM2 Break-even
#211Coach home V2.3: Weekly streaktable-stakes · coachM2 Break-even
#210Coach home V2.2: Earnings celltable-stakes · coachM2 Break-even
#209Coach home V2.1: Coach stats servicetable-stakes · coachM2 Break-even
#187Joy reel: note-derived keyword tags + filter/sortdriver · player · frequency · spike, feedback—
#156Canadian parents charged in USD when their coach's Stripe account is US-based (cross-border FX friction)driver · payments · retention · feedback—
#146Synthetic prod showcase account with a hard boundary against real data (external-demo surface)table-stakes · platform—
#138Escape/strip user-controlled text in authenticated outbound emailstable-stakes · platform—
#136Automated coverage for review-agent voice/conversation behavior (smoke-gate agent revisions)table-stakes · review—
#135Flaky FE test suite under parallel workers — checkout/redirect tests (SendClipToCoach) intermittently failtable-stakes · platform—
#133Deep-dive audit of review-agent behavior and the notes-ownership modeltable-stakes · review · spike, feedbackM2 Break-even
#127Mobile bottom nav drops the Account item on /my-clipstable-stakes · parentM1 First Cohort
#126Concierge test — parent sends 2-3 clips, coach picks the teaching momentdriver · review · frequency · spike, feedbackM1 First Cohort
#124Subscription option instead of pay-per-clipdriver · payments · frequency · feedbackM2 Break-even
#121Audit Stripe test-mode webhook endpointsobligation · paymentsM2 Break-even
#120Ship the built management/joy surface (player sharing)driver · player · retention · needs-counselM2 Break-even
#117UX design review of the coach review studio (with a UX expert)table-stakes · review · spike, feedbackM2 Break-even
#100Content moderation on uploaded videoobligation · capture · needs-counselM3 Raise-ready
#95AI training-data consent capture (13+ only)obligation · platform · needs-counselM3 Raise-ready
#94Biometric data written policy and retention scheduleobligation · platform · needs-counselM3 Raise-ready
#93Biometric consent (BIPA-style) for pose and velocity dataobligation · platform · needs-counselM3 Raise-ready
#92Data retention policy and automated enforcementobligation · platform · needs-counselM3 Raise-ready
#86Weekly driver export to the operating modeldriver · platform · retentionM3 Raise-ready
#75Concierge matching: first match by handdriver · matching · matched-premiumM3 Raise-ready
#73Tax reporting for coaches (1099 / T4A)obligation · payments · needs-counselM3 Raise-ready
#69Source-differentiated take ratedriver · payments · matched-premiumM3 Raise-ready
#64Coach offboarding and record handlingtable-stakes · coachM3 Raise-ready
#60Coach-branded low-friction modedriver · coach · coach-churnM3 Raise-ready
#55Parent-facing progress framing (loss-frame, carefully)driver · parent · retentionM3 Raise-ready
#49Athlete progress view (player-framed)driver · player · retentionM3 Raise-ready
#45Review revision or follow-up question from parentdriver · review · frequencyM3 Raise-ready
#33Coach in-session capture (the neuro-mirror flow)driver · capture · invitesM1 First Cohort
#29Longitudinal progress view across reviewsdriver · records · retentionM3 Raise-ready
#27Athlete record export (portability)table-stakes · recordsM3 Raise-ready

P3 — 29 open

#TitleLabelsMilestone
#316Coach home V5.1b: game results (final scores) on the coach hometable-stakes · coachM3 Raise-ready
#275GIR S4 home-grouping polish — file rename, type dedup, cancelled-send edge, label checktable-stakes · recordsM3 Raise-ready
#274GIR S3 coach-side polish — tests, lane-split header, flag visibility, orphan-idx guardtable-stakes · coachM3 Raise-ready
#273GIR: send & finish-payment rough edges (F3, F4, F5)table-stakes · payments · feedbackM3 Raise-ready
#272GIR: clip video-file (shared R2 object) lifecycle tidy — index + report-delete cleanup (F6, F7)table-stakes · recordsM3 Raise-ready
#268Game In Review poster: label the key-moment time to match the thumbnail framedriver · review · frequency—
#265Game In Review: conversion — data-prompt + coach pay-to-reveal nudgedriver · coach · conversionM3 Raise-ready
#256Team Plan — sponsored roster video + opt-in Game Report/Film Room + team view [needs scoping]table-stakes · coachM3 Raise-ready
#255Film Room — subscription (Game Report/game + two-way thread + monthly recap) [needs scoping]table-stakes · parentM3 Raise-ready
#253Parent home roadmap — V5 Game week (north star) (epic)table-stakes · parentM3 Raise-ready
#239Coach Home V1 cleanup: dedup + coverage follow-upstable-stakes · coach—
#237Coach home roadmap — V5 Game week (north star) (epic)table-stakes · coachM3 Raise-ready
#232Coach home V5.6: First-day state (V5)table-stakes · coachM3 Raise-ready
#231Coach home V5.5: Focus mode (optional)table-stakes · coachM3 Raise-ready
#230Coach home V5.4: Game context on Up nexttable-stakes · coachM3 Raise-ready
#229Coach home V5.3: Game week on the benchtable-stakes · coachM3 Raise-ready
#197/coach/join invite lost if sessionStorage clears mid-OAuthtable-stakes · coach—
#196Harden coach-invite redeem edge casestable-stakes · coach—
#195Per-onboarder invite rate-limit / cooldown before widening can_onboardtable-stakes · coach—
#182Render the real mark-the-player marker in playback (finish #123; placeholder removed in #181)table-stakes · player—
#175Worker returns synthesized_with_voice as 0/1, not boolean (React {0 && …} footgun)table-stakes · review—
#167Pronunciation row is tight on mobile; 'playing' state is subtle (PlayerForm)table-stakes · player—
#166Drop raw Cartesia error text from the pronunciation-preview 502 bodytable-stakes · review—
#165Rate-limit the pronunciation preview / suggestion / coach TTS endpointstable-stakes · review—
#163demo-test seeded review doesn't persist coach notes (draft never saves)table-stakes · review—
#149Broadcast/pre-flight agent _api methods don't send EVENT_RELAY_SECRET — 401 after #148 game-endpoint gatingtable-stakes · capture—
#125Coach "office hours" — group sync Q&A sessionsdriver · review · frequency · spike, feedback—
#122Checkout-abandon polish follow-ups (grouped)table-stakes · payments—
#34Mobile capture from the bench or rinksidedriver · capture · frequencyM2 Break-even

Touch-priority roster as of 2026-10-12. Names appear only for signed-in founders; everyone else sees handles.

ParentFlagsCoachPaid/Deliv./CxlLast purchaseLast deliveryLast contact
P-2952f6f8SILENT ONE & DONE CADENCE DUEC-763bfd8b1/1/02026-08-032026-08-042026-08-20
P-c2dc0179SILENT CADENCE DUEC-763bfd8b3/3/02026-08-072026-08-072026-09-11
P-494a7944SILENT CADENCE DUEC-763bfd8b C-763bfd8b2/1/12026-08-142026-08-162026-08-20
P-7d3431ecSILENT ONE & DONE CADENCE DUEC-763bfd8b1/1/02026-08-122026-08-142026-08-19
P-f1c95a7dSILENT ONE & DONE CADENCE DUEC-763bfd8b1/1/02026-08-132026-08-142026-08-20
P-1840925aNEWC-763bfd8b3/3/02026-10-052026-10-05never
P-c4005031NEVER CONTACTED—0/0/0——never
P-64d03653NEVER CONTACTEDC-763bfd8b0/0/0——never
P-4719cb7dCADENCE DUEC-763bfd8b C-572598212/1/02026-10-072026-08-192026-08-19
P-0aa9b668OKC-572598211/1/02026-10-072026-10-092026-10-07

Coaches who opted in via /for-coaches, newest first. Names and emails load only for signed-in founders behind Cloudflare Access.

NameEmailReferralNoteSigned up
Loading… (sign in behind Access to view)

Latest: 2026-10-12-digest-007. Names resolve for signed-in founders.

Weekly Digest 007

Built from ops/weekly/2026-10-05.json vs ops/weekly/2026-10-12.json (the two newest dated snapshots — latest.json duplicates 10-12), GitHub issue history for 2026-10-05 → 2026-10-12, and decisions/ entries dated this week (one: 2026-10-07-gir-cloud-run-minors-video-implied-consent.md).

1. Drivers that moved

Diff of the drivers block, 2026-10-05.json → 2026-10-12.json:

| Driver (JSON key) | 10-05 | 10-12 | Change | |---|---|---|---| | reviews_per_active_parent_per_month | 1.333 (n=6, month 2026-08) | 1.333 (n=3, month 2026-10) | value coincidentally unchanged — n and month both moved, not like-for-like | | parents_invited_per_coach_per_month | 0.2 (n=5, month 2026-09) | 0 (n=6, month 2026-10) | dropped to zero; n moved 5→6 | | invite_to_first_purchase_conversion | 6 (n=1, month 2026-08) | 2 (n=1, month 2026-10) | dropped 6→2; n held at 1 — single-sample, see caution below | | parent_monthly_retention | 0 (n=6, month null) | 0 (n=6, month null) | none | | coach_monthly_churn | 0 (n=5, month 2026-10) | 0 (n=5, month 2026-10) | none | | price_per_review.usd | 15.00 (n=8) | 13.64 (n=11) | dropped; n +3 | | price_per_review.cad | null (n=0) | 8.00 (n=1) | first CAD-denominated review ever recorded |

A real week of volume, after several flat ones. volume.active_parents went 0 → 3, volume.reviews_delivered_in_period 0 → 4, volume.gmv.usd $0 → $30, volume.gmv.cad $0 → $8. All four deliveries trace to two roster parents: P-1840925a (3 reviews, reviews_in_period: 3) and P-0aa9b668 (1 review, joined this period via origin: platform_matched). That reconciles the price_per_review split above: 3 USD reviews pulled the USD average from $15.00 to $13.64 (n 8→11), and the 1 CAD review is the first entry ever in that leg (n 0→1).

volume.blended_take_rate.cad reads 43.87%, roughly double the 20% base_take_rate decision (model/assumptions.yaml) — on a single CAD transaction (n=1) this is most likely a small-n/fixed-fee artifact on an $8 ticket rather than a real rate change, but it is new this week and worth the export owner's eye before a second CAD data point confirms or dissolves it.

parent_monthly_retention holds at 0% — the same flat zero first measured last week (cohorts[0], 2026-08 cohort, still m1_retained: 0). A new 2026-10 cohort (cohorts[1], size 2 — P-1840925a and P-0aa9b668) has appeared but is too new for a month-1 read (m1_retained: null). Nothing this week contradicts last week's first real retention data point.

parents_invited_per_coach_per_month fell to zero — n moved 5→6 as the newest coach (C-41eb4e06, joined 2026-10-07) rolled into the window, and all six active coaches show invites_sent_in_period: 0. Read next to the volume jump above: this week's growth came from an existing relationship repurchasing and a platform_matched parent, not from a coach-driven invite — worth noting since driver:invites is the official name for this lever and it hit its floor in the same week volume moved.

invite_to_first_purchase_conversion moved 6→2 on n=1 both weeks — same single-sample caution digest 006 raised elsewhere: this is one invite's outcome changing, not a trend.

Coach-disappearance anomaly (digests 003–006) — still unresolved, 5th week flagged. C-0f4b1805 remains absent from coaches/parents/roster in 2026-10-12.json. No new contact_evidence or decisions/ entry explains it.

Guess-basis baseline — now 7 weeks unowned. Checked directly against model/assumptions.yaml (grep -n "owner:" returns nothing in the file): coach_monthly_churn, parents_invited_per_coach_per_month, invite_to_first_purchase_conversion, parent_monthly_retention, and reviews_per_active_parent_per_month are all still basis: guess with no owner anywhere in the file. Digest 002 (2026-08-24) started this clock; it is now 7 calendar weeks with no movement toward measured/actual, or an assigned owner, on any of the five.

A driver-taxonomy change is already live in the tracker, ahead of its own decision record. This week's issues introduce two labels absent from CLAUDE.md's canonical driver list (driver:retention, driver:invites, driver:frequency, driver:conversion, driver:infra-cost, driver:coach-churn, driver:matched-premium, driver:price): driver:g2r (8 issues this week) and driver:dc (9 issues this week) — see §3. The decision record meant to formalize this (#292, "G2R + Delivering Coaches north stars, pods, and the driver label set") is still open. Carried into §4.

2. Evidence logged

One new contact_evidence row since digest 006:

| Handle | Date | Channel | Driver tags | Direction | |---|---|---|---|---| | P-0aa9b668 | 2026-10-07 | email | (none) | unclear — no driver tag attached |

This is the parent's first-ever contact, logged the same day they joined and purchased (roster[].joined: 2026-10-07, last_purchase: 2026-10-07). No driver_tags were attached, so there is no basis to say which driver it pushed — stating that plainly rather than guessing. No other contact activity this week: none of the six parents named on digest 006's touch list received a logged touch (see §5).

3. Backlog shipped and started

Issue history for 2026-10-05 → 2026-10-12 (GitHub closed:/created: search against the period boundary).

Shipped (closed this week): 26 issues — a sharp reversal from digest 006's zero. By track: 18 track:driver (all carrying a driver:x tag — no hygiene gap), 7 track:table-stakes, 1 track:obligation.

| # | Title | Track / driver | |---|---|---| | 329 | iOS first-tap stall on silent audio primer | table-stakes, P1, surface:review | | 327 | Parent playback: one audio hiccup flips review to captions (sticky audioError) | table-stakes, P1, surface:review, feedback | | 318 | Family signup on /families ahead of #280 invites | driver:conversion, P1, surface:parent | | 311 | Coach can submit (and be transferred for) an unpaid review request | track:obligation, P0, surface:payments | | 297 | Integrity checks that fail the Friday report loudly | driver:dc, P0, surface:platform | | 296 | Canonical G2R + Delivering Coaches queries and the Friday report script | driver:g2r, P0, surface:platform | | 295 | Make connection origin truly immutable + append-only origin_corrections | driver:g2r, P0, surface:records | | 294 | Coach state machine with dated vetted_at, coach_type, capacity_per_week | driver:dc, P0, surface:coach | | 293 | Paid-submission + delivery timestamps on review_requests | driver:g2r, P0, surface:payments | | 291 | Viewer CI: intermittent vitest worker crash | table-stakes, P2, surface:platform | | 288 | GIR undiscoverable in /my-clips until a clip is sent | table-stakes, P1, surface:records, feedback | | 286 | GIR 'Quiet' pill on a recommended 'good' shift (classifier split-brain) | table-stakes, P1, surface:records, feedback | | 284 | GIR report crashes on a quiet shift (null clock) | table-stakes, P1, surface:records, feedback | | 277 | Parent review-playback fixes (note-resume freeze, play/pause lock, re-watch) | driver:retention, P1, surface:review/parent, feedback | | 276 | GIR: no parent entry point to START a Game In Review | driver:frequency, P2, surface:capture | | 263 | GIR: home-surface game grouping | table-stakes, P2, surface:platform | | 262 | GIR: coach side — grouped bench request | driver:coach-churn, P2, surface:coach | | 261 | GIR: confirm + send 1–N clips to a coach | driver:conversion, P2, surface:parent | | 260 | GIR: free report — ingest → parse → candidacy → view | driver:frequency, P2, surface:review | | 259 | GIR: verify coded-export shapes (Hudl/Instat variants) | driver:frequency, P2, surface:capture, spike | | 242 | Cap review clip length for goalie coaches | driver:coach-churn, P2, surface:capture, feedback | | 228 | Coach home V5.2: Link each kid to a team | driver:g2r, P0, surface:coach/records | | 227 | League schedules as games (G2R denominator) | driver:g2r, P0, surface:records | | 78 | Coach roster-need expression | driver:matched-premium, P3, surface:matching | | 74 | Coach-absorbed billing fallback | driver:price, P2, surface:payments | | 68 | Free-review allowance: first N per coach per month | driver:price, P1, surface:payments, proposed |

Note: #276's closure (2026-10-07) lines up with the same-day decision decisions/2026-10-07-gir-cloud-run-minors-video-implied-consent.md, which unblocked the prod enablement that #276 depended on.

Started (opened this week): 50 issues — the largest weekly intake in the digest's history, in four clusters:

  1. "Two north stars (G2R + Delivering Coaches) + pods" epic — 18 issues (#292–#309; #309 is the rollout index, #292 its decision record). All P0 except #308 (P1). Five opened and closed the same day (#293–#297); 13 remain open, including #292 and #309 themselves. Source of the new driver:dc/driver:g2r labels flagged in §1.
  2. Payments/obligation hardening — 4 issues, all track:obligation: #311 (closed same day), #312 (refunds/disputes outside the app don't block coach transfer), #313 (Stripe webhook advances a request without checking payment_status), #314 (coach can still fetch a signed playback URL for unpaid/cancelled requests) — #312–#314 open.
  3. Live-beta playback/platform hardening — 15 issues: #291, #310, #315, #316, #319, #320, #324, #325, #326, #327, #329, #331, #332, #333, #334. Mostly track:table-stakes; five carry feedback (#320, #326, #327, #331, #332), one is a plain bug (#319). #327 and #329 closed same day; the rest (13) are open, including #331 ("iPhone fullscreen review playback is broken — ... decide the playback architecture"), which reads as the open-ended parent of several of the others (#324, #325, #326, #332, #333, #334 all touch the same playback surface).
  4. Game In Review polish + parent funnel — 13 issues: #271–#277, #280, #284, #286, #288, #317, #318. Six closed same day (#276, #277, #284, #286, #288, #318); seven remain open, including #317 ("Free first review signup bonus", explicitly PARKED).

4. Decisions needed

One decisions/ entry dated this week — decisions/2026-10-07-gir-cloud-run-minors-video-implied-consent.md: Matt enabled GIR self-serve ingest on prod Cloud Run, keeping the cheap hygiene controls (no retention, no PII in logs, least-privilege R2) and dropping the dedicated-GCP-project + counsel-review gate, reasoning that the implied-consent source feeds (Hudl/InStat/LiveBarn) already cover consent. This is a decision made, not one needed — noted here because it unblocked #276 (§3). Reversal condition: parents objecting to third-party processing of their child's video.

Carrying forward digest 006's five open items, elapsed weeks updated:

  • Price-per-review derivation unconfirmed (decisions/2026-08-19-price-per-review.md) — carried, 7 weeks. Matt still needs to confirm or complete the $120/hr → $15 derivation.
  • Season-one plan adopted without Alex, Danny, or Derek (decisions/2026-08-20-season-one-plan.md) — carried, 7 weeks. The free-allowance removal and $20 September default still need those three conversations.
  • Market analysis + seasonality layer (decisions/2026-08-20-market-analysis-and-seasonality.md) — carried, 7 weeks. Still flagged for Alex's review at onboarding, still unreviewed.
  • Startup capital exclusion (decisions/2026-08-20-startup-capital-excluded-from-operating-model.md) — carried, 7 weeks. Reversal condition is explicitly Alex's to invoke as CFO; still open.
  • Residual Tier-1 confirmation on incorporation (decisions/2026-09-09-incorporation-in-place-no-coach-reonboard.md) — carried, 4 weeks. Still need Stripe/counsel confirmation that the sole-prop → incorporated swap doesn't trigger a platform re-KYC that pauses payouts, and still need to resolve the jurisdiction conflict the decision file itself flags.

New this week:

  • G2R + Delivering Coaches north-star adoption — decision record still open while its labels already ship. driver:dc/driver:g2r are live on 23 issues opened or closed this week (§1, §3) — in the Friday report script, the coach state machine, and schema changes already merged — but the decision record meant to formalize the two north stars and the driver label set (#292) is still open, and neither label appears in CLAUDE.md's canonical driver list. Flagging now rather than waiting for it to compound the way the other five already have.

Six open decisions, five of them now 7 weeks unmoved.

5. Touch points this week

From the roster block (2026-10-12.json). Ordering by primary_flag (SILENT, ONE_AND_DONE, NEW, NEVER_CONTACTED, CADENCE_DUE): 5 SILENT parents plus 1 NEW fill the cap of six — 3 cut (P-4719cb7d, CADENCE_DUE; P-c4005031 and P-64d03653, both NEVER_CONTACTED).

| Handle | Why (primary_flag) | Owner | Suggested opener | |---|---|---|---| | P-2952f6f8 | SILENT | Alex | Last purchase 8/3, one delivered review 8/4, last contacted 8/20 — now 69 days since purchase, no follow-up logged since. | | P-c2dc0179 | SILENT | Alex | Most paid-up parent on record — 3 paid, 3 delivered, all by 8/7 — contacted 9/11, now 65 days since purchase, no follow-up since that call. | | P-494a7944 | SILENT | Alex | 2 paid, 1 cancelled, last delivery 8/16, last touched 8/20 — now 58 days since purchase; the cancellation plus continued silence is still worth a direct check-in. | | P-7d3431ec | SILENT | Alex | One delivered review 8/14, last touched 8/19 — now 60 days since purchase, no repeat purchase since. | | P-f1c95a7d | SILENT | Alex | One delivered review 8/14, last touched 8/20 — now 59 days since purchase, no repeat purchase since. | | P-1840925a | NEW | C-763bfd8b | Joined 10/1, 3 paid + 3 delivered by 10/5 — the most active parent in the beta by volume — and never contacted (last_contact_at: null). Worth a check-in while the experience is fresh, routed through their own coach. |

Follow-through on digest 006's touch list (6 handles): the one new contact_evidence row this week (§2) was for P-0aa9b668, who was not on that list — so zero of digest 006's six were followed up on.

  • P-2952f6f8 — no new contact since 8/20. Fifth week running.
  • P-c2dc0179 — no new contact since 9/11. Fourth week running.
  • P-494a7944 — no new contact since 8/20. Fifth week running.
  • P-7d3431ec — no new contact since 8/19. Fifth week running.
  • P-f1c95a7d — no new contact since 8/20. Fifth week running.
  • P-4719cb7d — no new contact since 8/19, still zero — but this parent repurchased on 10/7 (last_purchase moved 8/18 → 10/7) entirely without any outreach from the team. The cadence gap closed itself through the parent's own action, not through follow-up; the contact miss continues even though the commercial outcome improved. Dropped off this week's capped list as a result (now CADENCE_DUE, not SILENT — see cut list above).

Net: five of digest 006's six parents have now gone five weeks (four for P-c2dc0179) with zero logged contact; the sixth repurchased on their own initiative with the outreach gap still unaddressed. This is the fifth consecutive digest naming this same gap.

6. Mid-week pulse

No pulse entries this week.

Archive (5)
  • 2026-10-05-digest-006.md
  • 2026-09-28-digest-005.md
  • 2026-09-21-digest-004.md
  • 2026-09-14-digest-003.md
  • 2026-08-24-digest-002.md

Asset A · owner both CEOs · reviewed quarterly · canonical in-repo since 2026-08-19 (edit model/canvas.yaml, never this page) · Stress-tested draft. Tensions are left visible by design.

The spine — two moats with opposite timing

GameBooth has two moats with opposite timing. The wedge (frictionless async-review tooling) gets coaches in the door but is replicable by a flat-fee SaaS competitor. The wall (matching unattached parent demand to coaches) cannot be replicated by any tooling competitor — but it is structurally absent during bootstrap, because Tier 1 coaches arrive with their own rosters and need no matching.

Everything below is an attempt to survive the danger window — the period where you are Tier-1-only, matching isn't live, and the only thing you offer is a tool a third party could clone. The business is durable if and only if it reaches liquidity (matching switched on) before that window closes.

PhaseMatching live?Take rateWhat take rate IS in this phase
BootstrapnoFlat 20%Not a margin to protect. Take rate held flat; frequency comes from the product being genuinely more profitable per hour and ~12x higher throughput, not from a price bribe.
Post-liquidityyes20% base / 25–30% on platform-matchedA finder's premium on demand GameBooth manufactured. Blended take RISES as matched share grows. Take-rate expansion = proof the moat switched on.
MODEL CORRECTION The bootstrap break-even is understated by roughly 4x. The 37-review figure counts $4.00 of take against $148 of cost. Absorbing Stripe (2.9% + $0.30) and ~$0.75 infra makes contribution $2.37 not $4.00; against an honest $250/mo fixed base and the free-review allowance, break-even is ~145 total reviews/month, about 7.8 active coaches. (Superseded again at the $15 price by the in-repo model: ~242 total reviews, ~13 coaches — see the Model tab.)
MODEL CORRECTION The "~2x effective rate" compares GROSS async to NET sync. Net of the 20% take a coach banks $192/effective-hour vs $120 — 1.6x, not 2x. The ~12x throughput claim is correct and was always the stronger argument. Correct the coach pitch before a coach does the arithmetic in front of you.
REJECTED DECISION A volume/frequency discount was explicitly REJECTED from the default plan: it lowers take exactly as a coach grows, trains the highest-GMV coaches to expect a falling rate, and rewards the least-locked-in cohort. Held in reserve only as a stall-breaker if frequency collapses.

The nine blocks

Key Partners

  • Coaches (supply) — the binding constraint on the whole business. Not a vendor: the scarce input.
  • Stripe Connect (Express, agent-of-payee posture, separate charges/transfers).
  • Infra: Cloudflare (Workers/D1/R2), LiveKit.
  • AI/voice: Cartesia (TTS), Deepgram/Gemini (STT). Voice clone is a commodity API call — explicitly NOT a moat.
  • Trust & Safety vendors: Checkr/Sterling, SafeSport framework.
  • Outside legal counsel — THREE distinct consent items tracked separately: (i) pre-authorized session-follow-up capture/billing; (ii) COPPA training-data consent (13+ scope, banked early); (iii) biometric consent (BIPA-style, age-independent).

Key Activities

Ranked by strategic load.

  • 1. Manufacturing unattached parent demand (so matching has fuel) — the activity that switches the moat on. Least-built, most important.
  • 2. Matching players to coaches by need — the wall.
  • 3. Two capture modes: parent-uploads-footage → async review; coach-captures-in-session → next-day neuro-mirror follow-up (the physical→digital bridge; fastest path to T1 density + record population).
  • 4. Async-review + AI-coaching-notes tooling — the wedge. Treat as acquisition, not moat; absorbed via the two-mode architecture rather than ceded.
  • 5. CV/AI augmentation flywheel — augment the coach, never replace. Pose estimation + velocity trends, longitudinal via kid_id. Trains on 13+ only; needs its own biometric consent.
  • 6. Provenance instrumentation (origin-stamping) — makes the revenue model and two-mode architecture enforceable.
  • 7. Trust & Safety / coach vetting — table stakes given minors; where the anti-toxicity promise must be operationalized.

Key Resources

ASSEMBLED BY THE PORT The source doc has no Key Resources section; these are its own statements about substrate and scarce inputs, gathered from §1, §6 and §7 for the canvas grid. Review and edit like any other block.
  • The kid_id athlete record — the SUBSTRATE everything runs on (explicitly not a moat: portable by design; the rails, not the train).
  • Coach supply — the scarce input and binding constraint.
  • Provenance (immutable origin) — what makes premium pricing enforceable.
  • The expert-annotated video corpus (future, 13+ only) — the only asset that compounds with scale, if deliberately built.

Value Propositions

Full detail in Asset B (the Value Prop tab).

  • To coaches: leverage now → demand later. Async wins on effective hourly earnings AND ~12x calendar throughput; GameBooth absorbs the video-cutting/prep sync forces on the coach. Post-liquidity: players they cannot source themselves.
  • To parents: a coached, annotated clip of their child, plus a continuous athlete record. Sold as edge; intended to retain on reassurance/development.
  • To players: a record that travels with them across teams and seasons.
MODEL CORRECTION Honest coach numbers: $192/effective-hour net (1.6x sync) and 12x throughput. Lead with throughput.

Customer Relationships

The central question: does GameBooth OWN the relationship, or merely HOST it? Hosted relationships disintermediate; owned ones don't.

  • Tier 1 (coach-owned, hosted): fragile. Mitigation is SPEED TO LIQUIDITY, not retention mechanics. Accept some anchor coaches may leave once they've lent credibility — treat as a paid marketing channel if they do.
  • Tier 2 (platform-owned): durable. The coach cannot operate without the player flow GameBooth provides.
  • Parents: today bonded to the COACH (they buy edge). Long-run intent: bond them to the SYSTEM (record, progress continuity) so retention survives a coach's departure. Weakest of the lock-in mechanisms — acknowledged.

Channels

  • Bootstrap: Tier 1 coaches as distribution — their existing clients are the first parents. Coach credibility IS the channel.
  • Organic: parent-to-parent loop (unproven).
  • Post-liquidity: GameBooth's own matching surface becomes a channel TO coaches (delivering players) — the channel that creates the wall.
ASSUMPTION That unattached parent demand will materialise to FUEL matching. Every bootstrap parent arrives attached to a coach. Where the first unattached parent comes from is the single biggest open question in the model.

Customer Segments

Three parties, distinct roles. Do not collapse them.

  • Players — the protagonist, never a customer. Data subject only. The kid_id athlete record is the SUBSTRATE the business runs on — necessary rails, not a moat. Never an account holder, never a payer.
  • Parents — the buyer. Account holder, payer, consent-giver (COPPA). What they BUY today is competitive edge; what GameBooth INTENDS to sell is reassurance + development. That gap is a strategic problem, not a copy problem (see Asset B).
  • Coaches Tier 1 — roster-bringers. Arrive with their own players; relationship is coach-owned. Most important to credibility, least defensible. The bootstrap cohort and the disintermediation risk.
  • Coaches Tier 2 — player-receivers. GameBooth matches players to them; relationship is platform-created. This is where the wall exists. Only possible once liquidity exists.

Cost Structure

  • Two engineering cost profiles — do not conflate: product-eng (founder-absorbed pre-PMF) vs sustaining-eng (volume-driven). The step-change in burn is at the Phase 1→2 boundary.
  • Coach-leveraged model: $1M net revenue does not require a large team. The constraint is coach supply, never headcount efficiency.
  • Platform absorbs Stripe processing fees so coach net is a clean 80% (on billable reviews).
MODEL CORRECTION The ~90% contribution margin is a distant ceiling, not a near-term fact: contribution today is ~59% of take / ~12% of GMV at a $20 ticket, and Stripe's $0.30 fixed fee is regressive — the strongest argument for bundling. "Clean 80%" is billable-only; blended payout runs 83–91% of GMV across the first 18 months.

Revenue Streams

Three streams, distinct by who initiates and who pays. Merchant of record stays consistent: separate charges and transfers, agent-of-payee posture.

  • (i) Parent-initiated async reviews — platform fee per review; GameBooth holds the full fee, pays the coach 80% on delivery. Bootstrap flat 20%; post-liquidity 20% coach_invited / 25–30% platform_matched. Blended take is an OUTPUT of sourcing mix, not an input.
  • (ii) Session-follow-up reviews (coach-captured neuro-mirror) — a sequence: free first clip (CAC) → pre-authorized standing arrangement (primary; parents resent a clip that APPEARED, not one they AUTHORIZED) → coach-absorbed fallback (coach bundles into in-person price, pays the fee from margin).
  • (iii) Future: matched-player premium — the 25–30%. Distinct because the revenue RISES as the moat switches on.
  • Coach to Own: the first N reviews per coach each month carry no platform fee (free at the BOTTOM, monthly reset — explicitly NOT a cap; free-at-the-top asymptotes take to zero on the best coaches. Free-at-the-bottom is acquisition; free-at-the-top is suicide).
  • One platform, two modes, one record (the anti-CoachClip judo): a marketplace mode and a low-friction coach-branded mode that FEELS standalone — both writing to the same kid_id record. The low-friction mode is the acquisition channel for the record, not a separate revenue line.
MODEL CORRECTION The allowance is not free to you: at 3/coach/month it removes 54% of billable volume in month 1 and ~16% at steady state, while Stripe and infra are still paid on every free review. Budget it.
BLOCKER Load-bearing twice: source-differentiated pricing AND the two-mode architecture both require kid_id to carry an immutable, system-assigned origin field, stamped server-side at creation on EVERY creation path. Coaches will attempt to claim matched players as their own — expected. Self-reported provenance is dead on arrival. [SHIPPED: origin is live, trigger-enforced, in prod.]
FOR COUNSEL The pre-authorized arrangement is standing authorization for ongoing third-party capture and processing of a minor's video, not just a Stripe mandate. Counsel question: one consent or two, and does the 2025 amendments' separate-opt-in logic apply?

The defensibility verdict

Genuinely defensible

  • Matching (the wall) — no tooling competitor can replicate it; it requires a demand side.
  • The take-rate structure taxing manufactured demand at a premium, enforced by immutable provenance.
  • The coach-supply constraint cutting FOR you once you have density.
  • The switching CLIFF — real today, even on Tier 1 (see below).
  • (Long-run, optional) the data flywheel — expert-annotated sports video collected as a paid byproduct. The only asset that compounds with scale. NOT built; a deliberate future choice. 13+ only.

NOT a moat — stop describing it as one

  • The voice clone (commodity API).
  • The async tooling on its own (replicable flat-fee SaaS; it's a wedge).
  • Tier 1 relationships (coach-owned).
  • The kid_id record itself — substrate, not moat. Portability and lock-in are contradictory; what's defensible is what runs ON the record.

The switching cliff

A coach who leaves to dodge the 20% take returns to doing their own video cutting and prep — falling from $192 to $120 per effective hour: a 37% drop to avoid a 20% fee. A genuine anti-disintermediation force that operates today, in bootstrap, without matching.

MODEL CORRECTION Original claim (~50% drop) compared gross async to net sync; honest figure is 37%. A claim that survives arithmetic is worth more than a bigger one that doesn't.

A cliff, not a wall: it only protects against the coach going fully manual. A flat-fee competitor offering the same prep-elimination at $40/mo neutralises it entirely. The wall is still matching.

Data governance

Serve all ages, train on 13+ only. Converts the COPPA training-data question from existential risk into a bounded segmentation decision, and doubles as a brand asset ("we don't train AI on little kids' video"). Biometric (BIPA-style) consent is a SEPARATE door with no age cutoff — the 13+ segmentation does not close it.

The bet, in one sentence

GameBooth wins if it converts coach-owned Tier 1 relationships into platform-owned Tier 2 liquidity — manufacturing unattached parent demand and stamping provenance — BEFORE a flat-fee tooling competitor or a defecting anchor coach exploits the defenceless bootstrap window.

Validate next, in order

  • Where does the first UNATTACHED parent come from? (Fuels matching; currently unanswered.)
  • Do parents value the artifact/record over the human coach? (Watch/rewatch instrumentation is the first proxy.)
  • Will a roster-struggling coach gladly pay 25–30% on a matched player?

Asset B · owner both CEOs · reviewed quarterly · canonical in-repo since 2026-08-19 (edit model/cvp.yaml, never this page) · Stress-tested draft. Tensions are left visible by design.

Coach value proposition — wedge and wall

Customer profile

Jobs
  • Generate income from coaching (primary job is on-ice/field; review is secondary income).
  • Service more players per available hour.
  • Build a roster of GOOD players (hard; high-value if solved).
  • Maintain reputation/results with existing clients.
Pains
  • Sync review is time-expensive: ≥30 min prep + 30 min call = ≥60 min per session, often more when video isn't pre-cut.
  • Sync forces a direct cost: unpaid prep time OR paying for editing tools out of the session fee.
  • Effective hourly earnings capped at the nominal rate — prep time is unpaid drag.
  • Roster-building is slow and uncertain.
  • Income capped by hours physically available.
Gains
  • More coaching outcomes per hour.
  • Higher EFFECTIVE earnings per hour worked, not just more volume.
  • Flexibility around a primary job.
  • Access to players they couldn't otherwise reach.

Value map

Pain relievers (the WEDGE — replicable)
  • Async review: ≤5 min of work per clip, priced off hourly rate. ~12x calendar throughput (twelve clips vs one session per hour).
  • AI-assisted notes + GameBooth-handled video cutting remove the prep burden entirely — eliminating a cost line the coach carries under sync.
  • GameBooth handles payment and (post-liquidity) matching.
Gain creators (the WALL — not replicable)
  • Matching delivers players the coach cannot source — the durable gain, and the one a flat-fee competitor structurally cannot offer.

The pain relievers are the WEDGE (replicable). The matching gain creator is the WALL (not replicable). A coach's dependency grows only as they consume matched players — which is why pricing taxes growth (matched), not base.

MODEL CORRECTION The rate claim compared gross async to net sync; like-for-like is $192/effective-hour, 1.6x. Publish the net number — a coach who finds the discrepancy discounts everything else. The ~12x throughput claim holds completely and is the stronger argument: a coach's binding constraint is calendar hours, not rate. Lead with throughput, support with rate.

The jobs grid

The Jobs Grid — the purchase trigger and the retention driver are different jobs held by different people

FunctionalSocialEmotional
Player (user)Close the specific skill gapNot be the weak link in front of teammates/coachProtect love of the game from toxic, politically-driven team-coach culture (the founding insight) ● dominant
Parent (buyer)Close the gap that's putting the kid in the bottom half of the rosterKeep up with the families who already pay for private coaching (positional / arms-race)Manage the recurring dread of relegation — "don't let my kid be the bubble kid" ● dominant

The parent's loss-aversion job is the most durable in the model: (1) it never self-extinguishes — relegation dread is structurally renewed every season/coach-change by the league's own mechanics; (2) it's loss-framed, therefore price-insensitive (prospect theory); (3) the cohort self-selects for the economics — bubble-anxious AAA/AA parents pay repeatedly.

The player's dominant job = protected joy. A GameBooth review is NOT a fault-finding takedown — it spotlights the kid and teaches when they want/need it, routing AROUND the toxic culture rather than adding to it.

The split-frame architecture — the core design constraint

The two dominant jobs point in opposite directions: the parent's job is to monetise relegation dread; the player's job is to escape the anxiety machine that creates that dread. Collapsing them recreates the toxic coach and triggers the one churn event GameBooth cannot survive: kid quits → parent churns regardless of coach quality.

  • Parent buys on loss-aversion (the purchase trigger). The league supplies the dread — never market it directly.
  • Player experiences encouragement + targeted teaching (the retention mechanism). The kid never feels the relegation pressure.
  • The product's core job is the TRANSLATION between these frames.
DESIGN BLOCKER The parent's view and the player's view of a review may need to diverge. If the kid reads the parent's relegation anxiety in the product, GameBooth has rebuilt the toxic coach. [DECIDED & BUILT: views diverge — the joy surface is the player-facing encouragement view, age-gated; see tracker #46.]
SUPPLY-QUALITY BLOCKER The player's emotional job is a promise about COACH BEHAVIOUR — the part GameBooth controls least. The anti-toxicity promise must be encoded into vetting, guidelines, and the review tooling (structural nudges toward encouragement over comprehensive fault-finding), or it is a value betrayed at scale. [OPEN: rubric-in-tooling is tracker #43; guidelines acceptance shipped.]
MODEL NOTE Both blockers map to Parent monthly retention — the single highest-leverage unknown in the financial model. These are not soft brand concerns; they sit directly on the number the business is most sensitive to.

Parent and player — pains, gains, relievers

Parent (buyer)

Pains
  • Recurring, league-manufactured dread of the kid being cut/relegated.
  • Can't coach the gap themselves; the team coach may be the SOURCE of the problem.
  • No continuity of record as the kid moves across teams/seasons/coaches.
Gains
  • The kid stays off the bubble.
  • A trusted coach outside the team's politics.
  • A record that follows the player through the yearly roster churn.

Player (user)

Pains
  • Being judged/nitpicked by a politically-motivated team coach.
  • Losing love of the game.
Gains
  • Encouragement and targeted teaching when wanted.
  • A coach who is on THEIR side, outside team politics.
Relievers / creators
  • Coached, annotated clip (parent-frame: gap-closing; player-frame: encouragement).
  • Coach outside the team's political structure.
  • The athlete record (kid_id) — continuity that survives the exact churn the league forces.

GameBooth has been selling the GAIN frame ("competitive edge"). The durable, price-insensitive job is the LOSS frame ("don't get cut") for the buyer, delivered as PROTECTED JOY for the user. Go-to-market language and the dual-surface design should reflect the split.

ASSUMPTION Still untested, still highest-priority: that parents value the produced artifact + record over the raw relationship with the human coach. If false, the coach can always take the parent off-platform. Watch/rewatch instrumentation is the first behavioural evidence.

The session-follow-up VP (coach-captured "neuro-mirror")

Not "do more async volume" but "extend and differentiate my in-person offering." The neuro-mirror clip makes the coach's in-person hour worth more and last longer (the kid re-watches; learning consolidates). A retention hook that does NOT depend on matching.

Natively split-frame-compliant: a neuro-mirror of a skills rep is inherently encouraging ("here's your good rep, here's how to make it cleaner") — possibly the cleanest expression of the anti-toxicity brand.

The fastest real-world path to T1 density and record population: a coach's existing in-person roster converts to platform-active kid_id records in one motion. Accepted risk: produces only coach_invited players — fuels the wedge, may starve the wall.

Who hears which frame

Who hears which frame — the thing most likely to be got wrong under time pressure

AudienceLead withNever lead with
Parents (customers)Protected joy, a coach on your kid's side, a record that follows themRelegation dread. It works, and using it makes you part of the machine you position against.
Players (users)Encouragement, targeted teaching, seeing yourself improveAnything that leaks the parent's anxiety
Coaches (supply)~12x throughput, prep eliminated, then 1.6x net rateThe 2x figure. It does not survive arithmetic.
InvestorsThe loss frame, explicitly — it is why this is repeat-purchase and price-insensitiveThe gain frame. "Helps kids improve" does not explain why demand renews every season.

The investor and customer frames are deliberately opposite. Naming that split openly in a pitch is a strength: it demonstrates you understand your own demand engine well enough to know why you do not point it at your customers.