executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
gym-money-modelModel gym unit economics - Client-Financed Acquisition, 30-day cash, CAC, LTV, LTV:CAC, and payback - and return a verdict on whether growth self-funds. Use when a gym owner asks "what's my CAC", "how much can I spend to get a member", "what should my challenge cost to break even", "is my gym profitable to scale", "what's my LTV:CAC", or "why does growth st…
Independent GitHub snapshot · Automated classification · Original documentation governs
Build this first. Every other gym growth skill spends money or sets a price, and this model tells you whether that spend pays for itself. The goal is Client-Financed Acquisition: the front-end collects enough cash in the first 30 days that each new member funds the acquisition of the next one, so growth is not capped by the bank balance.
Work the example gym throughout: one location, semi-private coaching plus memberships, a 6-week transformation challenge as the front-end.
Follow these steps in order. Do not skip to LTV before the front-end math is clean, because a gym dies from cash timing long before it dies from lifetime value. If the owner is setting the challenge price, pair with gym-transformation-challenge; if setting an ad budget, pair with gym-meta-ads-funnel.
The unit is one new member. Collect these from the owner. If a number is a guess, label it a guess and move on; refine later.
The front-end is the challenge. Two numbers decide if it self-funds.
Apply the 2x cash rule: the challenge should collect at least twice its own acquisition cost within 30 days. If 30-day cash is below 2 times cost per challenge sale, the front-end is not strong enough to fund growth and you fix that before scaling spend. See references/the-2x-cash-rule below.
If all three pass, the owner can scale spend with confidence. If any fails, go to Step 5.
When growth is capital-constrained, one lever is usually the bottleneck. Use this order, because the cheapest fixes come first.
See references/diagnosing-economics for the full decision tree.
Fill the template below with the owner's numbers and the computed outputs. This is the artifact they keep and revisit monthly. Run the calculator to populate the outputs.
A finished model is A+ only when all hold:
Self-contained Node script. Save as money_model.js and run with
node money_model.js. Edit the inputs block for the gym in question. No
dependencies.
// Gym Money Model calculator. Edit the inputs, then: node money_model.js
const inputs = {
costPerChallengeSale: 200, // fully loaded cost to fill one challenge spot
challengePrice: 499, // up-front price of the 6-week challenge
conversionToMembership: 0.5, // share of challengers who become members
membershipPrice: 159, // monthly recurring dues
avgTenureMonths: 14, // average months a member stays
grossMargin: 0.7, // delivery contribution margin (0-1)
}
function model(i) {
const frontEndCash30d = i.challengePrice
const frontEndSurplus = i.challengePrice - i.costPerChallengeSale
const passesTwoXRule = frontEndCash30d >= 2 * i.costPerChallengeSale
const cacPerMember = i.costPerChallengeSale / i.conversionToMembership
const ltv = i.membershipPrice * i.avgTenureMonths * i.grossMargin
const ltvToCac = ltv / cacPerMember
// 30-day cash earned per member: you sold 1/conversion challenge spots to
// produce one member, each collecting the challenge price up front.
const cash30dPerMember = i.challengePrice / i.conversionToMembership
const paybackUnderThirtyDays = cash30dPerMember >= cacPerMember
const paybackMonths = paybackUnderThirtyDays
? 0
: (cacPerMember - cash30dPerMember) / (i.membershipPrice * i.grossMargin)
const selfFunding = passesTwoXRule && ltvToCac >= 3 && paybackUnderThirtyDays
return {
frontEndCash30d, frontEndSurplus, passesTwoXRule,
cacPerMember, ltv, ltvToCac, cash30dPerMember,
paybackUnderThirtyDays, paybackMonths, selfFunding,
}
}
const r = model(inputs)
const money = (n) => '#x27; + n.toFixed(2)
console.log('Front-end 30-day cash per sale: ', money(r.frontEndCash30d))
console.log('Front-end surplus per sale: ', money(r.frontEndSurplus))
console.log('Passes 2x cash rule: ', r.passesTwoXRule ? 'yes' : 'no')
console.log('CAC per member: ', money(r.cacPerMember))
console.log('LTV per member (contribution): ', money(r.ltv))
console.log('LTV:CAC: ', r.ltvToCac.toFixed(2) + ':1')
console.log('30-day cash per member: ', money(r.cash30dPerMember))
console.log('Payback under 30 days: ', r.paybackUnderThirtyDays ? 'yes' : 'no')
console.log('Self-funding verdict: ', r.selfFunding ? 'SELF-FUNDING' : 'NOT YET')
With the inputs above the script prints:
Front-end 30-day cash per sale: $499.00
Front-end surplus per sale: $299.00
Passes 2x cash rule: yes
CAC per member: $400.00
LTV per member (contribution): $1558.20
LTV:CAC: 3.90:1
30-day cash per member: $998.00
Payback under 30 days: yes
Self-funding verdict: SELF-FUNDING
Read it: the challenge collects 499 against a 200 acquisition cost, clearing the 2x rule. Each member costs 400 to acquire and returns 1558 in lifetime contribution, a 3.9:1 ratio. The front-end alone collects 998 per member in the first 30 days, more than the 400 CAC, so acquisition pays for itself before the first membership payment clears. This gym can scale ad spend.
Copy this, replace the FILL fields, and paste the calculator outputs into the OUTPUTS block.
GYM UNIT ECONOMICS. [FILL: gym name]. [FILL: month/year]
INPUTS
Cost per challenge sale (loaded): $[FILL]
Challenge price: $[FILL]
Conversion to membership: [FILL]%
Membership price (monthly): $[FILL]
Average tenure (months): [FILL]
Gross margin on delivery: [FILL]%
OUTPUTS (from calculator)
Front-end 30-day cash per sale: $____
Front-end surplus per sale: $____
Passes 2x cash rule: yes / no
CAC per member: $____
LTV per member (contribution): $____
LTV:CAC: ____:1
Payback under 30 days: yes / no
Self-funding verdict: SELF-FUNDING / NOT YET
CONSTRAINED LEVER (if not self-funding)
Bottleneck: [FILL: conversion / front-end / LTV / CAC]
Action this month: [FILL: one move]
Owner: [FILL]
Client-Financed Acquisition means the customer funds their own acquisition. The mechanism is timing: most gyms can eventually earn back acquisition cost over a year of dues, but they run out of cash long before that because they pay for ads today and collect dues slowly. The front-end challenge breaks the timing trap by collecting a lump of cash up front. If that lump covers acquisition cost, and ideally doubles it, the gym can reinvest immediately and growth compounds without outside capital.
The four numbers that matter, in plain terms:
The front-end should collect at least twice its own acquisition cost within 30 days. At exactly 1x, the gym treads water: each sale returns what it cost, with nothing left to accelerate. At 2x, every two members fund a third for free, which is what turns spend into compounding growth. If the challenge cannot clear 2x, the fix is almost always price (too low to anchor value) or cost per challenge sale (ads or sales process leaking money), not LTV. Solve the front-end before touching the back end.
Decision tree when the gym is capital-constrained:
Re-run the model after every change. One lever moves the others, so re-read the whole sheet, not just the number you changed.