River
Y CombinatorBacked by Y Combinator
FREE TEMPLATE

Customer Health Score Template

Every signal measured against the accounts that actually left, on lift, lead time and coverage, so the weights come from data rather than a workshop.

Free download  ·  No account needed

Six signals, two numbers each. Lift says the signal knows something. Lead time says whether knowing is any use.

SignalLiftLead timeVerdict
Support tickets above 3x baseline4.18x11 daysAlert, no weight
Invoice more than 15 days late3.68x6 daysAlert, no weight
Sponsor no login in 30 days2.64x74 days38% of the score
Weekly active users down 25%2.39x96 days35% of the score
Under 3 of 8 core actions used1.88x141 days27% of the score
Satisfaction average below 4.01.51x38 daysCut, 14.8% coverage

The two best discriminators fire inside the notice period. This renewal motion needs 60 days, so both became an alert list and 40 points of weight moved onto signals that fire in time.

Every health score template hands you six signals, a weight column that adds to 100, and a red-amber-green formula. The weights came from a workshop. Nobody checked whether the score separates the accounts that left from the accounts that stayed, because that check needs churn data the template author never had. Halfmoon Software ran one for a year. Of 47 churn events across 412 accounts, its Red band caught 8. Nearly half of the 47 sat in Green.

So every signal here earns its weight. Take the accounts where it fired, measure what share churned, divide by the base rate of 11.4%. That ratio is the first bar. Then measure the median days between the first firing and the date the customer decided, which a subscription record keeps in a different field from the date service ended. That is the second bar, and it is the one that reorders everything.

Support volume above baseline lifts churn probability 4.18 times, the best number on the sheet, and it arrives 11 days before the decision. Payment lateness arrives 6 days before. Both are consequences of a decision already taken, so both became alerts rather than weights. Coverage is the third bar, and it cut satisfaction scores outright. Forty points of weight moved, recall went from 17% to 62%, and the renewal brief finally has a list worth reading. Every account in the new Red band was flagged before it decided.

Where the weights came from, and what they bought

Every number on these three sheets reconciles to the same book: 412 accounts, 47 churn events, a base churn rate of 11.4%.

Signal Weights

Illustrative rows for a fictional B2B software company, Halfmoon Software. 412 accounts, 47 churn events over four quarters, base churn rate 11.4%. Lift is the churn rate when the signal fires, divided by that base rate.

SignalAssumed weightFired onChurn rate when firedLiftMedian lead timeCoverageVerdictEarned weight
Open tickets above 3x the account's own baseline15%4447.7%4.1811 days100%Real discrimination, no time to act0%
Invoice paid more than 15 days after the due date15%3141.9%3.686 days100%Fires after the decision, not before0%
Named executive sponsor no login in 30 days15%6330.2%2.6474 days70.1%Keep, once the sponsor field was backfilled38%
Weekly active users down 25% over 8 weeks25%8827.3%2.3996 days100%Keep, second strongest of the survivors35%
Fewer than 3 of the 8 core actions used in 30 days20%12121.5%1.88141 days100%Keep, weakest and earliest by a wide margin27%
Satisfaction average below 4.010%2917.2%1.5138 days14.8%Fails all three bars at once0%
Provisioned seats below 60% of contracted seatsn/a9622.9%2.01118 days100%Candidate, held one quarter before weightingpending
Survey score below 7n/a1816.7%1.4652 days8.5%Rejected before weighting on coverage0%

The two rows the workshop weighted on instinct are the two rows with the highest lift and the shortest lead time. Cutting them released 40 points of weight, which the three survivors absorbed in proportion to the lift they earned: 2.64, 2.39 and 1.88 sum to 6.92, giving 38%, 35% and 27%.

Prediction Accuracy

Both score versions run over the same window, the same 412 accounts and the same 47 churn events, so the comparison is a like-for-like scoreboard rather than a rebuild.

Score versionBandAccountsChurnedChurn rate in bandLiftShare of all churn caughtMedian lead timeFlagged before the decision
Assumed weightsRed34823.5%2.0617.0%12 days5 of 8
Assumed weightsAmber1181714.4%1.2636.2%19 days9 of 17
Assumed weightsGreen260228.5%0.7446.8%n/a0 of 22
Earned weightsRed712940.8%3.5861.7%68 days29 of 29
Earned weightsAmber1041211.5%1.0125.5%44 days10 of 12
Earned weightsGreen23762.5%0.2212.8%n/a0 of 6

The Red row is the one everybody reads and the Green row is the one that matters. A Green band at lift 0.74 was carrying 22 of 47 churn events, which is what a health score looks like when nobody has ever checked it. At 0.22 the band finally means something. The Red band also doubled in size, and that is a real cost: 71 accounts is more review than 34, and the accuracy sheet is where that trade gets argued with numbers instead of instinct.

Score by Account

Twelve accounts from the same book. Components are shown rather than only the total, because an account at 54 on one collapsed signal needs a different response from an account at 54 on three soft ones.

AccountARRDays to renewalSponsor last loginUsage changeCore actionsSponsor (38)Usage (35)Adoption (27)ScoreBandPriorPlay
Ardenway Group$148,0005461 days-8%6 of 80.027.027.054Red71Sponsor left in March. Re-sponsor before renewal opens
Brackwell Foods$96,0001184 days-6%7 of 838.029.027.094Green82No play
Calderfield Health$212,0004111 days-12%2 of 837.223.05.466Amber68Adoption never recovered after the release. Re-onboard
Dunmoor Logistics$74,00020312 days+3%6 of 836.535.027.098Green79No play
Elverton Retail$305,0002244 days-29%3 of 812.26.010.829Red64Cancel already scheduled and still reversible. Escalate today
Fennhollow Media$51,0001679 days-14%5 of 838.021.021.681Green74Watch. Usage soft, sponsor engaged
Gasforth Manufacturing$189,0007633 days-21%4 of 820.514.016.251Red70Two signals drifting together. Book a business review
Havenridge Bank$268,000955 days+2%8 of 838.035.027.0100Green88No play. Candidate reference account
Inglebrook Labs$63,0003347 days-26%3 of 89.99.010.830Red59Three signals firing inside the notice period. Escalate
Jarrowdale Utilities$121,00014918 days-9%6 of 831.926.027.085Green81No play
Kelverly Insurance$157,0006827 days-4%3 of 825.131.010.867Amber72Adoption is the only gap. Enablement, not escalation
Larkmoss Education$88,0001128 days-2%7 of 838.033.027.098Green84No play

Ardenway Group is the case that justifies the rebuild. Nothing about the account got worse. Its sponsor left in March, the old model had no way to notice, and the two signals that would have noticed anything were tickets and invoices, both clean because nobody at Ardenway was upset yet. It went from 71 to 54 on a single component collapsing to zero.

What the pack does that a weight column does not

01

Earns every weight against your own churn

Take the accounts where a signal fired, measure what share churned, divide by the base rate across the book. That ratio sits next to the weight the signal currently carries, and seeing the two numbers adjacent is what settles the argument in a room.

02

Measures how early each signal fires

Median days between a signal's first firing and the date the customer decided. Compared against the renewal motion's own requirement, which is the notice period plus the time a save play needs. Signals below that floor are cut whatever their lift.

03

Moves the late signals to an alert list

Support volume and payment lateness are the two best predictors on most books and the two least usable. They become a same-day alert to the CSM and the renewal owner, with the reasoning written down so nobody puts them back next quarter.

04

Refuses a weight to a signal that cannot see your base

A satisfaction score needs a ticket that was filed, resolved and then rated. On the worked example that is 61 of 412 accounts, so the other 351 were carrying a defaulted tenth of their score. Coverage below 60% is a cut.

05

Catches the signals whose meaning quietly changed

A login prompt disappearing behind single sign-on, two features merging in a release, a help centre cutting ticket volume. The test is the base churn rate: if a population median moved sharply and churn did not, measurement changed and the accounts did not.

06

Reports whether the rebuild was actually an improvement

Both versions scored over the same window and the same churn events, with recall, precision, lift and lead time per band. That comparison is the only thing separating a real improvement from a rearrangement of the same numbers, and it is the same test stage definitions get against stage history.

How the pack runs

  1. 1

    Send the churn list

    Accounts that ended in the last twelve months, with the date each customer decided rather than the date service stopped, plus whatever usage, ticket and billing history exports.

  2. 2

    Measure three bars

    Every candidate signal gets a lift against the base churn rate, a median lead time against the decision date, and a coverage figure against the whole book.

  3. 3

    Weight what survived

    Survivors are weighted in proportion to the lift they earned. Cuts get a documented reason, and the ones that discriminate but fire late become alerts instead.

  4. 4

    Score and set the scoreboard

    The book is scored with components visible per account, bands drawn from the accuracy sheet, and the new version reported against the old one on the same window.

Frequently asked questions

Why cut the two signals that predict churn best?

Because they are measuring the aftermath of a decision, not the run-up to one. Support volume spikes once a team has started extracting its data. Payment goes late once nobody is defending the line item. Both arrive inside the notice period, which is a report rather than a warning.

What is the difference between the decision date and the end date?

Whatever was left on the paid term. A subscription set to cancel at the end of its period keeps a live status throughout, and the schedule can be reversed at any point before the term ends. Measure lead time against the end date and every signal looks months earlier than it is.

We have no clean churn data. Is this pointless?

No, but it is a different product and worth saying so plainly. Without churn history the weights cannot be earned, so the space defines every signal precisely, sets up the measurement, and starts the clock. The first real recalibration is then possible a quarter out instead of never.

Why does coverage disqualify an accurate signal?

Because a signal only scores the accounts it can see, and the rest get a default. A satisfaction rating can only be created for a resolved ticket, and only by the person who filed it, so it is structurally blind to every account that never contacted support.

Our scores drift down across the whole book. What causes that?

Usually a definition change nobody logged. Analytics platforms apply group and property changes to new data and leave history alone, so a window spanning the change averages two different signals. The test is the base churn rate: if that held flat, measurement moved and your customers did not.

How is this different from the score in our CS platform?

The platform computes and displays a score. It does not tell you whether the weights it is computing are worth anything, because it has no view of your churn outcomes joined back to the signal history. This pack is the calibration layer, and its output can drive whichever tool renders the number. Same relationship a metric definition has to the dashboard plotting it.

Does this depend on our fields being clean first?

Coverage does, and the sponsor signal is the clear case: it needed 39 blank fields backfilled before it cleared the bar. A field dictionary and account-level survivorship rules are what stop a duplicate account splitting one customer's usage across two rows.

Find out what your health score is actually predicting

Send twelve months of churn with the decision dates, plus your usage, ticket and billing exports, and get the measured weights back.

Get the template