Build a Churn Risk Score From Support Tickets
Build a Churn Risk Score From Support Tickets
Build a churn risk score from support tickets, product usage and billing: AI scores every account, writes the reason, and syncs both to your CRM.
No credit card required
Free 200 credits every month
The account that cancels in March usually warned you in November, just not anywhere your CRM looks. It filed four tickets about the same broken export, its replies went from "thanks!" to "any update?", and it asked twice for SSO. A churn risk score built from your support desk and product usage catches that pattern while there is still a renewal to save.
This guide builds one in Oneprofile. You connect your support desk and product analytics next to your CRM accounts, and AI reads each account's ticket history and usage curve. It scores churn risk and expansion likelihood, writes the reason in a sentence, and puts both on the CRM record the account owner already opens.
Churn signals in B2B SaaS that belong in a churn risk score
Not every signal deserves a place. The ones below share two traits: each shows up before the cancellation, and none can be bought from a data vendor, because they only exist inside your own stack.
Signal | Where it lives | What it usually means |
|---|---|---|
Sentiment souring across tickets | Support desk | Patience is running out, even at flat volume |
Same issue reopened or re-filed | Support desk | A bug they no longer believe you will fix |
Repeated asks for a missing feature | Support desk | They are looking at a product that has it |
Weekly active users or seats falling | Product analytics or database | The team stopped relying on you |
Failed payment, downgrade, or seat cut | Billing | Budget pressure, or an exit already underway |
Main contact inactive or gone | CRM and product usage | Nobody left who chose you |
Ticket count is missing on purpose. A customer who files a lot of tickets usually still wants the product to work. The accounts we worry about more are the ones whose tickets got shorter, or stopped, while logins fell.
A tangent, but NPS earns its place on this list less than people think. A detractor score arrives after the decision has been made, from whoever bothered to answer, and it rarely says what to fix.
Pull support tickets and product usage together
Everything below runs on direct connections. Start with the smallest useful set of accounts:
Bring your accounts in. Connect your CRM, whether that is HubSpot, Salesforce, Attio, or something else, and pull in the accounts renewing in the next two quarters. Starting with renewals keeps the first run small and makes every score matter.
Add ticket history from your support desk. Connect Zendesk with your subdomain and an API token, or connect Intercom, Freshdesk, or Help Scout. Tickets match to each account through the Zendesk organization's domain or the requester's email domain. Subject, description, status, priority, tags, and dates come with every ticket.
Add product usage. Connect PostHog, Mixpanel, or Amplitude, or give Oneprofile a read-only connection string to your Postgres database. Pull weekly active users, last login, and seats in use for each account.
Add billing from Stripe. Plan, MRR, renewal date, and any failed payments in the last 90 days.
The usual route to the same place is a warehouse: land tickets and events there, model them in dbt, then run an LLM pipeline over the result. If a data team already owns that stack, it works. Most companies under 200 people have no such team, and the customer-success suites that do this for you are priced for a CS department rather than a founder watching thirty renewals.
Every connection in this guide works on the $20 Team plan.
Build the churn risk score with AI across every account
Now describe churn risk the way you would brief a new account manager. Plain language is the whole configuration:
AI reads every account's tickets, usage, and billing, and it reads the whole list at once. That matters more than it sounds. A churn risk score of 70 means little on its own, but ranked against 150 other renewals it tells the owner which three calls to make this week.
The output looks like this:
Account | Churn risk | Reason |
|---|---|---|
Northwind Logistics | 82 | Four export tickets since August, tone sharpening; weekly actives down 40% since June |
Acme Analytics | 71 | Asked for SSO three times; champion last logged in six weeks ago |
Brightline Health | 35 | High ticket volume but positive tone; seats up from 12 to 18 |
Brightline is the account a rules-based health score gets wrong. Points per ticket would flag it. Reading the tickets shows a team that is growing and asking good questions. The same approach ranks prospects in ICP scoring with AI, and the reasoning carries over.
Track ticket sentiment over time, not per ticket
Per-ticket sentiment is what most help desks already show, and for churn it is close to useless. Every ticket is a little negative. Somebody wrote in because something broke.
What lets you predict churn from support tickets is the trajectory across them. A customer who opened with a two-paragraph repro in May and now writes "still broken" is a different account from one that has been curt since day one. Ask for the trend explicitly in the prompt, and have AI record it as its own field next to the score:
sentiment_trend: improving, flat, or souring over the last 90 days.last_negative_ticket: date and subject of the most recent frustrated ticket.senior_escalation: whether anyone above the day-to-day user has written in.
The last one earns its place. An admin complaining is routine. When a VP of operations opens a ticket, somebody has usually asked them why the company pays for this.
Extract unmet feature asks from ticket history
Anyway, back to the SSO request from the opening. Feature requests hide in tickets with subjects like "question about login" or "security review". Nobody tags them consistently, which is why product teams undercount them.
AI reading the full ticket history pulls them into one field per account, for example unmet_feature_asks: SSO via Okta (asked 3x), bulk CSV export. Two things come out of that:
The account owner gets a reason to call. A renewal conversation that opens with the thing they asked for three times goes better than a generic check-in.
Product gets a weighted list. Asks ranked by the MRR of the accounts making them. In our experience that list is more honest than any feature-voting board, because it only counts people who cared enough to write in.
The same read catches the opposite case. An account asking for more seats, higher API limits, or a second workspace is an expansion signal, and it feeds the expansion score that sits next to the churn one.
Write churn risk scores back to your CRM
A score in a tab nobody opens protects no renewals. Map the output to properties on the CRM company record. Oneprofile creates any property that does not exist yet, with the right field type, before it writes.
CRM property | Type | Example value |
|---|---|---|
| Number | 82 |
| Text | Four export tickets since August; weekly actives down 40% |
| Text | Souring |
| Text | SSO via Okta (3x) |
| Number | 15 |
Sync is two-way on every paid plan, so a re-run updates the same record instead of creating a second one. The write-back mechanics are covered on the customer data enrichment page.
Then set a schedule: weekly for accounts renewing within 90 days, monthly for the rest. Sentiment moves faster than usage does, and a churn risk score that ran once in January describes an account that no longer exists.
Edge cases that skew a churn risk score
Tickets with no company match. Requesters writing from personal email addresses will not match by domain. Filter unmatched tickets after the first run and fix the organization in your support desk; the next run picks them up.
Accounts younger than 90 days. Onboarding tickets look like frustration. Tell the prompt to discount the first 90 days, or leave new accounts out.
Accounts on two products. Tickets about the product they are leaving can hide inside a healthy total. Include product or brand in what the prompt weighs.
Scores that flatter. Once a quarter, check churned accounts against the score they held 60 days before cancelling. If most sat under 50, the prompt is weighting the wrong signals. Rewrite it and re-score every account in one pass.
Start with next quarter's renewals, one support desk, and one usage metric. The free plan includes 200 credits a month with no card, which is enough to score a small renewal cohort and see whether the reasons match what your account managers already suspect. Get started free.
What is a churn risk score?
Can you predict churn from support tickets?
What are the strongest churn signals in B2B SaaS?
Does a high ticket volume mean an account will churn?
Do I need a data warehouse to build a churn risk score?
How much does it cost to score churn risk this way?