
Churn Prevention
Model MRR saved by improving voluntary save rates and involuntary payment recovery before you invest in churn programs.
Overview
churn-prevention is an agent skill for the Grow phase that estimates subscription revenue retained by improving save and payment-recovery rates via a parameterized Python calculator.
Install
npx skills add https://github.com/alirezarezvani/claude-skills --skill churn-preventionWhat is this skill?
- Python churn impact calculator with JSON sample inputs for quick what-if runs
- Splits voluntary vs involuntary churn and models current vs target save and recovery rates
- Outputs MRR churned, saves, recoveries, and incremental retained revenue from improvements
- Uses average customer MRR to translate rate changes into dollar impact
- Suitable for prioritizing save offers vs billing recovery work
- Sample model includes seven core input fields (MRR, churn %, voluntary split, save rates, recovery rates, avg MRR)
Adoption & trust: 521 installs on skills.sh; 17.5k GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You know churn hurts MRR but lack a quick model tying save-offer and dunning improvements to dollars retained per month.
Who is it for?
Bootstrapped SaaS with subscription MRR who want a fast scenario model before building retention experiments.
Skip if: Pre-revenue products, one-time purchase businesses, or teams needing a full cohort-based churn analytics pipeline instead of a calculator.
When should I use this skill?
User wants to quantify revenue impact of churn reduction, save-rate, or payment-recovery improvements for a subscription product.
What do I get? / Deliverables
You get numeric MRR churn, save, recovery, and uplift scenarios from structured inputs you can reuse in planning docs or investor updates.
- JSON or printed churn impact breakdown (churned MRR, saves, recoveries, uplift)
Recommended Skills
Journey fit
Churn prevention and revenue retention are core Grow concerns once a subscription product has paying customers. Lifecycle covers retention, cancellation saves, and dunning-style recovery—the inputs this calculator explicitly separates.
How it compares
Use as a lightweight scenario script, not a replacement for product analytics or billing-platform retention dashboards.
Common Questions / FAQ
Who is churn-prevention for?
Indie SaaS builders and small teams measuring subscription churn who want agent help running structured save-rate and recovery what-if calculations.
When should I use churn-prevention?
During Grow lifecycle planning when you are sizing impact of cancellation flows, save offers, or payment recovery targets before engineering or marketing work.
Is churn-prevention safe to install?
It includes executable Python; review the Security Audits panel on this Prism page and inspect the script before running it with production financial data.
SKILL.md
READMESKILL.md - Churn Prevention
#!/usr/bin/env python3 """Churn impact calculator — models revenue impact of churn reduction improvements.""" import json import sys SAMPLE_INPUT = { "mrr": 50000, "monthly_churn_rate_pct": 4.5, "voluntary_churn_pct": 65, "current_save_rate_pct": 8, "target_save_rate_pct": 20, "current_recovery_rate_pct": 15, "target_recovery_rate_pct": 35, "avg_customer_mrr": 150 } def calculate(inputs): mrr = inputs["mrr"] churn_rate = inputs["monthly_churn_rate_pct"] / 100 voluntary_pct = inputs["voluntary_churn_pct"] / 100 involuntary_pct = 1 - voluntary_pct current_save = inputs["current_save_rate_pct"] / 100 target_save = inputs["target_save_rate_pct"] / 100 current_recovery = inputs["current_recovery_rate_pct"] / 100 target_recovery = inputs["target_recovery_rate_pct"] / 100 avg_customer_mrr = inputs["avg_customer_mrr"] # Total MRR churned per month total_churned_mrr = mrr * churn_rate voluntary_churned_mrr = total_churned_mrr * voluntary_pct involuntary_churned_mrr = total_churned_mrr * involuntary_pct # Current saves/recoveries current_saves_mrr = voluntary_churned_mrr * current_save current_recoveries_mrr = involuntary_churned_mrr * current_recovery current_total_saved = current_saves_mrr + current_recoveries_mrr # Target saves/recoveries target_saves_mrr = voluntary_churned_mrr * target_save target_recoveries_mrr = involuntary_churned_mrr * target_recovery target_total_saved = target_saves_mrr + target_recoveries_mrr # Incremental gains incremental_monthly = target_total_saved - current_total_saved incremental_annual = incremental_monthly * 12 # Customer counts voluntary_churned_customers = voluntary_churned_mrr / avg_customer_mrr involuntary_churned_customers = involuntary_churned_mrr / avg_customer_mrr additional_saves = (target_save - current_save) * voluntary_churned_customers additional_recoveries = (target_recovery - current_recovery) * involuntary_churned_customers total_additional_customers = additional_saves + additional_recoveries # LTV impact (assuming 24-month average tenure at current churn rate) implied_ltv_months = 1 / churn_rate ltv_per_customer = avg_customer_mrr * implied_ltv_months ltv_impact = total_additional_customers * ltv_per_customer return { "baseline": { "mrr": mrr, "monthly_churn_rate_pct": inputs["monthly_churn_rate_pct"], "total_churned_mrr_monthly": round(total_churned_mrr, 0), "voluntary_churned_mrr": round(voluntary_churned_mrr, 0), "involuntary_churned_mrr": round(involuntary_churned_mrr, 0), }, "current_performance": { "save_rate_pct": inputs["current_save_rate_pct"], "recovery_rate_pct": inputs["current_recovery_rate_pct"], "monthly_saved_mrr": round(current_total_saved, 0), "annual_saved_mrr": round(current_total_saved * 12, 0), }, "target_performance": { "save_rate_pct": inputs["target_save_rate_pct"], "recovery_rate_pct": inputs["target_recovery_rate_pct"], "monthly_saved_mrr": round(target_total_saved, 0), "annual_saved_mrr": round(target_total_saved * 12, 0), }, "improvement_impact": { "incremental_mrr_monthly": round(incremental_monthly, 0), "incremental_mrr_annual": round(incremental_annual, 0), "additional_customers_saved_monthly": round(total_additional_customers, 1), "implied_ltv_per_customer": round(ltv_per_customer, 0), "ltv_impact_of_saved_customers": round(ltv_impact, 0), }, "priorities": _prioritize( voluntary_churned_mrr, involuntary_churned_mrr, current_save, target_save, current_recovery, target_recovery ) } def _prioritize(vol_mrr, inv_mrr, cur_save, tgt_save, cur_re