# Churn Risk & Renewal Watch

> Ranks accounts by change from their own baseline into a HIGH/MEDIUM/WATCH triage list with the question to ask. No fake probabilities. Never contacts customers.

- Agent: Claude Code
- Plan: Starter (1 vCPU, 2 GiB RAM, 10 GiB disk)
- Forks: 0 · Stars: 0
- Creator: https://www.jurniti.com/creator-ca0ff2
- Tags: churn, claude-code, customer-success, gtm, hubspot, retention
- Requires config (you provide): ANTHROPIC_API_KEY
- Skills: churn-risk-detector

**To fork:** open https://www.jurniti.com/templates/churn-risk-renewal-watch and use the Fork action — it starts a Stripe Checkout for a new VM seeded with this template's persist disk (same flat plan price, no fork fee).

## README

# "Churn risk: 73%." Where did 73 come from?

Nobody knows. It goes in the board deck anyway, and the CS team works the list
top-down sending "we noticed you haven't logged in lately" — which tells a wavering
customer they're being watched and confirms they should leave.

Meanwhile the account that actually left had a stable login count and a champion who
quit in February.

## This refuses to predict, on purpose

No model, no training set, no validated baseline — so **no probabilities and no risk
scores.** Those numbers end up in a deck and become fiction.

You get an ordinal list instead: **HIGH / MEDIUM / WATCH.** A comparison between
accounts, not a claim about any one of them. It's the accounts a human should look at
first, and it's called exactly that.

## Change, not level

The signal that matters most is a drop from **the account's own baseline**. A
customer who always logged in twice a month and still does is fine. One who went from
daily to weekly is the signal.

Signals ranked by how much they actually mean:

1. **Contractual** — renewal approaching with no engagement, a downgrade, a seat
   reduction, a failed payment. Facts, not inference.
2. **Behavioural delta** — against their own normal, never an absolute number.
3. **Relationship** — champion left, sentiment turned, escalation unresolved.
4. **Support** — volume spike or a repeated unresolved issue.

Anything flagged only by 3 or 4 caps at **WATCH**, never HIGH.

## The output is a question, not a task

> *"Their weekly sessions fell from 40 to 9 after the March seat change — ask if
> something broke for that team."*

Not "check in with Acme". That's a task; this is something a human can actually walk
into a call with. Every flagged account gets the specific observation **with dates**,
who should reach out, and what to ask.

## Two honesty rules

**Absence of usage data is not absence of risk.** If your export has no usage signal
the ranking is marked CONTRACT-ONLY and substantially weaker — a quiet account never
gets to look healthy just because you can't see it.

**Never a discount as the first move.** A discount answers a price objection, most
churn isn't one, and leading with money trains renewal hostage-taking.

## What you supply

Your own Claude Code login, plus a subscription list with renewal dates in
`~/churn/exports/` — and usage/support exports if you have them.

No CRM key. Exports are the input, which is also why it cannot contact anyone.

## Where this stops

It flags and drafts internal notes. It does not email customers, create CRM tasks, or
offer save-deals.

It won't state a churn probability or predicted revenue impact, won't guess *why* an
account is disengaging (you get `cause unknown — ask`), and won't tell you an account
is safe — it ranks risk, it doesn't clear it.

Verified on build: the skill, the working tree, the `NEVER_CONTACT_OR_DISCOUNT`
guard, the not-a-prediction rule, all four signal classes and both honesty rules are
present on a fresh fork. Running it on your own book is yours to do.
