Business Metrics Calculator
nimrodfisher/data-analytics-skills
Standard business metric calculation with industry benchmarks.
SaaS churn and retention analysis: cohort-based churn rates, retention curves, revenue churn vs logo churn, at-risk customer identification, expansion vs contraction MRR, churn recovery playbooks…
$ npx skills add LeoYeAI/openclaw-master-skills --skill saas-churn-analysis -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills saas-churn-analysis --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/saas-churn-analysis .claude/skills/saas-churn-analysis && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "saas-churn-analysis" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/saas-churn-analysis into .claude/skills/saas-churn-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "saas-churn-analysis", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/saas-churn-analysisType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add LeoYeAI/openclaw-master-skills --skill saas-churn-analysis -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills saas-churn-analysis --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/saas-churn-analysis .agents/skills/saas-churn-analysis && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "saas-churn-analysis" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/saas-churn-analysis into .agents/skills/saas-churn-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "saas-churn-analysis", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add LeoYeAI/openclaw-master-skills --skill saas-churn-analysis -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills saas-churn-analysis --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/saas-churn-analysis .cursor/skills/saas-churn-analysis && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "saas-churn-analysis" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/saas-churn-analysis into .cursor/skills/saas-churn-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "saas-churn-analysis", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/LeoYeAI/openclaw-master-skills.git --path skills/saas-churn-analysis--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add LeoYeAI/openclaw-master-skills --skill saas-churn-analysis -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills saas-churn-analysis --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/saas-churn-analysis .gemini/skills/saas-churn-analysis && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "saas-churn-analysis" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/saas-churn-analysis into .gemini/skills/saas-churn-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "saas-churn-analysis", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install LeoYeAI/openclaw-master-skills saas-churn-analysisInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add LeoYeAI/openclaw-master-skills --skill saas-churn-analysis -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/saas-churn-analysis .github/skills/saas-churn-analysis && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "saas-churn-analysis" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/saas-churn-analysis into .github/skills/saas-churn-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "saas-churn-analysis", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add LeoYeAI/openclaw-master-skills --skill saas-churn-analysis -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills saas-churn-analysis --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/saas-churn-analysis .opencode/skills/saas-churn-analysis && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "saas-churn-analysis" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/saas-churn-analysis into .opencode/skills/saas-churn-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "saas-churn-analysis", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
saas-churn-analysisSaaS churn and retention analysis: cohort-based churn rates, retention curves, revenue churn vs logo churn, at-risk customer identification, expansion vs contraction MRR, churn recovery playbooks…
SaaS Churn Analysis is an agent skill from LeoYeAI/openclaw-master-skills. SaaS churn and retention analysis: cohort-based churn rates, retention curves, revenue churn vs logo churn, at-risk customer identification, expansion vs contraction MRR, churn recovery playbooks, and net revenue retention (NRR) benchmarking. Produces investor-ready retention charts and actionable recovery plans. Use when: analyzing why customers are churning, building cohort retention tables, calculating NRR/GRR, identifying at-risk accounts before they cancel, or presenting retention data to investors/board…
Its SKILL.md is about 5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `_meta.json`).
It sits in Business, Finance & HR, covering Financial modeling, Product analytics and Payments and billing. The repository describes itself as: 🧠 Curated collection of 1209+ best OpenClaw skills — weekly updated by MyClaw.ai. The licence is MIT.
Read from SKILL.md and the folder at commit e5199b5. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are python and json).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
SaaS Churn Analysis loads about 5k tokens when it runs. Until then it costs about 201 tokens; SKILL.md has 573 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from LeoYeAI/openclaw-master-skills at commit e5199b5, republished under its MIT licence (© LeoYeAI). 573 words, ~5,021 tokens.
.claude/skills/saas-churn-analysis/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Deep-dive churn and retention analysis for SaaS businesses. Build cohort tables, calculate NRR/GRR, identify at-risk accounts, and produce investor-ready retention metrics with actionable recovery playbooks.
Trigger phrases:
NOT for:
saas-metrics-dashboard or subscription-revenue-trackerstartup-financial-modelLogo Churn Rate (monthly) = Customers Lost / Customers at Start of Period
Example:
Start of month: 200 customers
Canceled: 5
Logo churn rate: 5/200 = 2.5%Gross Revenue Churn Rate = MRR Lost to Cancellations / MRR at Start of Period
Example:
Start MRR: $100,000
Churned MRR: $4,000 (from cancellations)
Gross churn: 4%NRR = (Beginning MRR + Expansion MRR - Contraction MRR - Churned MRR) / Beginning MRR × 100
Components:
+ Expansion MRR: upsells, upgrades, seat additions from existing customers
- Contraction MRR: downgrades, reduced seats
- Churned MRR: cancellations
Example:
Beginning MRR: $100,000
Expansion: +$8,000
Contraction: -$2,000
Churn: -$4,000
NRR = ($100,000 + $8,000 - $2,000 - $4,000) / $100,000 = 102%NRR Benchmarks (SaaS industry):
| NRR | Signal |
|---|---|
| >120% | Elite (enterprise, product-led) |
| 110–120% | Strong — expansion > churn |
| 100–110% | Healthy |
| 90–100% | Adequate — watch churn trends |
| <90% | Red flag — structural problem |
GRR = (Beginning MRR - Contraction MRR - Churned MRR) / Beginning MRR × 100
(excludes expansion — pure retention, no upsell credit)
Healthy GRR benchmarks:
Enterprise SaaS: >90%
Mid-market: >85%
SMB SaaS: >75%Track customers by their acquisition month and measure % remaining in each subsequent month:
import pandas as pd
from datetime import datetime
def build_cohort_table(subscriptions_df: pd.DataFrame) -> pd.DataFrame:
"""
Build a cohort retention table from subscription data.
Input DataFrame columns:
- customer_id: str
- signup_date: datetime
- cancel_date: datetime | None (None = still active)
Returns:
Pivot table: rows = cohort month, columns = months_since_signup,
values = retention percentage
"""
df = subscriptions_df.copy()
df['cohort_month'] = df['signup_date'].dt.to_period('M')
df['active_through'] = df['cancel_date'].fillna(pd.Timestamp.now())
rows = []
for cohort, group in df.groupby('cohort_month'):
cohort_size = len(group)
for month_offset in range(0, 25): # 0–24 months
cutoff = cohort.to_timestamp() + pd.DateOffset(months=month_offset)
active = group[group['active_through'] >= cutoff].shape[0]
retention = active / cohort_size * 100
rows.append({
'cohort': str(cohort),
'month': month_offset,
'cohort_size': cohort_size,
'active': active,
'retention_pct': round(retention, 1)
})
result = pd.DataFrame(rows)
pivot = result.pivot(index='cohort', columns='month', values='retention_pct')
return pivotExample cohort table output:
Cohort | M0 | M1 | M3 | M6 | M12
-----------|-------|-------|-------|-------|------
2025-01 | 100% | 91% | 81% | 72% | 58%
2025-02 | 100% | 93% | 84% | 76% | —
2025-03 | 100% | 89% | 79% | — | —
2025-04 | 100% | 94% | — | — | —Track MRR retained and expanded per cohort:
def revenue_cohort_table(mrr_events_df: pd.DataFrame) -> pd.DataFrame:
"""
Revenue cohort analysis tracking MRR per acquisition cohort.
Input DataFrame columns:
- customer_id: str
- event_date: datetime
- event_type: str # 'signup', 'expansion', 'contraction', 'churn'
- mrr_change: float
Returns:
Cohort revenue retention table (% of original MRR retained+expanded)
"""
# Group by signup cohort
signups = mrr_events_df[mrr_events_df['event_type'] == 'signup'].copy()
signups['cohort_month'] = signups['event_date'].dt.to_period('M')
# For each cohort, track MRR over time
# NRR by cohort = sum(all MRR changes for cohort customers) / initial MRR
passIdentify when in the customer lifecycle churn peaks:
Early churn (M1-M3): Onboarding failure, value not delivered
→ Diagnosis: activation rate, time-to-first-value, support tickets
Mid-term churn (M4-M12): Competitive displacement, budget cuts
→ Diagnosis: NPS trends, feature adoption, renewal engagement
Late churn (M12+): Strategic shifts, contract terms, enterprise competition
→ Diagnosis: executive sponsor changes, usage trends, renewal conversationsChurn by tenure bucket:
def churn_by_tenure(subscriptions_df: pd.DataFrame) -> dict:
"""Calculate churn rate for different tenure buckets."""
buckets = {
'0-3mo': (0, 90),
'3-6mo': (90, 180),
'6-12mo': (180, 365),
'12-24mo': (365, 730),
'24mo+': (730, float('inf'))
}
results = {}
for bucket_name, (min_days, max_days) in buckets.items():
mask = (
(subscriptions_df['tenure_days'] >= min_days) &
(subscriptions_df['tenure_days'] < max_days)
)
bucket_df = subscriptions_df[mask]
if len(bucket_df) == 0:
continue
churned = bucket_df[bucket_df['cancel_date'].notna()].shape[0]
results[bucket_name] = {
'total_customers': len(bucket_df),
'churned': churned,
'churn_rate_pct': round(churned / len(bucket_df) * 100, 1)
}
return resultsScore each active customer by leading indicators:
CHURN_RISK_WEIGHTS = {
'days_since_last_login': 0.25, # Usage drop
'feature_adoption_pct': -0.20, # Inverse: more features = lower risk
'support_tickets_30d': 0.15, # Escalations
'nps_score': -0.15, # Inverse: high NPS = lower risk
'days_to_renewal': -0.10, # Closer renewal = higher urgency
'billing_failures_90d': 0.15, # Payment issues
}
def churn_risk_score(customer: dict) -> float:
"""
Calculate 0-100 churn risk score for a customer.
Higher = more likely to churn.
Inputs:
customer: dict with keys matching CHURN_RISK_WEIGHTS
Returns:
Risk score 0-100 (>70 = high risk, 40-70 = medium, <40 = low)
"""
raw_score = 0
for factor, weight in CHURN_RISK_WEIGHTS.items():
if factor in customer:
# Normalize each factor to 0-100 scale first
normalized = normalize_factor(factor, customer[factor])
raw_score += normalized * weight
# Scale to 0-100
return max(0, min(100, raw_score * 100 + 50))
def get_at_risk_accounts(customers: list, threshold: float = 70.0) -> list:
"""Return customers with churn risk score above threshold, sorted by MRR."""
at_risk = [
{**c, 'risk_score': churn_risk_score(c)}
for c in customers
]
return sorted(
[c for c in at_risk if c['risk_score'] >= threshold],
key=lambda x: x.get('mrr', 0),
reverse=True # Highest MRR first — prioritize by revenue impact
)Usage-based signals (product telemetry):
🔴 High risk:
- No login in 14+ days (was weekly user)
- DAU/MAU ratio dropped >50% MoM
- Core feature not used in 30 days
- Below 20% feature adoption vs peers
🟡 Medium risk:
- Login frequency dropped >30% MoM
- Support ticket with "cancel" or "refund" keyword
- NPS score ≤ 6 (detractor)
- Seat count reduced
🟢 Healthy signals:
- Expanded seats or upgraded tier
- Used 3+ core features this month
- NPS ≥ 9 (promoter)
- Referred another customerFinancial signals:
🔴 High risk:
- Payment failure (retry in progress)
- Requested invoice-based payment shift (budget freeze)
- Contract not opened with 30 days to renewal
🟡 Medium risk:
- Asked about pricing alternatives
- Billing contact changed
- Discount request submittedDecompose monthly MRR change into components:
MRR Bridge: January → February
Beginning MRR: $100,000
+ New Business: +$8,500 (23 new customers × $370 avg)
+ Expansion: +$3,200 (upgrades + seat additions)
- Contraction: -$1,100 (downgrades + seat reductions)
- Churn: -$4,300 (11 cancellations × $390 avg)
= Ending MRR: $106,300
Net New MRR: +$6,300
MoM Growth: 6.3%Python MRR bridge calculation:
from dataclasses import dataclass
@dataclass
class MRRBridge:
period: str
beginning_mrr: float
new_mrr: float # New customers
expansion_mrr: float # Upsells/upgrades
contraction_mrr: float # Downgrades (negative or positive — store as positive)
churned_mrr: float # Cancellations (store as positive)
@property
def ending_mrr(self) -> float:
return self.beginning_mrr + self.new_mrr + self.expansion_mrr - self.contraction_mrr - self.churned_mrr
@property
def net_new_mrr(self) -> float:
return self.ending_mrr - self.beginning_mrr
@property
def growth_rate_pct(self) -> float:
return self.net_new_mrr / self.beginning_mrr * 100 if self.beginning_mrr else 0
@property
def quick_ratio(self) -> float:
"""SaaS Quick Ratio = (New + Expansion) / (Contraction + Churn). >4 = healthy."""
numerator = self.new_mrr + self.expansion_mrr
denominator = self.contraction_mrr + self.churned_mrr
return numerator / denominator if denominator else float('inf')
def to_summary(self) -> str:
return (
f"MRR Bridge ({self.period})\n"
f" Beginning: ${self.beginning_mrr:,.0f}\n"
f" + New: ${self.new_mrr:,.0f}\n"
f" + Expansion: ${self.expansion_mrr:,.0f}\n"
f" - Contraction: ${self.contraction_mrr:,.0f}\n"
f" - Churn: ${self.churned_mrr:,.0f}\n"
f" = Ending: ${self.ending_mrr:,.0f}\n"
f" Growth: {self.growth_rate_pct:.1f}% | Quick Ratio: {self.quick_ratio:.1f}x"
)SaaS Quick Ratio benchmarks:
| Quick Ratio | Signal |
|---|---|
| >4 | Elite growth efficiency |
| 2–4 | Healthy |
| 1–2 | Growing but inefficient — churn drag |
| <1 | Shrinking — churn exceeds new + expansion |
Root cause: Failed onboarding, didn't reach first value moment
Diagnosis questions:
□ Did they complete onboarding? (activation rate)
□ Did they use the core feature at least once? (activation event)
□ How long did it take to reach first value moment?
□ Did they get a human touchpoint in first 48 hours?Recovery actions:
Day 1-7: Personal outreach from CSM — "What would make this a 10/10?"
Day 7-14: Offer 1:1 onboarding session + extend trial if applicable
Day 14-21: Share customer success story in their industry/use case
Day 21-30: Executive touchpoint if MRR > $500/moRoot cause: Value plateau, competitive evaluation, budget pressure
Diagnosis questions:
□ Usage trend: up, flat, or declining in last 60 days?
□ When did they last use the feature most tied to their stated goal?
□ Any support escalations or complaints in the last 90 days?
□ Have they been pitched by a competitor? (ask directly)
□ Is this a budget-driven decision or product-driven?Recovery actions by root cause:
Budget:
→ Offer pause plan (90-day pause vs cancel)
→ Right-size to smaller plan vs lose them entirely
→ Annual prepay at 20% discount to lock in
Product gaps:
→ Roadmap call with PM — "here's what's coming"
→ Workaround documentation for their specific use case
→ Connect to power-user customer for peer validation
Competitor evaluation:
→ Direct competitive comparison matrix
→ Migration cost analysis (switching is expensive)
→ Win-back offer if they've already left (45-day re-engagement)Proactive renewal pipeline:
60 days out:
□ Usage review: send personalized "Your results with [Product]" email
□ Identify any open issues — resolve before renewal conversation
45 days out:
□ QBR or check-in call — confirm value, surface upsell opportunity
□ Flag to AE if NPS < 7 or usage declining
30 days out:
□ Renewal proposal sent — include current plan + upsell option
□ Executive sponsor confirmation (for accounts >$1k/mo)
14 days out:
□ Follow-up if no response — switch to phone
□ Escalate to manager if no reply
7 days out:
□ Final decision call — accept reduced terms if needed to retain{
"period": "Q4 2025",
"generated_at": "2026-01-15",
"retention_metrics": {
"logo_churn_rate_monthly": 2.1,
"mrr_gross_churn_rate_monthly": 3.8,
"net_revenue_retention_pct": 108,
"gross_revenue_retention_pct": 96.2,
"quick_ratio": 3.2
},
"mrr_bridge": {
"beginning_mrr": 285000,
"new_mrr": 42000,
"expansion_mrr": 18500,
"contraction_mrr": 4200,
"churned_mrr": 10800,
"ending_mrr": 330500
},
"at_risk_pipeline": {
"high_risk_count": 8,
"high_risk_mrr_at_risk": 24600,
"medium_risk_count": 15,
"medium_risk_mrr_at_risk": 38200
},
"cohort_highlights": {
"best_cohort": { "month": "2025-03", "m12_retention": 74 },
"worst_cohort": { "month": "2025-08", "m3_retention": 71 },
"avg_m12_retention": 68.5
},
"benchmarks": {
"nrr_vs_industry": "above_median",
"grr_vs_industry": "top_quartile",
"logo_churn_vs_industry": "median"
}
}cohort_retention_csv_template:
Cohort,Size,M1,M2,M3,M6,M9,M12,M18,M24
2025-01,45,91%,84%,81%,73%,67%,61%,55%,49%
2025-02,52,93%,87%,83%,—,—,—,—,—
...Step 1: Data collection
□ Customer list with signup date and cancel date (if churned)
□ MRR per customer per month (last 12 months)
□ Usage data: logins, feature events (from product analytics)
□ NPS scores if available
□ Cancellation reason codes (from offboarding flow)Step 2: Calculate headline metrics
Step 3: Build cohort table
Step 4: MRR bridge (last 6 months)
Step 5: At-risk identification
Step 6: Root cause analysis
Step 7: Recommend playbook
Segment churn to find structural patterns:
def churn_by_segment(subscriptions_df: pd.DataFrame, segment_col: str) -> pd.DataFrame:
"""
Calculate churn rate by customer segment.
Args:
segment_col: column name to segment by (e.g., 'plan', 'industry', 'company_size')
Returns:
DataFrame with churn rate per segment, sorted by MRR impact
"""
results = []
for segment, group in subscriptions_df.groupby(segment_col):
total = len(group)
churned = group[group['cancel_date'].notna()].shape[0]
total_mrr = group['mrr'].sum()
churned_mrr = group[group['cancel_date'].notna()]['mrr'].sum()
results.append({
'segment': segment,
'total_customers': total,
'churned_customers': churned,
'logo_churn_pct': round(churned / total * 100, 1),
'total_mrr': total_mrr,
'churned_mrr': churned_mrr,
'mrr_churn_pct': round(churned_mrr / total_mrr * 100, 1) if total_mrr else 0
})
return pd.DataFrame(results).sort_values('churned_mrr', ascending=False)Key segments to analyze:
saas-metrics-dashboard — Display NRR, GRR, and churn rate KPIs in dashboardkpi-alert-system — Trigger alerts when monthly churn exceeds thresholdstartup-financial-model — Feed churn rate assumptions into revenue forecastssubscription-revenue-tracker — MRR bridge data source for churn calculationscrypto-tax-agent — N/A (different domain)Logo Churn Rate (monthly) = Customers Lost / Customers at Start × 100
Annual Logo Churn = 1 - (1 - monthly_churn)^12 × 100
Gross Revenue Retention = (BOM MRR - Contraction - Churn) / BOM MRR × 100
Net Revenue Retention = (BOM MRR + Expansion - Contraction - Churn) / BOM MRR × 100
Quick Ratio = (New MRR + Expansion MRR) / (Contraction MRR + Churned MRR)
LTV (with churn) = ARPU / Monthly Churn Rate
Avg Customer Lifetime = 1 / Monthly Churn Rate (in months)
Rule of Thumb:
2% monthly logo churn = ~21% annual churn (B2B SMB benchmark)
0.5% monthly logo churn = ~6% annual churn (enterprise benchmark)
NRR >100% means you grow from existing base alone — key investor signal© LeoYeAI, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in skills/saas-churn-analysis of LeoYeAI/openclaw-master-skills.
Open the folder on GitHubat commit e5199b5
SaaS Churn Analysis next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| SaaS Churn Analysis this skillLeoYeAI/openclaw-master-skills | 2.2k | — | ~5k | Automated safety check: Pass | MIT | |
| Business Metrics Calculatornimrodfisher/data-analytics-skills | 470 | — | ~668 | Automated safety check: Pass | MIT | |
| Financial Modelingcbrock84/headcount | 2k | — | ~1.1k | Automated safety check: Pass | MIT | |
| CharlieEveryInc/charlie-cfo-skill | 323 | — | ~1.4k | Automated safety check: Pass | MIT | |
| Analytics Strategyrampstackco/claude-skills | 945 | — | ~2.4k | Automated safety check: Pass | MIT | |
| Startup Metrics Frameworkaiskillstore/marketplace | 433 | 10 repos | ~293 | Automated safety check: Pass | None |
nimrodfisher/data-analytics-skills
Standard business metric calculation with industry benchmarks.
cbrock84/headcount
Builds and stress-tests financial models for forecasting, scenario planning, and decision support — revenue build, cost structure, driver logic, and the sensitivities that show where a plan breaks.
EveryInc/charlie-cfo-skill
Your AI CFO for bootstrapped startups, named after Charlie Munger who embodied the principle that capital discipline is a competitive advantage.
rampstackco/claude-skills
Design measurement frameworks including event taxonomy, KPI hierarchy, dashboard architecture, attribution models, and analytics implementation strategy.
aiskillstore/marketplace
This skill should be used when the user asks about "key startup metrics", "SaaS metrics", "CAC and LTV", "unit economics", "burn multiple", "rule of 40", "marketplace metrics", or requests guidance…
wshobson/agents
Track, calculate, and optimize key performance metrics for SaaS, marketplace, consumer, and B2B startups from seed through Series A, including unit economics, growth efficiency, and cash management.
LeoYeAI/openclaw-master-skills
Manages pipelines on a DevOps quality and efficiency platform through its OpenAPI: list workspaces and templates, create, update, run and cancel pipelines, and read run records.
LeoYeAI/openclaw-master-skills
Patches OpenClaw's Feishu extension so an edited document triggers an isolated agent session that reads the doc and replies inline, turning it into a live chat space.
LeoYeAI/openclaw-master-skills
Multi-context memory management system for OpenClaw agents with group-isolated storage, global shared memory, workspace organization, and group-specific skills isolation.
LeoYeAI/openclaw-master-skills
Runs a brand's AI-search visibility work end to end: diagnosing how AI platforms represent it, repositioning it, producing AI-optimized content and monitoring ongoing mentions.
LeoYeAI/openclaw-master-skills
Installs and authenticates the gws CLI, then automates Gmail, Drive, Sheets, Calendar, Docs, Chat and Tasks with ready-made recipes, persona bundles and security audits.
LeoYeAI/openclaw-master-skills
Runs four advisor roles, a fitness coach, nutritionist, data analyst and TCM practitioner, to build a health profile and track workouts, diet and wellness over time.
Categories
SaaS churn and retention analysis: cohort-based churn rates, retention curves, revenue churn vs logo churn, at-risk customer identification, expansion vs contraction MRR, churn recovery playbooks…. SaaS Churn Analysis is an agent skill from LeoYeAI/openclaw-master-skills. SaaS churn and retention analysis: cohort-based churn rates, retention curves, revenue churn vs logo churn, at-risk customer identification, expansion vs contraction MRR, churn recovery playbooks, and net revenue retention (NRR) benchmarking.
SaaS Churn Analysis fits situations like: : analyzing why customers are churning; building cohort retention tables; calculating NRR/GRR; identifying at-risk accounts before they cancel.
Run `npx skills add LeoYeAI/openclaw-master-skills --skill saas-churn-analysis -a claude-code`. Or copy the skill folder (skills/saas-churn-analysis in LeoYeAI/openclaw-master-skills) into .claude/skills/saas-churn-analysis in your project. Claude Code loads it when a task matches its description.
Run `npx skills add LeoYeAI/openclaw-master-skills --skill saas-churn-analysis -a codex`. Or copy the skill folder (skills/saas-churn-analysis in LeoYeAI/openclaw-master-skills) into .agents/skills/saas-churn-analysis in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add LeoYeAI/openclaw-master-skills --skill saas-churn-analysis -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/saas-churn-analysis, .gemini/skills/saas-churn-analysis, .github/skills/saas-churn-analysis and .opencode/skills/saas-churn-analysis in your project.
SKILL.md names no scripts, command-line tools or credentials: SaaS Churn Analysis is instructions for the agent only. Our summary lists: Python 3.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
SaaS Churn Analysis is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with SaaS Churn Analysis: Business Metrics Calculator (nimrodfisher/data-analytics-skills, 470 stars), Financial Modeling (cbrock84/headcount, 2k stars), Charlie (EveryInc/charlie-cfo-skill, 323 stars) and Analytics Strategy (rampstackco/claude-skills, 945 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
LeoYeAI (a GitHub user) maintains it in LeoYeAI/openclaw-master-skills, which has 2,161 GitHub stars. The repository holds 1,235 skills in this directory. The repository was last updated on July 20, 2026.
Source: LeoYeAI/openclaw-master-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.