Results
The company entered the engagement with a familiar pattern. Renewals were tracked through a quarterly health review that combined NPS, support ticket volume, and CSM sentiment scores. The outputs were directionally correct on the worst-performing accounts and useless on everything else. Expansion was a separate motion entirely, run by AEs working off rep intuition and renewal-date proximity. Roughly 1,400 active accounts, four CSMs, and no defensible way to decide which fifty to call this week.
The brief was narrow on purpose: build a score that predicts the next ninety days of account behavior — both downside (contraction, churn) and upside (seat expansion, module attach) — and integrate it into the workflow the CS team already runs. No new tools. No new headcount. No reorg.
What the noise actually was
The first finding was that the existing health score was almost entirely lagging. NPS lags engagement by a quarter. Ticket volume rises only after a customer has already encountered enough pain to file. Executive sponsor changes are detected through LinkedIn scraping that runs monthly and is wrong about a third of the time. By the time any of these signals moved, the renewal conversation was already adversarial.
The second finding was that the leading signals existed — they were just sitting in three different systems that nobody had stitched together. The product database held event-level telemetry on ~140 distinct features. The support platform recorded not just ticket counts but the textual content of in-app conversations and the time-to-first-response distribution per account. The commercial system held seat-level license utilization, contracted vs. consumed module data, and historical contraction events.
What was built
A feature engineering layer pulled signals from each of the three sources on a daily cadence. Product usage was decomposed into four dimensions: depth (how many features touched), breadth (how many users active), cadence (whether usage was concentrated in a handful of days or sustained), and trajectory (30/60/90-day deltas, weighted toward recency). Support signals included sentiment-scored ticket content, ratio of self-resolved to escalated tickets, and a “frustration cluster” detector trained on the prior eighteen months of churned-account ticket histories. Commercial signals included license utilization rate, modules paid for but not deployed, and tenure-adjusted expansion velocity.
These rolled up into two scores per account, refreshed weekly: a contraction-risk score and an expansion-readiness score. Both were calibrated against the prior two years of outcomes, with thresholds set so that the top decile of expansion-readiness captured 70% of actually-realized expansion in the holdout period.
How it was operationalized
The model output was not a dashboard. It was a ranked queue, delivered into the CS team’s existing CRM views every Monday morning, with the top fifteen contraction-risk accounts and the top fifteen expansion-ready accounts flagged with the two or three signals driving the score. Reps were asked to log outcomes in the existing call-disposition fields; those outcomes fed back into the next training cycle.
Result
In the first six months after deployment, the expansion-readiness queue drove $4.0M of new expansion ARR — measured against a randomized control cohort of accounts excluded from the queue, which produced a 38% lower expansion conversion rate over the same period. Time from a leading-indicator trigger to a CSM touch dropped from a quarterly cadence to eleven days. The contraction-risk side of the score is still being measured against renewal outcomes, but the early read is that gross retention has moved by roughly a point and a half on the cohort whose risk score the team acted on.
The deeper outcome was organizational. CS and AE motions, previously separated by a renewal-date wall, now share a queue and a vocabulary. Expansion stopped being something that happened to accounts and started being something the team caused.