Most customer health scores fail the same way: they look tidy on a dashboard, but the accounts that churn were green three months earlier. This guide shows you how to build a customer health score formula you can trust, with example weights, a worked calculation, and a simple way to test it against your own churn history.

What a customer health score is (and is not)

A health score is a single 0-100 number that combines several signals into a proxy for what a customer is likely to do next: renew, expand or leave. Gainsight describes it exactly that way, as a proxy for future behavior, and recommends keeping the score connected to other risk signals such as survey results instead of treating it as a separate metric.

It is not a measure of how much you like an account, and it is not a replacement for talking to the customer. Its job is to tell you where to spend your next hour.

Step 1: Pick 4 to 7 signals you can actually measure

Start with the data you already trust. Most published models draw from the same five groups, as in this example breakdown from Basedash:

  • Product usage: active users, core-action frequency, and the trend versus the previous period.
  • Adoption: features used, and active seats versus licensed seats.
  • Support: open tickets, severity, time to resolution.
  • Relationship and sentiment: executive sponsor engaged, last meaningful contact, NPS or CSAT, whether the champion is still there.
  • Commercial: failed payments, downgrades, days to renewal.

Gainsight's advice is to start with the most valuable components and refine over time. Six imperfect signals you can refresh automatically beat twenty you update by hand once a quarter.

Step 2: Score each signal from 0 to 100 first

Do not mix raw numbers. Convert each signal to its own 0-100 subscore, then weight those. Gainsight points out that component scores give CSMs "dials and levers": if the support subscore is the one dragging an account down, you know what to fix.

Basedash gives normalization examples you can copy:

  • Adoption: active seats divided by licensed seats, times 100, capped at 100.
  • Support: 100, minus 10 per open ticket, minus 25 per high-severity ticket, floored at 0.

Whatever rules you choose, write them down. A score nobody can explain is a score nobody acts on.

Step 3: Weight the signals

Published weights vary, which tells you they are judgment calls. Basedash uses 35% usage, 25% adoption, 15% support, 15% relationship and 10% commercial. Saber uses 40% usage, 25% engagement, 20% support, 10% financial and 5% relationship. Both put usage first, and both are vendor examples rather than studies, so treat them as starting points.

A reasonable first draft for a B2B SaaS team:

Health score =
    0.30 x Usage trend
  + 0.20 x Adoption
  + 0.15 x Engagement (last contact, meetings)
  + 0.15 x Support health
  + 0.10 x Sentiment (NPS / CSAT)
  + 0.10 x Billing

Weight trend above level. A high-usage account that dropped 40% last month is usually a bigger worry than a small account that has been steady for a year. Basedash makes the same argument.

Step 4: Add overrides so averages cannot hide a red flag

Simple averaging lets strong usage mask a serious problem, which Basedash lists as a common pitfall. Add a few hard rules that cap the score regardless of the weighted result. Basedash's examples:

  • Failed payment and renewal within 30 days: cap the score at 20.
  • High-severity ticket open and renewal within 30 days: cap the score at 30.

Pick two or three overrides that match how your customers actually churn, and keep the list short.

Step 5: Set bands, and attach an action to each

A band without an action is decoration. A common split is:

  • Healthy, 70 and above: light touch, look for expansion.
  • At risk, 40 to 69: CSM outreach, find the root cause of the drop, agree an adoption plan.
  • Critical, below 40: escalate, involve leadership, build a save plan with a deadline.

These thresholds match the ones Basedash lists. It also advises setting cutoffs where your historical churn clusters, not in even thirds. If churned accounts typically scored 50 to 60, your at-risk band should start higher.

Worked example

This is an illustrative example, not real customer data. Imagine an account with these subscores:

Signal        Subscore   Weight   Points
Usage trend      45       0.30     13.5
Adoption         70       0.20     14.0
Engagement       60       0.15      9.0
Support          80       0.15     12.0
Sentiment        50       0.10      5.0
Billing         100       0.10     10.0
-----------------------------------------
Total                              63.5

The score is 63.5, so the account is At Risk. The biggest drag is usage trend: it is the heaviest-weighted signal and the lowest subscore. The next step is clear: find out why activity fell, and who on the customer side stopped logging in. If this account renews in 30 days, an override might also apply, which is why you should check renewal dates alongside the score. Our 120-day renewal checklist shows what to do at each stage.

Step 6: Test the score against your own churn

This is the step most teams skip. Basedash recommends two checks:

  1. Backward: look at the score each churned account had 90 days before it left. If most were green, reweight or add signals.
  2. Forward: after a quarter, compare churn across bands. Critical accounts should churn at a clearly higher rate than healthy ones.

Saber's guidance is the same in spirit: find which metrics separated churned from renewed customers, weight by predictive strength, and recalibrate quarterly. It also suggests judging trends over 30 to 60 days rather than reacting to daily swings.

You do not need a data scientist. A spreadsheet with last year's churned and renewed accounts, and the value of each signal 90 days before renewal, is enough to see which signals mattered.

Mistakes to avoid

These come up repeatedly in the sources above:

  • Relying on one proxy such as logins or seats. Basedash lists single proxies such as logins or seat counts as a common pitfall, and Statisfy notes that high login rates do not guarantee real adoption.
  • Ignoring trend and using point-in-time counts.
  • Never recalibrating the weights.
  • Using one model for every segment. A self-serve account and an enterprise account rarely churn for the same reasons, so consider separate models, or a separate onboarding score for the first 90 days.
  • Defining bands with no owner and no action.

Checklist: ready to launch?

  • 4 to 7 signals, each with a clear data source
  • Each signal converted to a 0-100 subscore with written rules
  • Weights agreed with the CS team and documented
  • Two or three override rules for renewals with serious red flags
  • Bands with an owner and a default action
  • Backward test run on last year's churned accounts
  • A quarterly recalibration date in the calendar

How XPI CRM handles this

In XPI CRM, the health score runs from 0 to 100 and combines seven factors: usage trend, engagement, sentiment, NPS, billing, open work and support tickets. You can adjust each weight, and setting a weight to 0 switches that factor off, which makes it easy to start with a simpler model. Bands are Healthy at 70 and above, At Risk from 40 to 69, and Critical below 40, and alerts fire on usage drops, no contact, overdue invoices, detractors, at-risk renewals and score drops. See the help guides for setup details.

Try it in XPI CRM

Start with the draft formula above, then adjust the weights in XPI CRM until the score would have flagged the accounts you lost last year. Every feature is included. Start free - every feature included, no credit card.