A 0-100 signal that summarises how engaged and stable each account is. Start with the tier table below — everything else (how pillars are weighted, how trials are classified, what revenue stability means) lives in the collapsible sections further down.
The tier sets the urgency. The health_trend flag sets the timing (a falling 74 is more urgent than a stable 40).
| Range | Tier | First move |
|---|---|---|
| 80-100 | Thriving | Collect testimonials. Look for expansion / upsell signals. |
| 56-79 | Healthy | Monthly check-in. Drive targeted feature enablement to reach Thriving. |
| 25-55 | Steady | Proactive check-in email. Review adoption gaps and unblock activation. |
| 0-24 | At-risk | Contact immediately. Escalate if silent > 5 days. |
health_subscription (0-100) or health_trial (0-85, no Momentum).
Activation · Engagement · Depth · Team · Momentum.
Europe/Paris day boundaries, computed around 03:10.
Open a section to see the formula, pillar scoring tables, and edge cases.
5 pillars summed to 100. Momentum is skipped during trials.
health_score = activation + engagement + depth + team
+ (is_trial ? 0 : momentum)
activation (0-30) = 30 if Core CRM used, 15 if any feature, else 0
engagement (0-25) = round(min(login_days_30d / 12, 1) * 25)
depth (0-20) = min(unique_features_30d, 5) * 4
team (0-10) = 10 if 2+ users, 5 if 1 user, else 0
momentum (0-15) = 15 improving, 10 stable, 5 declining, 0 falling
health_trial = activation + engagement + depth + team (0-85)
health_subscription = health_trial + momentum (0-100)Did the account touch one of the 3 Core CRM features (Contacts, Conversations, Opportunities) for at least 60 seconds in the last 30 days?
Distinct login days in the last 30 days (score saturates at 12+ days).
Count of distinct features used ≥ 60s over the last 30 days, capped at 5.
Multi-user adoption. 2+ active users unlocks the full score.
30-day slope of the health score. Set to 0 during trials (not enough history). Binary thresholds at ±0.1/day.
Since the auto-research loop (2026-04-24), the final score also accounts for rules applied on top of the pillar sum.
Each location's health_score is computed as the sum of the 5 pillars plus any rules that matched for that location on that day. Rules are discovered weekly by the mining RPC and reviewed manually before activation.
The exact point table used for each of the 5 pillars.
Did the account touch a Core CRM feature in the last 30 days?
Distinct login days in the last 30 days. Score saturates at 12+ days.
Number of distinct features used ≥ 60s in the last 30 days, capped at 5. Settings and AI Agents are excluded.
Distinct user emails active on the account in the last 30 days. 2+ users is a strong retention signal.
30-day slope of the health score. Set to 0 during trials (not enough history). Binary thresholds at ±0.1/day.
A separate flag from the 0-100 score. Answers 'is the subscription healthy?' independently from 'is the product being used?'.
Not summed into the health score. Derived from the Stripe subscription state (stripe_subscription_current).
Behavioral segmentation for trialing accounts. Drives CSM outreach — not a pillar of the score.
Surfaced in the Summary Health "Trials stuck" panel (day 3-30, ranked by days in trial descending).
| Segment | Condition | Playbook |
|---|---|---|
| Dead dead_trial | No feature touched ≥ 60s in the last 30 days. | Priority onboarding call — activation blocker to unblock fast. |
| Exploring exploring_trial | Touched a feature, but not Core CRM (Contacts / Conversations / Opportunities). | Email nudge toward Core CRM — that's the 60% vs 20% conversion lever. |
| Hot hot_trial | Core CRM engaged (at least one of Contacts / Conversations / Opportunities used ≥ 60s). | Let conversion happen — don't over-contact, just keep the path clear. |
Walk through a real score computation end-to-end.
When scores refresh, where the columns live, how to sanity-check.
Scores are computed once per day by compute_location_health_daily, scheduled around 03:10 Paris time. Day boundaries use Europe/Paris so daily dashboards line up.
Common gotchas from CSMs and new team members.
Check the Momentum pillar first (30d slope), then Engagement (login days) and Activation (core CRM usage). The breakdown view shows which pillar moved.
Scores are recomputed on a daily job using Europe/Paris day boundaries (score_day). The latest timestamp lives in location_health_latest.computed_at.
Yes. Health score is a leading indicator, not a guarantee. Watch the health_trend flag: a client at score 74 but trend='falling' is a stronger churn signal than a stable 40.
Momentum needs 30 days of historical data to compute a slope. During a trial we set it to 0 — the score scale effectively shrinks to 0-85 (health_trial). This is not a penalty against the account; it just isn't summed in until post-conversion.
Revenue stability is reported separately from the score to avoid circular reasoning (a paying trial already 'converted' by definition). It takes 4 states: stable / unknown / at-risk / broken.
They were merged into v3 in April 2026. Engagement replaces Login Activity (30d window instead of 7d). Activation + Depth replace Feature Adoption (depth-first, CRM-focused). Team replaces Support Health. See docs/product/health-score-correlation-analysis.md for the rationale.
Activation is a 0-30 point pillar inside the health score (Core CRM used = 30, any feature = 15, nothing = 0). Trial segments (Dead / Exploring / Hot) are an independent classification for accounts currently in trial, used to drive CSM outreach — they don't feed into the score. A trialing account can have Activation = 15 pts AND segment = 'exploring_trial' at the same time; they describe the same data from two different angles.