GameBooth — Operating System

Canonical source: model/ in the repo. Generated 2026-10-19 11:23 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-19 11:23 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
driver121722455
obligation5158—28
table-stakes2255128106

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 — 57 open

#TitleLabelsMilestone
#388Team pilot: explicit Certified GameBooth coach field on coaches (certified_at) for the coach landing ruletable-stakes · coach—
#382Team pilot: coach-entered title for team clips and reviews (default date, never the filename), guarded like narrationtable-stakes · coach—
#381Team pilot: coach landing rule — a team coach lands on the team console, paid coaching is a secondary card; hybrid coach gets "Your teams" promotedtable-stakes · coach—
#380Full co-ownership for second guardians: a guardian can buy one-to-one coaching on the same player record; owner sees and removes followers; cap per playerdriver · player · conversion—
#379Team pilot: guardian invite redeemed by an account that already owns a matching player creates a duplicate athlete recordtable-stakes · records · unretrofittable—
#376Team pilot: phone /home team card overflows the viewport once a guardian invite is createdtable-stakes · parent—
#354Any coach can overwrite an individual review's narration audioobligation · review—
#347Report-content path for team reviewsobligation · review—
#346Team narration audio behind an access-checked routeobligation · review—
#343Close the $0 coach-rate bypass; replace it with an explicit, platform-approved comp/sponsor exceptionobligation · paymentsM2 Break-even
#332Parent opening a review link sees "Couldn't load this review — Unauthorized"table-stakes · parent · feedbackM1 First Cohort
#324Coaches can edit a note on an already-delivered review (pause-point PUT has no draft check)table-stakes · review—
#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
#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 — 81 open

#TitleLabelsMilestone
#395Team pilot: pending team requests carry the caller's own kid id, so the home can tell a team-only family exactlytable-stakes · parent—
#377Team pilot frontend hygiene: studio "Pending" on a published review, join/home lack waiting states, deep link loses return, note transport clips, raw file inputtable-stakes · parent—
#370Team Coach roadmap: studio assistant suggests a jersey number when a coach names a player in a team reviewtable-stakes · coach—
#366viewer deploy:* scripts upload whatever is in dist/ — add a post-build tier guard before `wrangler pages deploy`table-stakes · platform—
#365Coach studio fullscreen overlay fades End note / Discard during a recording and intercepts bottom-center strokestable-stakes · review—
#364Coach studio: note acks carry no note identity — a late note_captured for note A can close note Btable-stakes · review—
#360Coach studio holds its LiveKit room open indefinitely when the tab is left idle — billed agent + participant minutesdriver · coach · infra-cost—
#358Viewer CI: ParentHome.home-v1 "quiet re-sort … watched toast" flakes — role="status" not found (2 of 3 runs red on 2026-10-15)table-stakes · parent—
#355Mark-the-player overlay positions by container %, not the video content box — off the player in non-16:9 fullscreentable-stakes · reviewM1 First Cohort
#348Automate team-video retention (30 days after season end)obligation · records—
#342Game In Review: player pick link — a child picks the shifts they want coaching on, the parent sendsdriver · player · frequencyM2 Break-even
#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 — 32 open

#TitleLabelsMilestone
#391Parent home: "Add a coach" card must say it needs a code, and "Find a coach" becomes a coming-soon note until a directory existstable-stakes · parent—
#378Team pilot frontend polish: birth-year list, bare studio "Not found", agent label on empty draft, empty "In their corner" eyebrow, /api/coach/me 401 noisetable-stakes · parent—
#349Team Coach pilot: small hardening follow-upstable-stakes · coach—
#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-19-digest-008. Names resolve for signed-in founders.

Weekly Digest 008

No new weekly snapshot has landed since digest 007. The two newest dated files in ops/weekly/ are still 2026-10-05.json and 2026-10-12.json — the identical pair digest 007 already diffed (latest.json still duplicates 2026-10-12.json byte-for-byte: 16365 bytes, same generated_at). Sections 1, 2 and 5 below are therefore built from the same export digest 007 used, not fresh data — stated plainly per the honesty rules rather than re-presenting last week's numbers as new. Section 3 (backlog) and 4 (decisions) are git-native and independent of the snapshot, so those are current through 2026-10-19. Sources: ops/weekly/2026-10-05.json / 2026-10-12.json (unchanged), GitHub issue history 2026-10-12 → 2026-10-19 (boundary: digest 007's commit, 2026-10-12 18:00:54 -0400), and decisions/ entries committed after that boundary (one: 2026-10-12-review-render-cloud-run-minors-video.md, committed 19:12:08 -0400 — after 007, so new to this digest despite sharing 007's file-name date).

Flagging the missing snapshot itself: every prior digest (002–007) had a fresh ops/weekly/*.json to diff. This is the first cycle with none. Worth Matt's eye on whether the Friday/weekly export job ran this week — the digest can't tell from here whether that's a stalled job or an expected gap.

1. Drivers that moved

Nothing — there is no new snapshot to diff. The drivers block, volume, and cohorts in 2026-10-12.json are unchanged from what digest 007 already reported (active parents 3, reviews delivered 4, GMV $30 USD + $8 CAD, blended_take_rate.cad still reading an unconfirmed 43.87% on n=1 — still no second CAD transaction to confirm or dissolve it). Stating plainly rather than re-running last week's diff as if it were new: nothing was learned this week on the driver/volume side.

Two checks below don't depend on the snapshot and were re-run directly against the repo:

  • Guess-basis baseline — now 8 calendar weeks unowned. grep -n "owner:" model/assumptions.yaml still returns nothing. The same five drivers digest 002 (2026-08-24) first flagged — coach_monthly_churn, parents_invited_per_coach_per_month, invite_to_first_purchase_conversion, parent_monthly_retention, reviews_per_active_parent_per_month — are all still basis: guess in model/assumptions.yaml, no owner anywhere in the file.
  • Driver-taxonomy gap (#292) — carried, 1 week. driver:dc/driver:g2r are still live in the tracker (e.g. #298, touched again this week) and still absent from CLAUDE.md's canonical eight-driver list. The decision record meant to formalize them (#292, "G2R + Delivering Coaches north stars, pods, and the driver label set") is still open, unassigned, with no activity since it was filed 2026-10-08 — one week after digest 007 first flagged this gap.
  • Coach-disappearance anomaly (C-0f4b1805) — unresolved, 6th week flagged. This is the same observation as digest 007 (digests 003–007), not a fresh confirmation — the underlying snapshot hasn't moved, so this can't be independently re-checked this week. Carrying forward rather than dropping it.

2. Evidence logged

No new contact_evidence rows — same reason as §1: no new snapshot since digest 007, which already reported the one new row this week could have shown (P-0aa9b668, 2026-10-07, email, no driver tag). Nothing was learned this week on the evidence side either, and combined with §1 this is two weeks running with an empty §1+§2 — flagging per the honesty rules rather than letting it pass quietly. (Note this is a snapshot staleness artifact, not necessarily a real two-week silence from parents — see the missing-snapshot flag above.)

3. Backlog shipped and started

Issue history for 2026-10-12 → 2026-10-19, boundary set at digest 007's commit (2026-10-12T22:00:54Z) rather than the calendar date, to avoid double-counting anything 007 already covered. Verified via list_issues with since on that exact timestamp (37 issues touched; cross-checked against each item's own created_at/closed_at).

Shipped (closed this week): 11 issues — 1 track:driver, 10 track:table-stakes, 0 track:obligation.

| # | Title | Track / driver | |---|---|---| | 374 | Coach home: past reviews in "Sent to family" can't be opened to re-watch | table-stakes, P1, surface:coach, feedback | | 368 | Coach Studio: mark-the-player chevron never renders on iPad (timing race WebKit loses) | table-stakes, P1, surface:review | | 361 | beta-gate smoke: basket hosted-page SUM assertion races Stripe's order-summary render | table-stakes, P2, surface:payments | | 352 | Apple Pencil drawings exceed the LiveKit data-message and Worker body caps | table-stakes, P1, surface:review | | 351 | Telestrator strokes captured in fullscreen stored in container space, not video space | table-stakes, P1, surface:review, unretrofittable | | 350 | Coach studio: exiting fullscreen mid-note destroys the note | table-stakes, P1, surface:review | | 340 | Viewer CI: ShareToReel "Add CTA" test flaky on slow runners | table-stakes, P2, surface:platform | | 338 | Root landing page: front door to /families and /coaches, replacing the invite-only gate | driver:conversion, P1, surface:platform | | 331 | iPhone fullscreen review playback is broken — overhaul the in-page fallback | table-stakes, P1, surface:review, feedback | | 319 | Coach Studio: first-frame marker only pauses once, clips freeze at loop point in Chrome | table-stakes, P1, surface:review | | 118 | Telestrator finger-draw on iPad scrolls the screen / exits fullscreen | table-stakes, P1, surface:review, feedback |

Notable: #331 and its whole satellite cluster closed this week (#350, #351, #352,

368, #319, #118 all touch the same iPad/iPhone playback and telestrator surface). Digest

007 called #331 "the open-ended parent" of several open issues — that parent and five of its children are now shipped in one week.

Started (opened this week): 32 issues, in two groups.

  1. Team Coach pilot — 13 issues (#346–#349, #370, #376–#382, #388, #395), all track:table-stakes except three track:obligation: #346 (narration audio behind an access-checked route), #347 (report-content path for team reviews), #348 (automate team-video retention, 30 days after season end). This is a new surface with real minors-video obligations attached (retention, access control) — none closed yet, all still open.
  2. Standalone — 11 issues: #342 (driver:frequency, GIR player-pick link), #343 (track:obligation, close the $0 coach-rate bypass), #354 (track:obligation, a coach can overwrite another review's narration audio), #355, #358, #360 (driver:infra-cost, LiveKit room left open idle — billed minutes), #364, #365, #366, #380 (driver:conversion, full co-ownership for second guardians), #391.

8 of this week's 11 closures (#374, #368, #361, #350, #352, #351, #340, #338) were also opened this week — already counted once, in the Shipped table above.

Driver coverage this week: 4 issues touched a driver:* label — driver:conversion (#338 closed, #380 opened), driver:infra-cost (#360 opened), driver:frequency (#342 opened). No driver:retention, driver:invites, driver:coach-churn, driver:matched-premium, or driver:price issue moved this week.

4. Decisions needed

One decision landed after digest 007's commit (same file-name date, later commit — counted here, not in 007): decisions/2026-10-12-review-render-cloud-run-minors-video.md — Matt approved the rendered-review pipeline (#331's Cloud Run renderer) on a negative-assurance basis: stands unless Alex replies to the 2026-10-12 notification by 2026-10-17 EOD Toronto. That deadline has now passed (today is 2026-10-19) with no reversal visible in git — per the decision's own terms, it is final on this ground as of 2026-10-18. Git can't see a direct email reply, so this is the git-visible state, not a guarantee Alex didn't object through that channel. Reversal conditions 2 and 3 (a parent objection, or child video/name/narration found in Cloud Run logs or storage) carry no time limit and remain open regardless.

Carrying forward six open items, elapsed weeks updated (calendar weeks from the original decision date to today, 2026-10-19; #292 uses weeks-flagged since no decision date exists yet):

  • Price-per-review derivation unconfirmed (decisions/2026-08-19-price-per-review.md) — carried, 8 weeks.
  • Season-one plan adopted without Alex, Danny, or Derek (decisions/2026-08-20-season-one-plan.md) — carried, 8 weeks.
  • Market analysis + seasonality layer (decisions/2026-08-20-market-analysis-and-seasonality.md) — carried, 8 weeks.
  • Startup capital exclusion (decisions/2026-08-20-startup-capital-excluded-from-operating-model.md) — carried, 8 weeks.
  • Residual Tier-1 confirmation on incorporation (decisions/2026-09-09-incorporation-in-place-no-coach-reonboard.md) — carried, 5 weeks.
  • G2R + Delivering Coaches decision record (#292) still open while its labels ship — carried, 1 week (first flagged digest 007; see §1).

Six open decisions, five of them now 8 weeks unmoved, plus one freshly finalized this week under its own negative-assurance clause.

5. Touch points this week

From the roster block in 2026-10-12.json (unchanged — see the missing-snapshot note above). Ordering by primary_flag: 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) — identical selection to digest 007, since the roster itself hasn't changed. Days-since-purchase below are recomputed against today (2026-10-19), not the snapshot's own (stale) figures, since that's simple arithmetic on an unchanged fact, not invented data.

| 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 77 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 73 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 66 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 68 days since purchase, no repeat purchase since. | | P-f1c95a7d | SILENT | Alex | One delivered review 8/14, last touched 8/20 — now 67 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 — now 18 days since joining and still never contacted (last_contact_at: null). |

Follow-through on digest 007's touch list (6 handles): zero new contact_evidence rows exist at all this week (§2), so by definition none of 007's six were followed up on.

  • P-2952f6f8 — no new contact since 8/20. Sixth week running.
  • P-c2dc0179 — no new contact since 9/11. Fifth week running.
  • P-494a7944 — no new contact since 8/20. Sixth week running.
  • P-7d3431ec — no new contact since 8/19. Sixth week running.
  • P-f1c95a7d — no new contact since 8/20. Sixth week running.
  • P-1840925a — first appeared on last week's list (NEW); no contact logged since. First week unaddressed.

Net: five parents have now gone six weeks (five for P-c2dc0179) with zero logged contact, and the beta's single most active parent has now gone two weeks without a first contact at all. This is the sixth consecutive digest naming the same outreach gap — worth treating as a standing fact about current capacity rather than a to-do that will clear itself.

6. Mid-week pulse

No pulse entries this week.

Archive (6)
  • 2026-10-12-digest-007.md
  • 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.