Use behavioral analytics to identify churn signals early and take action to retain customers.
Understanding SaaS Churn
Churn Types
| Type | Definition | Trackable? |
|---|---|---|
| Voluntary | Customer cancels | Yes |
| Involuntary | Payment fails | Yes |
| Quiet | Stops using, keeps paying | Yes - critical! |
| Downgrade | Moves to lower plan | Yes |
Churn Metrics
| Metric | Formula | Good Benchmark |
|---|---|---|
| Monthly Churn Rate | Lost ÷ Start of Month | <5% |
| Annual Churn | Lost ÷ Annual Customers | <10% |
| Net Revenue Retention | (MRR + Expansion - Churn) ÷ Starting MRR | >100% |
| Logo Churn | Lost accounts ÷ Total accounts | <3% |
Identifying Churn Signals
Behavioral Signals
Track usage patterns that predict churn:
| Signal | Risk Level | Days Before Churn |
|---|---|---|
| Zero logins (7 days) | High | 14-30 |
| Decreased feature use | Medium | 30-60 |
| Support ticket spike | Medium | 30-45 |
| Admin change | Watch | 45-60 |
| Integration removed | High | 14-21 |
Track Activity Decline
// Track daily active usage
zenovay('track','user_session', {
user_id: 'user_123',
account_id: 'acc_456',
session_duration: 1200,
features_used: ['dashboard', 'reports', 'export'],
actions_count: 45
});
// Track feature removal
zenovay('track','feature_disabled', {
account_id: 'acc_456',
feature: 'api_integration',
connected_since_days: 180
});
Create Health Score
// Calculate and track health score
function updateAccountHealth(accountId) {
const factors = {
login_frequency: calculateLoginScore(), // 0-25
feature_breadth: calculateFeatureScore(), // 0-25
user_growth: calculateUserGrowthScore(), // 0-20
support_sentiment: calculateSupportScore(), // 0-15
billing_health: calculateBillingScore() // 0-15
};
const totalScore = Object.values(factors).reduce((a, b) => a + b, 0);
zenovay('track','health_score_updated', {
account_id: accountId,
score: totalScore,
factors: factors,
risk_level: totalScore < 40 ? 'high' : totalScore < 70 ? 'medium' : 'low'
});
}
Building a Churn Dashboard
Risk Segments
Create segments based on health scores:
| Segment | Health Score | % of Base | Action |
|---|---|---|---|
| Healthy | 80-100 | 45% | Upsell |
| Stable | 60-79 | 30% | Monitor |
| At Risk | 40-59 | 15% | Intervene |
| Critical | 0-39 | 10% | Urgent |
Track Segment Movement
// Track when account changes risk level
zenovay('track','risk_level_changed', {
account_id: 'acc_456',
previous_level: 'stable',
new_level: 'at_risk',
trigger: 'login_frequency_dropped',
days_at_previous: 90
});
Set Up Alerts
Alert when:
- Account enters "At Risk" segment
- Health score drops >20 points in 7 days
- Zero activity for key accounts
- Multiple users from same account inactive
Usage Pattern Analysis
Login Frequency Tracking
// Track login patterns
zenovay('track','user_login', {
user_id: 'user_123',
account_id: 'acc_456',
days_since_last_login: 3,
login_streak: 5,
device: 'desktop'
});
Feature Usage Depth
Track breadth of feature usage:
| Usage Level | Features Used | Churn Risk |
|---|---|---|
| Power User | 80%+ features | Very Low |
| Regular | 50-79% | Low |
| Basic | 25-49% | Medium |
| Minimal | <25% | High |
// Track feature engagement
zenovay('track','feature_engagement', {
account_id: 'acc_456',
features_available: 20,
features_used_30d: 8,
engagement_score: 40,
trending: 'declining'
});
Key Feature Stickiness
Identify features that correlate with retention:
| Feature | Users Who Use | 12-mo Retention |
|---|---|---|
| Team collaboration | 45% | 92% |
| API integration | 30% | 88% |
| Custom reports | 55% | 85% |
| Basic dashboard only | 70% | 58% |
Track adoption of sticky features:
zenovay('track','sticky_feature_adopted', {
account_id: 'acc_456',
feature: 'team_collaboration',
users_using: 5,
adoption_date: new Date().toISOString()
});
Cohort Churn Analysis
Signup Cohorts
Track churn by signup month:
| Cohort | M1 | M3 | M6 | M12 |
|---|---|---|---|---|
| Jan | 5% | 12% | 18% | 25% |
| Feb | 4% | 10% | 15% | - |
| Mar | 6% | 14% | - | - |
By Acquisition Channel
| Channel | 12-mo Churn | Notes |
|---|---|---|
| Referral | 15% | Best retention |
| Organic | 22% | Good fit |
| Paid Ads | 35% | Lower quality |
| Affiliate | 40% | Price-driven |
By Plan Type
| Plan | Annual Churn | MRR Churn |
|---|---|---|
| Monthly | 28% | 25% |
| Annual | 8% | 10% |
| Enterprise | 5% | 8% |
Pre-Churn Indicators
Cancellation Flow Tracking
// User opens cancellation page
zenovay('track','cancellation_page_viewed', {
account_id: 'acc_456',
current_plan: 'pro',
months_as_customer: 8,
mrr: 99
});
// User provides reason
zenovay('track','cancellation_reason', {
account_id: 'acc_456',
reason: 'too_expensive',
feedback: 'Need more flexible pricing'
});
// Cancellation completed
zenovay('track','subscription_cancelled', {
account_id: 'acc_456',
reason: 'too_expensive',
lifetime_value: 792,
months_as_customer: 8,
cancel_date: new Date().toISOString(),
effective_date: '2025-02-15'
});
Save Offer Tracking
// Offer shown during cancellation
zenovay('track','save_offer_shown', {
account_id: 'acc_456',
offer_type: 'discount_30',
offer_value: 30
});
// Offer accepted
zenovay('track','save_offer_accepted', {
account_id: 'acc_456',
offer_type: 'discount_30',
new_mrr: 69,
commitment_months: 3
});
Proactive Intervention
Triggered Actions
Set up automated interventions:
| Trigger | Action | Track |
|---|---|---|
| 7 days no login | Email check-in | intervention_email_sent |
| Feature usage down 50% | In-app tips | feature_tips_shown |
| Support ticket negative | CSM outreach | csm_assigned |
| Health score <40 | Personal call | intervention_call |
// Track intervention
zenovay('track','intervention_triggered', {
account_id: 'acc_456',
trigger: 'health_score_drop',
intervention_type: 'csm_outreach',
priority: 'high'
});
// Track intervention outcome
zenovay('track','intervention_outcome', {
account_id: 'acc_456',
intervention_type: 'csm_outreach',
outcome: 'saved',
new_health_score: 65,
notes: 'Resolved integration issue'
});
Win-Back Campaigns
Track churned customer recovery:
// Win-back offer sent
zenovay('track','winback_campaign_sent', {
account_id: 'acc_456',
days_since_churn: 30,
offer: 'first_month_free'
});
// Customer reactivated
zenovay('track','customer_reactivated', {
account_id: 'acc_456',
days_churned: 45,
reactivation_offer: 'first_month_free',
new_plan: 'pro'
});
Churn Analysis Reports
Monthly Churn Report
Include:
- Churned accounts list
- Churn reasons breakdown
- Revenue impact
- Health score before churn
- Early warning accuracy
Cohort Retention Report
Track long-term retention:
- Month 1, 3, 6, 12 retention
- By channel, plan, company size
- Trend analysis
Intervention Effectiveness
| Intervention | Triggered | Saved | Save Rate |
|---|---|---|---|
| Email series | 150 | 45 | 30% |
| CSM outreach | 50 | 25 | 50% |
| Discount offer | 80 | 32 | 40% |
| Training session | 30 | 18 | 60% |
Predictive Churn Model
Input Signals
Feed these metrics to predict churn:
- Login frequency trend
- Feature usage breadth
- Support ticket volume/sentiment
- Billing issues
- User count trend
- Admin activity
Risk Scoring
// Daily risk score calculation
zenovay('track','churn_prediction', {
account_id: 'acc_456',
churn_probability: 0.35,
confidence: 0.82,
top_factors: [
'login_decline',
'feature_usage_narrow',
'support_negative'
],
predicted_churn_date: '2025-03-15'
});
Model Performance
Track prediction accuracy:
- True positives (predicted and churned)
- False positives (predicted but stayed)
- Precision and recall
- Lead time (how early we predicted)
Best Practices
Early Detection
-
Monitor continuously
- Daily health score updates
- Weekly trend analysis
- Monthly cohort review
-
Multiple signals
- Don't rely on one metric
- Combine usage + support + billing
-
Act quickly
- Intervene at first warning
- Don't wait for confirmation
Intervention Strategy
-
Segment approach
- High MRR = personal touch
- Low MRR = automated
-
Understand why
- Root cause, not symptoms
- Product issue vs fit issue
-
Measure effectiveness
- Track intervention outcomes
- Optimize based on data
Common Mistakes
-
Focusing only on cancellations
- Quiet churn is bigger
- Track usage, not just subscription
-
Same treatment for all
- Different segments need different approaches
- Personalize interventions
-
Reacting too late
- When they cancel, it's often too late
- Early warning is key