Work out whether a business makes money per customer: CAC, LTV, the LTV to CAC ratio, payback period, and contribution margin, with a self-contained calculator. Triggers on: unit economics, CAC vs LTV, customer acquisition cost, payback period, is this business viable, contribution margin, LTV CAC ratio.
./install.sh unit-economicsname: "unit_economics" description: "Work out whether a business makes money per customer: CAC, LTV, the LTV to CAC ratio, payback period, and contribution margin, with a self-contained calculator. Triggers on: unit economics, CAC vs LTV, customer acquisition cost, payback period, is this business viable, contribution margin, LTV CAC ratio." metadata: { "includeInPrompt": true }
Answer one question with numbers: does this business make money on each customer it acquires? Covers customer acquisition cost (CAC), lifetime value (LTV), the LTV:CAC ratio, the CAC payback period, and contribution margin per customer. It does not cover full P&L accounting, fundraising, or valuation; and it does not set prices (see the catalog's pricing-basics, which picks the number to charge; this skill checks whether the business works at that number). Built for founders and operators sizing a business model, not accountants.
Save as unit_econ.py and run with python3 unit_econ.py. Edit the INPUTS dict with the business's numbers. Standard library only.
python
#!/usr/bin/env python3
# Save as unit_econ.py and run: python3 unit_econ.py
# Edit the INPUTS dict with the business's numbers. Mark guesses as guesses.
INPUTS = {
"arpa_monthly": 49.0, # avg revenue per account per month
"gross_margin": 0.80, # 0-1
"monthly_churn": 0.05, # 0-1; set lifespan_months instead to override
"lifespan_months": None, # overrides churn when set
"cac": 180.0, # fully-loaded customer acquisition cost
}
def main():
i = INPUTS
lifespan = i["lifespan_months"] if i["lifespan_months"] else 1.0 / i["monthly_churn"]
monthly_contrib = i["arpa_monthly"] * i["gross_margin"]
ltv = monthly_contrib * lifespan
ratio = ltv / i["cac"]
payback = i["cac"] / monthly_contrib
verdict = "healthy" if ratio >= 3 else "watch" if ratio >= 1 else "losing money per customer"
print(f"LTV: ${ltv:,.2f} (ARPA ${i['arpa_monthly']:.2f} x margin {i['gross_margin']:.0%} x {lifespan:.1f} mo)")
print(f"CAC: ${i['cac']:,.2f}")
print(f"LTV:CAC = {ratio:.2f}:1 ({verdict})")
print(f"Payback: {payback:.1f} months")
if i["monthly_churn"]:
stress_life = 1.0 / (2 * i["monthly_churn"])
stress_ltv = monthly_contrib * stress_life
print(f"2x-churn stress: LTV ${stress_ltv:,.2f}, ratio {stress_ltv / i['cac']:.2f}:1")
if __name__ == "__main__":
main()
Deliver: (a) the inputs used, with every guess labeled as a guess; (b) LTV with the math shown; (c) fully-loaded CAC and what went into it; (d) the LTV:CAC ratio with the benchmark read; (e) the payback period in months with the read; (f) contribution margin per customer and its variable-cost parts; (g) the 2x-churn stress test; (h) the one assumption the verdict hinges on.
publisher key 2e43c913833850e6d80f939677e3de76e806d47785c0f1caaca90f9d18c98e1e
No ratings yet — be the first to rate it.