The cancellation webhook is the last thing that happens. The churn decision was made 6–8 weeks earlier.
This is the core problem with reactive churn management. The customer stopped finding value, started looking at alternatives, and mentally moved on — all while appearing in your MRR figures as “active.” By the time the cancellation form is submitted, the conversation that could have saved the account is 45 days in the past.
Behavioral health scores change this model. They’re a weekly composite measurement of the signals that predict churn before the customer consciously decides to leave — giving your CS team a real intervention window instead of a post-mortem conversation.
What a health score actually measures
A health score is a composite number — typically 0–100 — calculated from behavioral signals that predict whether an account will renew or churn. The specific signals depend on your product, but the signal categories are consistent across most SaaS businesses.
Engagement signals (positive weight):
- Login frequency in the last 30 days. Not just “has logged in” — frequency matters.
- Core feature action count. The number of times a user took your product’s key action (submitted a form, ran a workflow, exported a report, sent a message — whatever is most central to your value proposition).
- Seat utilization rate: active seats ÷ licensed seats. Low utilization on a team plan is a churn signal — the team isn’t using what they’re paying for.
- Integration depth: number of integrations connected. Products deeply embedded in a customer’s workflow are significantly harder to churn.
- Recent support ticket resolution: fast resolution correlates with satisfaction; unresolved tickets older than 7 days correlate strongly with churn.
Risk signals (negative weight):
- Days since last login. A 14-day login gap on a daily-use product is a serious signal.
- Usage trend direction: is the 30-day action count higher or lower than the 60-day average? Declining trend is more predictive than absolute level.
- NPS score below 7.
- Active billing issues: failed payments in the last 30 days.
- Feature adoption stagnation: account created 90+ days ago but still using < 3 core features.
Example scoring model
Here’s a concrete starting framework for a mid-market B2B SaaS product (Starter/Pro/Scale tiers, team-based):
| Signal | Direction | Weight | Data source |
|---|---|---|---|
| Logins last 30 days ≥ 10 | Positive | +20 | Product webhook |
| Core event count last 30 days ≥ 20 | Positive | +20 | Product webhook |
| Seat utilization ≥ 60% | Positive | +15 | Billing webhook |
| Integration ≥ 1 connected | Positive | +10 | Product webhook |
| NPS score 9–10 | Positive | +20 | NPS workflow |
| NPS score 7–8 | Positive | +10 | NPS workflow |
| NPS score 0–6 | Negative | -20 | NPS workflow |
| Days since last login ≥ 14 | Negative | -15 | Product webhook |
| Open support ticket > 7 days | Negative | -20 | Helpdesk webhook |
| Failed payment in last 30 days | Negative | -20 | Billing webhook |
Maximum score: 85 (all positive signals, no risk signals). Minimum score: -55. Normalize to 0–100.
Validate this model against your historical churn data within 90 days of running it: accounts that churned should have had significantly lower scores 45–60 days before cancellation. Adjust weights if the model isn’t discriminating clearly.
Building the health score in GHL
The SaaS Snapshot implements health scores as a custom contact field (health_score) updated by a scheduled workflow running every Monday at 6am.
Step 1: Configure product event webhooks
Your product must send behavioral events to GHL so the health score calculation has live data. Configure your product to POST events to the GHL webhook endpoint (included in the snapshot) on:
- User login (include account ID, user ID, timestamp).
- Core feature events (include account ID, event name, timestamp).
- Seat activity (include account ID, active_seat_count, licensed_seat_count).
- Integration connected/disconnected events.
Each event updates the corresponding custom field on the GHL contact record. The health score calculation workflow reads these fields — it can’t function without live data from your product. Set up the webhooks in week one. If you use Zapier rather than direct webhooks, configure the Zapier GHL integration to pass the relevant fields.
Step 2: The health score calculation workflow
The calculation workflow runs on a weekly scheduled trigger (every Monday, 6am). For each paying account in the “Converted” pipeline stage:
- Read raw signal values from custom fields.
- Apply weighting formula using GHL’s mathematical action blocks.
- Normalize result to 0–100.
- Write to
health_scorecustom field. - Write
health_score_trend(current score minus previous week’s score — positive = improving, negative = declining). - Evaluate score against thresholds and branch accordingly.
Step 3: Alert branches
The SaaS Snapshot ships three alert branches:
Red zone (score < 40): Immediate high-priority task created for the assigned CS rep. Automated personal email from the account owner (written to read like a person, not a sequence email): “Hi [Name], I noticed you haven’t been in [Product] as often lately — wanted to check in personally. Is there something we could do better, or something I can help you with? Happy to spend 20 minutes on a quick call if useful.” Calendar booking link inline.
Yellow zone (score 40–65): Low-priority CS task. Automated email with 2–3 targeted resources tied to features the account likely hasn’t adopted (pulled from the health score data — if seat utilization is the weak signal, email about team features; if integration depth is low, email about integrations).
Green zone recovery (previously red/yellow, now ≥ 70): Close the at-risk task. Log the recovery event (date, prior score, current score, what CS action preceded the recovery). Do not send an email — let the account breathe. The recovery event becomes a data point for understanding what interventions work.
The intervention that actually saves accounts
The health score alert is only as valuable as the CS response it triggers. And the highest-performing CS interventions share three characteristics: they’re personal, specific, and fast.
Generic approach (low recovery rate): “Hi [Name], we noticed you haven’t logged in as much lately. Here are some resources to help you get started.”
Personal + specific approach (high recovery rate): “Hi [Name], I was looking at your account and noticed your team has been using [Product] for project management but hasn’t connected your CRM yet — that’s usually where customers get the most value because [specific outcome]. Would you be up for a 20-minute screenshare? I can have it configured for your workflow before we get off the call.”
The second approach requires knowing something specific about the account. The health score data — especially the event-level signals — gives you exactly that context. Logins are low + no integrations connected = surface the integration value prop. Seat utilization is low = address team adoption. Support ticket is open = resolve the ticket first, retention conversation second.
What good looks like at 90 days
With health score monitoring and alert workflows running for 90 days:
- CS team shift: from reactive (fielding cancellation requests) to proactive (catching accounts at 35-point health scores with 60 days of intervention runway).
- NRR improvement: typically 5–10 percentage points in the first 90 days for teams that weren’t running any proactive retention before. At $300k ARR, five points of NRR improvement is $15k/year retained.
- Model validation: you now have 90 days of actual health score data matched against churn events. You can see which signals most accurately predicted the churns that actually happened and recalibrate weights accordingly.
- Cultural shift: “This account is at 32” means something specific to everyone in the Monday CS standup. Shared vocabulary around account health changes how CS teams prioritize their time.
Combining with NPS
Health scores and NPS are complementary signals that disagree more often than you’d expect.
An NPS score is a point-in-time self-report: how the customer felt in the 5 minutes they filled out the survey. A health score is a continuous behavioral measure: what they’re actually doing week over week.
Accounts that score NPS 8 but show a 3-week login gap and declining feature usage are a specific at-risk profile — “lukewarm advocates who are quietly disengaging.” Neither signal alone catches them; both together do.
The SaaS Snapshot wires NPS responses into the health score calculation automatically. A detractor response immediately decrements the health score by 20 points — potentially triggering a same-day CS alert for an account that was already in yellow zone.