All examples for SaaS Churn Pattern Analyzer

Pre-Churn Behavior Pattern Analysis

Statistical analysis comparing churned vs retained user behaviors, generating risk scoring formula, SQL queries for at-risk identification, Python scripts, and tiered intervention playbook with email templates.

Input

What you provide to the skill

47 users churned in last 6 months out of 250 total. I have 6 months of event logs, subscription dates, and support tickets. What patterns predict churn?

Output

What the skill generates for you

Pre-Churn Behavior Pattern Analysis Results

Statistical Comparison: Churned vs Retained

Analysis window: 30 days before churn/present
Sample: 47 churned, 203 retained users over 6 months

Metric Churned Mean Retained Mean P-Value Significant?
Login count 2.8 9.4 0.0002 ✓ Very significant
Unique features used 3.4 6.8 0.0015 ✓ Significant
Core feature uses 6.2 24.3 <0.0001 ✓ Very significant
Days active 4.7 13.2 0.0005 ✓ Very significant
Support tickets 2.1 0.7 0.0187 ✓ Significant

Interpretation

All metrics show statistically significant differences (p < 0.05). Users who churned:

  • Log in 70% less frequently
  • Use 50% fewer unique features
  • Engage with core features 75% less
  • Are active 64% fewer days per month
  • Have 3x more support tickets

Risk Thresholds (Optimized for Your Product)

Based on your data distribution (18.8% churn rate):

Signal High Risk Medium Risk Low Risk
Login frequency <3/month 3-8/month >8/month
Core feature usage <6/month 6-18/month >18/month
Days active <5/month 5-11/month >11/month
Feature breadth <3 features 3-6 features >6 features
Support tickets >2/month 1-2/month <1/month

Churn Risk Scoring Formula

def churn_risk_score(user_metrics):
"""
Calculate churn risk score from user behavior metrics.
Returns score 0-100 (higher = more at risk)
"""
score = 0
# Login frequency (30 points)
if user_metrics['login_count'] < 3:
score += 30
elif user_metrics['login_count'] < 8:
score += 15
# Core feature engagement (40 points - strongest predictor)
if user_metrics['core_feature_uses'] < 6:
score += 40
elif user_metrics['core_feature_uses'] < 18:
score += 20
# Days active (20 points)
if user_metrics['days_active'] < 5:
score += 20
elif user_metrics['days_active'] < 11:
score += 10
# Support ticket volume (10 points)
if user_metrics['support_tickets'] > 2:
score += 10
elif user_metrics['support_tickets'] >= 1:
score += 5
return score # 0-100 scale

Intervention Playbook

Risk Score Risk Tier Action Timing Owner
70-100 CRITICAL Personal founder/CEO email + offer consultation Within 24 hours Founder
50-69 HIGH Customer success team outreach + proactive support Within 3 days CS Team
30-49 MEDIUM Automated re-engagement campaign + feature tips Weekly Marketing automation
0-29 LOW Normal engagement flow No special action

Email Templates by Risk Tier

Critical Risk (70-100): Personal Founder Outreach

Subject: Quick check-in about [Product Name]


Hi [First Name],

I’m [Your Name], founder of [Product Name]. I noticed your account activity has dropped off recently, and I wanted to personally reach out.

I know how busy things get, but if there’s something we’re missing or if you’re running into challenges, I’d genuinely love to hear about it. Even 5 minutes on a call would be incredibly valuable.

Would you be open to a quick conversation this week? I can work around your schedule.

Thanks for being a customer,
[Your Name]
[Your Title]
[Direct phone/calendar link]


Expected response rate: 35-45%

SQL Query for Weekly At-Risk Report

WITH user_metrics AS (
SELECT
user_id,
COUNT(DISTINCT CASE WHEN event_type = 'login' THEN DATE(timestamp) END) AS login_count,
COUNT(DISTINCT feature_name) AS unique_features,
COUNT(*) FILTER (WHERE event_type IN ('core_action_1', 'core_action_2', 'core_action_3')) AS core_feature_uses,
COUNT(DISTINCT DATE(timestamp)) AS days_active
FROM event_logs
WHERE timestamp >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY user_id
),
support_metrics AS (
SELECT
user_id,
COUNT(*) AS support_tickets
FROM support_tickets
WHERE ticket_date >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY user_id
),
risk_scores AS (
SELECT
s.user_id,
s.email,
s.signup_date,
s.plan,
COALESCE(um.login_count, 0) AS login_count,
COALESCE(um.core_feature_uses, 0) AS core_feature_uses,
COALESCE(um.days_active, 0) AS days_active,
COALESCE(um.unique_features, 0) AS unique_features,
COALESCE(sm.support_tickets, 0) AS support_tickets,
(CASE
WHEN COALESCE(um.login_count, 0) < 3 THEN 30
WHEN COALESCE(um.login_count, 0) < 8 THEN 15
ELSE 0
END +
CASE
WHEN COALESCE(um.core_feature_uses, 0) < 6 THEN 40
WHEN COALESCE(um.core_feature_uses, 0) < 18 THEN 20
ELSE 0
END +
CASE
WHEN COALESCE(um.days_active, 0) < 5 THEN 20
WHEN COALESCE(um.days_active, 0) < 11 THEN 10
ELSE 0
END +
CASE
WHEN COALESCE(sm.support_tickets, 0) > 2 THEN 10
WHEN COALESCE(sm.support_tickets, 0) >= 1 THEN 5
ELSE 0
END) AS risk_score
FROM subscriptions s
LEFT JOIN user_metrics um ON s.user_id = um.user_id
LEFT JOIN support_metrics sm ON s.user_id = sm.user_id
WHERE s.cancel_date IS NULL
AND s.signup_date < CURRENT_DATE - INTERVAL '14 days'
)
SELECT
user_id,
email,
signup_date,
plan,
login_count,
core_feature_uses,
days_active,
unique_features,
support_tickets,
risk_score,
CASE
WHEN risk_score >= 70 THEN 'CRITICAL - Founder outreach needed'
WHEN risk_score >= 50 THEN 'HIGH - CS team intervention'
WHEN risk_score >= 30 THEN 'MEDIUM - Automated re-engagement'
ELSE 'LOW - Healthy'
END AS risk_tier
FROM risk_scores
WHERE risk_score >= 30
ORDER BY risk_score DESC, signup_date ASC;

Implementation Steps

Week 1: Setup

  1. Export event logs, subscription data, and support tickets
  2. Set up SQL query or script to calculate risk scores weekly
  3. Create notification system for at-risk users
  4. Draft and approve email templates

Week 2: Pilot

  1. Identify current at-risk users (scores >50)
  2. Launch interventions with high-risk tier first
  3. Track open rates, response rates, outcomes

Week 3+: Scale & Iterate

  1. Expand to medium-risk tier
  2. Measure impact: Are interventions reducing churn?
  3. Refine thresholds based on results

Measurement Framework

Track these metrics weekly to validate intervention effectiveness:

Metric Baseline Target How to Measure
Overall churn rate 18.8% (47/250 over 6mo) <15% Monthly cohort churn
High-risk user churn TBD <30% Track users scored 70+
Intervention response rate TBD >35% Email opens + replies
Saved customers 0 5-10/month Users who re-engage after intervention

Success criteria: 20% reduction in churn rate within 3 months (from 18.8% to 15%)