gym-money-model — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited gym-money-model (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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.
plus any sales labor and setter cost, divided by challenge sales. Not just ad spend.
the end of the challenge.
estimate as 1 divided by monthly churn rate (5 percent churn means 20 months).
hours, space, consumables), as a fraction. A semi-private gym commonly runs 0.6 to 0.75.
The front-end is the challenge. Two numbers decide if it self-funds.
pays up front.
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.
membership. You pay to acquire challengers, and only some become members, so the cost concentrates on the ones who convert.
This is contribution, not revenue, because margin is already applied.
front-end cash collected per member already exceeds CAC, payback is under one month and acquisition is self-funding.
means you are underspending on growth and could acquire faster.
Client-Financed Acquisition.
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.
onboarding before spending more on ads. Send the owner to closer-sales-script and retention-and-churn-killer. This is the highest-impact fix because it improves both CAC and LTV at once.
sale. Send to gym-pricing-and-guarantees and gym-meta-ads-funnel.
retention problem; send to retention-and-churn-killer.
spend and watch payback.
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:
contribution margin, never revenue.
action, and you re-run the model after the proposed change.
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) => '$' + 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-FUNDINGRead 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]wasted spend on non-converters lands on the members who actually convert.
great LTV and weak 30-day cash still goes broke.
fix price or cost per challenge sale first.
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:
challengers who never convert. Hiding the wasted spend makes CAC look better than it is and leads to overspending.
This is the survival metric. A gym with great LTV and weak 30-day cash still goes broke.
flatter the model; use margin.
back. Fast payback beats high LTV when cash is tight.
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:
and LTV together and costs nothing in ad spend. Consult skill and onboarding skill.
cut cost per challenge sale. Pricing skill and ads skill.
price, raise margin, or extend tenure. Retention skill.
and monitor payback monthly.
Re-run the model after every change. One lever moves the others, so re-read the whole sheet, not just the number you changed.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.