Why churn is predictable — and why most SaaS teams miss it
Churn rarely happens without warning. The customer who cancels on March 1st started showing signals in late January: login frequency dropped, core feature usage declined, support tickets ticked up. The data was there. The system to act on it wasn’t.
Without an automated health scoring model, the signal decays into noise. Your CS team notices churn when it happens — not 30 days before, when a single well-timed email or call could have saved the account.
The Churn Prediction automation builds a real-time health score (0–100) inside GHL for every paying customer, driven by behavioral signals fed back via webhooks. When a score drops below threshold, tiered intervention sequences fire automatically — no manual monitoring required.
How the scoring model works in GHL
GHL’s contact scoring field tracks a health_score (0–100) for each customer. Scores update in real time as your product fires behavioral webhooks:
| Signal | Score impact |
|---|---|
| Login in last 7 days | +10 |
| Core feature used in last 14 days | +15 |
| More than 1 active user on account (multi-seat usage) | +10 |
| New feature explored for first time | +8 |
| Support ticket opened (monitoring only) | 0 |
| No login in 14 days | −20 |
| Support ticket with billing complaint keywords | −15 |
| Pricing page visited (churn signal at this stage) | −10 |
| Feature usage declined vs prior 30-day average | −15 |
| No core feature use in 21 days | −25 |
| NPS detractor response (0–6) | −20 |
A healthy account with consistent multi-user engagement sits above 70. An account with a disengaged admin and declining feature usage drifts toward 40. When a contact falls below threshold (default: 50), the intervention sequence fires.
Three-stage intervention model
Stage 1: Early warning (score 40–50) — save rate: 35–50%
- CS task created in GHL pipeline: “Health score declining — review account.”
- Automated check-in email from the CS rep’s name (not “Team [Product]”): “How’s [product] working for your team? Anything I can help with?”
- If no reply within 5 days: a manual follow-up task for the CS rep.
- SMS follow-up on day 7 if the email hasn’t been opened.
Stage 2: At-risk (score 25–40) — save rate: 20–35%
- High-priority CS task: “At-risk account — intervene this week.”
- Value delivery email: outcomes the account has achieved (pulled from GHL custom fields — e.g., reports generated, integrations connected), with a reminder of unexplored features.
- Direct calendar link for a 20-minute account health call (no pitch framing).
- Slack notification to
#cs-alertschannel.
Stage 3: Critical (score below 25) — save rate: 10–20%
- Urgent task for CS rep + manager notification via Slack
#cs-urgent. - Personal email from the founder or CS lead (template provided, personalized with account name and usage data).
- Save offer sequence: pause-account option, dedicated success call, or targeted discount consideration.
- Exit survey link if no response within 72 hours.
ROI math: what early intervention is actually worth
Scenario: Globex Systems — $80k MRR, 5% monthly logo churn.
Current state: 5% monthly churn = 0.05 × $80k = $4,000 MRR lost per month.
At $200 ARPA, that’s 20 churning customers/month. With no prediction system, the team catches cancellations at the cancel button — Stage 3 save rate applies (15%). That recovers 3 accounts/month = $600 MRR saved/month.
With churn prediction deployed (same 20 at-risk accounts/month, now caught earlier):
- 12 caught at Stage 1 (score 40–50): 12 × 40% save rate × $200 = $960/month saved
- 6 caught at Stage 2: 6 × 25% save rate × $200 = $300/month saved
- 2 reach Stage 3: 2 × 15% save rate × $200 = $60/month saved
- Total saved: $1,320/month vs $600/month without prediction
- Net additional MRR protected: $720/month = $8,640/year
For Initech (a workflow SaaS at $350 ARPA, $150k MRR, 4% churn), the same model at early interception produces +$2,940/month in recovered MRR — $35,280 annually — against a one-time snapshot investment of $1,200.
Connecting to ChartMogul or ProfitWell
If you’re already tracking churn in ChartMogul or ProfitWell, those platforms can push churned-MRR events via webhook into GHL, providing ground-truth validation of the health score model. Accounts that churned can be back-tagged in GHL, allowing you to tune score weights based on which signals most reliably predicted actual cancellation in your specific customer base.
Catch churn before it happens — churn prediction is part of the SaaS Snapshot
How does GHL know about login recency without an ML platform?
Your product fires a webhook to GHL on every user login event. GHL stores the last login timestamp in a custom date field. A daily time-based workflow runs for all active customer contacts and checks: (today's date) − (last login date) > 14 days. If yes, it applies the −20 score impact. No ML, no third-party tools — it's date arithmetic in GHL's native workflow engine.
Can the health score include NPS responses?
Yes — NPS score is one of the highest-weight churn predictors available. When a detractor NPS response arrives (score 0–6), the NPS survey workflow captures the score, updates the contact's NPS field, and the health scoring model applies a −20 score impact. This is pre-configured in the snapshot. If you use a third-party NPS tool like Delighted or Satismeter, their webhook output can be relayed to GHL via Zapier.
What happens to the score for accounts with multiple users?
The snapshot scores at the account level, not the user level. An account with 5 users is scored on aggregate signals — total login activity, total feature usage, any billing events — not individual user scores. A single inactive admin doesn't tank the account's health score if 4 other team members are active. The multi-user signal (+10) rewards accounts with broad adoption, since they're less likely to churn when multiple stakeholders are invested.
How do I backfill historical health scores for existing customers?
The snapshot includes a one-time bulk webhook flow: run your customer list through a script that fires a synthetic 'usage summary' webhook for each active customer, setting their initial health score based on their most recent 30 days of activity. Most teams can do this with a simple API call loop against their product database — the snapshot setup guide includes the payload schema.