Use behavioral analytics to identify churn signals early and take action to retain customers.
Info
Sample business figures, conversion ranges and scoring thresholds in this guide are illustrative. They are not industry benchmarks, Zenovay customer results or measured causal effects. Define events for your product and compare observed cohorts before adopting a target.
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 | Illustrative range |
|---|---|---|
| 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
Next Steps
Use this workflow in Zenovay
Use user segments and goals in Open the dashboard to compare declining use with renewal outcomes. Treat an at-risk label as a hypothesis to test.