Churn Risk Scanner
Scores renewal risk for every account from usage decline, license utilization, support burden, CSAT sentiment, champion departure, and invoice history, then ranks the book by weighted ARR at risk with the specific evidence behind each…
At a glance
Churn Risk Scanner is an AI skill that you can use in Claude Code, Codex, or type.com.
- Updated
See an example
Example output from a sample run. Company names and figures are sample data.
Churn risk scan: 10 accounts, as of 2026-09-22
$762,432 of $2,405,000 book ARR (31.7%) is weighted at risk. Atlas Bio Labs is the only critical account (score 84.8, $262,880 at risk). Cascade Fintech and Quill and Bramble Retail score high and renew in 39d and 18d.
| Tier | Accounts | ARR at risk |
|---|---|---|
| critical (score >= 70) | 1 | $262,880 |
| high (score >= 50) | 2 | $148,712 |
| medium (score >= 30) | 3 | $220,840 |
| low (score >= 0) | 4 | $130,000 |
| # | Account | Risk | ARR at risk | Renews | Evidence |
|---|---|---|---|---|---|
| 1 | Atlas Bio Labs | critical 84.8 | $262,880 of $310,000 | 2026-12-15 (84d) | Key actions -48.3%, active users -40.6%, CSAT 2.60, every champion has left |
| 2 | Meridian Manufacturing | medium 30.5 | $115,900 of $380,000 | 2027-02-28 (159d) | Key actions -5.7%, 6 tickets in 90d |
| 3 | Cascade Fintech | high 64.2 | $115,560 of $180,000 | 2026-10-31 (39d) | Key actions -17.4%, active users -18.5%, $60,000 unpaid past due |
| 4 | Kestrel Payments | low 17.8 | $92,560 of $520,000 | 2026-12-31 (100d) | No champion on record, 5 tickets in 90d |
| 5 | Harbor Point Health | medium 37.2 | $89,280 of $240,000 | 2026-11-05 (44d) | 12 tickets in 90d, 3 P1, CSAT 3.33 |
| 6 | Silverline Energy | low 24.0 | $36,000 of $150,000 | 2027-01-20 (120d) | 69 of 250 seats active (28%) |
| 7 | Quill and Bramble Retail | high 51.8 | $33,152 of $64,000 | 2026-10-10 (18d) | Key actions -23.4%, active users -22.1%, 28 of 60 seats active |
| 8 | Lantern Bay Hotels | medium 34.8 | $15,660 of $45,000 | 2026-10-05 (13d) | 2 unpaid past due ($22,500 outstanding) |
…plus 2 more accounts in the full report, each with a factor-by-factor score breakdown.
Quill and Bramble Retail has no CSAT responses in the last 180d, so its sentiment weight of 15 is redistributed and it is scored on 85 of 100 available weight points.
Inputs: accounts, monthly usage, support, contacts and invoices files, plus config/risk_model.json. Weights: usage_decline 25, user_attrition 15, license_utilization 10, support_burden 15, sentiment 15, champion_departure 10, invoice_history 10.
Produced by running bash examples/run.sh on the sample data bundled with this skill.
How to use Churn Risk Scanner
- type.com: Choose Use Skill to add Churn Risk Scanner to your type.com workspace.
- Claude Code: Download the skill and extract it into
~/.claude/skills/churn-risk-scanner/(or.claude/skills/churn-risk-scanner/in a project). Then ask Claude to use Churn Risk Scanner. - Codex: Download the skill and extract it into
~/.agents/skills/churn-risk-scanner/(or.agents/skills/churn-risk-scanner/in a repository). Then ask Codex to use Churn Risk Scanner.
AI agents can read this page as Markdown or fetch the raw SKILL.md.
Frequently asked questions
What is Churn Risk Scanner?
Churn Risk Scanner is an AI skill that you can use in Claude Code, Codex, or type.com.
What does Churn Risk Scanner do?
Scores renewal risk for every account from usage decline, license utilization, support burden, CSAT sentiment, champion departure, and invoice history, then ranks the book by weighted ARR at risk with the specific evidence behind each…
Can I use Churn Risk Scanner in Claude Code or Codex?
Yes. Churn Risk Scanner is a standard Agent Skills folder with a SKILL.md file. Download it and extract it into ~/.claude/skills/ for Claude Code or ~/.agents/skills/ for Codex.
Who created Churn Risk Scanner?
The type.com team created Churn Risk Scanner. The type.com team reviews every skill before it is published in the Skills Library.
Related guide
Browse the technical files
--- name: churn-risk-scanner description: Scores renewal risk for every account from usage decline, license utilization, support burden, CSAT sentiment, champion departure, and invoice history, then ranks the book by weighted ARR at risk with the specific evidence behind each score. --- # Churn Risk Scanner Turns five operational exports into a ranked list of accounts by how much ARR is actually at risk, with the reasons attached. Seven weighted factors, all defined in a config file, all showing their arithmetic. Nothing is a black box, so a CSM can argue with a score instead of ignoring it. ## Before you run This skill ships scripts and sample data alongside this SKILL.md. Before running any command: 1. **Get the files.** Make sure the skill's other files (`scripts/`, `examples/` and anything else listed with this skill) are in your working folder at the same relative paths. Some environments load only SKILL.md; if yours did, fetch each file from this skill's published files and write it to the matching path. In Type, read them with the skill-file tools. Anywhere else, the Type Skills Library API lists every file with its path, content and `sha256`: GET `https://api.type.com/api/public/library/skills` and take the entry with slug `churn-risk-scanner`. 2. **Check the copies are exact.** Compare each file's size in bytes, not characters (and its hash, where your tools report one), with the published version before running. A copy written out from the published file is fine once its byte size and hash match; never run a script you summarised or reconstructed from memory. 3. **Run from the skill's folder**, calling interpreters explicitly: `python3 scripts/…` and `bash examples/run.sh`. 4. **Try the sample first.** If the skill ships `examples/run.sh` and `examples/expected_output.txt`, run `bash examples/run.sh`; its output should match the expected file exactly. If it doesn't, stop and report the first differing line rather than running on real data. ## When to use this - Weekly or monthly renewal-risk review for a CSM book or a whole region. - Before a renewal forecast, to separate "large account, small problem" from "small account, terminal problem" — they look identical in a health-score dashboard and completely different when ranked by ARR at risk. - After a support incident or a champion's departure, to see which accounts the change actually moves. For one account in depth, use `qbr-deck-builder`. This skill is the portfolio view. ## Inputs `DATA_CONTRACT.md` has the exact columns, types, and units. You need five files: 1. `accounts.csv` — ARR, segment, renewal date, CSM. 2. `usage_monthly.csv` — active users, licensed seats, key actions per month. 3. `support.csv` — tickets with priority, escalation flag, and CSAT. 4. `contacts.csv` — contacts with roles and departure status. 5. `invoices.csv` — invoice, due, and paid dates. ### Gathering the inputs through Type integrations - **Accounts**: Salesforce, HubSpot, or Attio for ARR, renewal date, segment, and CSM owner. Use billing (Stripe, NetSuite, Chargebee) if CRM ARR drifts. - **Usage**: the product warehouse (Snowflake, BigQuery, Postgres) or product analytics (Amplitude, PostHog). Export at least `history_months` months so both trend windows are complete. - **Support**: Zendesk, Intercom, Plain, or Jira Service Management, including the escalation flag and CSAT responses. - **Contacts**: the CRM contact object. The `role` and `status` fields are what make champion departure detectable — if nobody maintains them, say so in the readout instead of pretending the factor is clean. - **Invoices**: billing or the finance warehouse. Due date and paid date are what matter; amount is used only to size overdue balances. Every file may cover the whole book; the tool joins on `account_id` and fails loudly if a row references an account that is not in `accounts.csv`. ## Running it ```bash python3 scripts/churn_scanner.py \ --accounts path/to/accounts.csv \ --usage path/to/usage_monthly.csv \ --support path/to/support.csv \ --contacts path/to/contacts.csv \ --invoices path/to/invoices.csv \ --config config/risk_model.json \ --as-of 2026-09-22 ``` - `--as-of` is required and is the only source of "today". - `--renewal-within N` scores only accounts renewing in the next N days. - `--top N` prints only the N riskiest accounts; the summary still covers all. - `--json` emits every factor, score, contribution, and evidence string. - Bad input exits `2` naming the file, row, and column. See `examples/run.sh` for a complete working invocation. ## How the score works Each factor produces a 0-100 subscore where 100 is worst, from bands defined in `config/risk_model.json`: | Factor | Default weight | Input | | --- | --- | --- | | `usage_decline` | 25 | trailing vs prior 3-month average of `key_actions` | | `user_attrition` | 15 | trailing vs prior 3-month average of `active_users` | | `license_utilization` | 10 | latest `active_users / licensed_seats` | | `support_burden` | 15 | tickets per 100 seats + weighted P1s and escalations in 90 days | | `sentiment` | 15 | average CSAT over 180 days | | `champion_departure` | 10 | champion / economic-buyer contact status | | `invoice_history` | 10 | average days late plus weighted overdue invoices | ``` risk score = sum(subscore x weight) / sum(weight of factors with data) weighted ARR risk = ARR x risk score / 100 ``` **Missing data is excluded, not scored zero.** If an account has no CSAT responses, the sentiment weight is dropped and the remaining weights are renormalized; the report prints `NO DATA` for that factor and states how much weight the score was computed over. This is the single most important behaviour in the tool: silently treating "no survey responses" as "happy customer" is how health scores lose credibility. Bands (`critical`, `high`, `medium`, `low`) are thresholds on the final score, also in the config. ## Tuning Everything is in `config/risk_model.json`: factor weights, every band boundary and its label, the support and invoice index multipliers, the windows (`support_window_days`, `csat_window_days`, `invoice_window_days`, `champion_departure_window_days`), the roles that count as a champion, and the risk band thresholds. Change weights to match what has actually predicted churn in your business; if you have no evidence yet, start with the defaults and revisit after two renewal cycles. ## Reading and presenting the output - **Book summary** is the number for the forecast call: total weighted ARR at risk and how it splits across bands. - **Factor prevalence** tells you whether you have an account problem or a systemic one. Five accounts flagged on `support_burden` is a product or staffing issue, not five separate save plays. - **Ranked book** is sorted by weighted ARR at risk, not by score, so a $520k account at 18 outranks a $45k account at 35. Each account shows its top three contributing factors, then the full factor table with evidence. - Take the top of the list into the save-play conversation with the evidence lines — they are written to be pasted into a CRM note. - Read the `NO DATA` lines before trusting a low score; an account scored on 60 of 100 weight points is a data gap, not a healthy account. ## Limits - **Correlational, not predictive.** These are the patterns that usually precede a non-renewal. Nothing here is fitted to your historical churn, and the default weights are a starting point, not a trained model. - It cannot see relationship, pricing, or competitive risk. An account can score 0 and still churn because a new CTO consolidated vendors. - Sentiment is CSAT only — no NPS, no call transcripts, no email tone. - Champion detection depends entirely on CRM hygiene. Accounts with no contact roles maintained score the "no champion on record" value, which is a data finding as much as a risk finding. - Monthly usage granularity. A sharp drop mid-month is invisible until the month closes, and the trend needs two complete windows before it reports anything. - ARR at risk is a linear scaling of the score, not an expected value. It ranks the book; it is not a forecast of dollars you will lose. - Single currency (USD by contract). Convert before exporting. - No write-back: no CRM updates, no alerts, no tasks created.