DocsHealth Score

Health Score — 2-min intro

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.

Getting started

See a score → pick a playbook

The tier sets the urgency. The health_trend flag sets the timing (a falling 74 is more urgent than a stable 40).

RangeTierFirst move
80-100ThrivingCollect testimonials. Look for expansion / upsell signals.
56-79HealthyMonthly check-in. Drive targeted feature enablement to reach Thriving.
25-55SteadyProactive check-in email. Review adoption gaps and unblock activation.
0-24At-riskContact immediately. Escalate if silent > 5 days.
Rule of thumb: the score tells you how bad, the health_trend tells you how fast. Combine both before choosing an outreach cadence.
Scale
0 → 100

health_subscription (0-100) or health_trial (0-85, no Momentum).

Pillars
5

Activation · Engagement · Depth · Team · Momentum.

Refresh
Daily

Europe/Paris day boundaries, computed around 03:10.

Deep dives

Open a section to see the formula, pillar scoring tables, and edge cases.

Formula

How the score is calculated

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)
Pillar weights
Activation30% • 30 pts

Did the account touch one of the 3 Core CRM features (Contacts, Conversations, Opportunities) for at least 60 seconds in the last 30 days?

Engagement25% • 25 pts

Distinct login days in the last 30 days (score saturates at 12+ days).

Depth20% • 20 pts

Count of distinct features used ≥ 60s over the last 30 days, capped at 5.

Team10% • 10 pts

Multi-user adoption. 2+ active users unlocks the full score.

Momentum15% • 15 pts

30-day slope of the health score. Set to 0 during trials (not enough history). Binary thresholds at ±0.1/day.

Revenue stability (Stripe status) is exposed as a separate axis (stable / unknown / at_risk / broken) and is not rolled into the 0-100 health score.
Rules layer

Score = Pillars + Rules

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.

health_score = pillars_sum + rules_delta_total, clamped to [0, 100] (or [0, 85] for trials).
Per-pillar scoring

Pillar breakdown

The exact point table used for each of the 5 pillars.

Activation
30 pts max

Did the account touch a Core CRM feature in the last 30 days?

Core CRM
ContactsConversationsOpportunities
Core CRM used (Contacts / Conversations / Opportunities)30 pts
Any other feature used ≥ 60s15 pts
No feature activated0 pts
Engagement
25 pts max

Distinct login days in the last 30 days. Score saturates at 12+ days.

12+ days25 pts
10 days21 pts
8 days17 pts
5 days10 pts
3 days6 pts
1 day2 pts
0 days0 pts
Note: score saturates at 12, but the power-user cluster (0% observed churn over 60d) sits at login_days_30d ≥ 16 — see v_power_users.
Depth
20 pts max

Number of distinct features used ≥ 60s in the last 30 days, capped at 5. Settings and AI Agents are excluded.

5+ distinct features used20 pts
4 features16 pts
3 features12 pts
2 features8 pts
1 feature4 pts
0 features0 pts
Team
10 pts max

Distinct user emails active on the account in the last 30 days. 2+ users is a strong retention signal.

2+ active users10 pts
1 active user5 pts
0 active users0 pts
Momentum
15 pts max

30-day slope of the health score. Set to 0 during trials (not enough history). Binary thresholds at ±0.1/day.

Improving (slope > +0.1/day)15 pts
Stable (|slope| ≤ 0.1/day)10 pts
Declining (-0.3 < slope ≤ -0.1/day)5 pts
Falling (slope ≤ -0.3/day)0 pts
Parallel axis

Revenue stability

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).

StableActive paying subscription, not cancel-at-period-end.
UnknownTrialing, or no subscription data yet.
At-riskpast_due / unpaid / cancel_at_period_end = true.
BrokenSubscription canceled.
Trial classification

Trial segments (Dead / Exploring / Hot)

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).

Empirical base rate: converted trials activate Core CRM at ~60%, churned trials at ~20%. That 3× gap is why the "Trials stuck" panel filters out Hot (already on the conversion path) and focuses CSM effort on Dead and Exploring.
SegmentConditionPlaybook
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.
Source of truth: public.v_trial_stuck (migrations 082_health_v3_alert_views.sql, refined in 092_expose_revenue_stability_in_alert_views.sql). CASE derives trial_segment from used_any_feature and used_core_crm (both coming from location_activation_30d).
Example

Worked example — paying account

Walk through a real score computation end-to-end.

Sample paying account (not in trial)
Activation (touched Contacts this month)30 pts
Engagement (10 login days / 30)21 pts
Depth (4 distinct features)16 pts
Team (2 active users)10 pts
Momentum (stable trend)10 pts
Total Health Score87
Revenue stabilityStable
Ops

Data freshness & source of truth

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.

  • location_health_latest.computed_at — last refresh timestamp.
  • location_health_daily — historical series (90 days retained).
  • trend_flag + slope_30d — raw columns behind the health_trend JSON key.
Tip: if scores look stale, run the daily computation job before investigating account-level issues.
FAQ

Frequently asked questions

Common gotchas from CSMs and new team members.

Why did a score drop suddenly?

Check the Momentum pillar first (30d slope), then Engagement (login days) and Activation (core CRM usage). The breakdown view shows which pillar moved.

How often is the score updated?

Scores are recomputed on a daily job using Europe/Paris day boundaries (score_day). The latest timestamp lives in location_health_latest.computed_at.

Can a high score still churn?

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.

Why is the Momentum pillar 0 during a trial?

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.

What about revenue?

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.

Where did the old Login Activity / Feature Adoption / Support Health factors go?

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.

What's the difference between the Activation pillar and a trial segment?

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.

Related features