See who is about to cancel before they do.
Churn Radar is an open-source churn predictor for small SaaS teams. Your app sends product-usage events; it learns from your own past cancellations which patterns come before one, scores every active account, and tells you which ones look like the accounts you lost, with the reason. It checks itself on weeks it has not trained on and shows you the result, including when the answer is "not enough data". First, try it on an export. Everything runs in your browser, so nothing you paste is uploaded.
1. Score your accounts
2. Run the radar yourself
git clone https://github.com/Duncan-Haywood/oss-monorepo && cd oss-monorepo/ventures/churn-radar
API_KEY=$(openssl rand -hex 16) ADMIN_KEY=$(openssl rand -hex 16) node server.mjs
curl -X POST localhost:8080/v1/events -H "authorization: Bearer $API_KEY" \
-d '{"id":"evt_81","account":"acme","type":"export_report"}'
curl localhost:8080/v1/at-risk -H "authorization: Bearer $API_KEY"
Point a Stripe customer.subscription.deleted webhook at /stripe/webhook (set STRIPE_WEBHOOK_SECRET) and cancellations are recorded for you; or call POST /v1/outcomes. Set ALERT_WEBHOOK_URL to get a signed alert the first time an account crosses the line. One-click Render deploy and Docker are in the README.
Questions
Why not use ChurnZero, Gainsight, Vitally or Totango?
Those are customer-success platforms: health dashboards, playbooks, CRM sync, and prices that start in the hundreds of dollars a month. Churn Radar does one narrow thing for a small team: learn from your own cancellations which usage patterns come before them, and tell you which active accounts look like that now. It is one dependency-free Node process with a JSON file for state, and your events never leave your server.
How does the prediction work, and how accurate is it?
Each week of each account's history becomes one row: recent activity, the change from the week before, days since the last event, active days, features used and account age. Rows are labelled by whether the account cancelled within 30 days. A logistic regression is fitted to that, validated out-of-time (trained on the past, scored on weeks after a cutoff) and the AUC and the share of churners found in the top 10% are shown. Accuracy depends entirely on your data; the page says so when there is too little to validate, and it never invents a number.
How much data do I need?
Roughly 20 churned and 20 retained account-weeks to train at all, and several times that to validate. Below that you get a plainly labelled rule-based index (silence and falling activity), not a probability. A product with a few dozen customers will usually be in that regime, and the honest answer is that a person looking at the list is as good as a model.
What do I do with the list?
Send the alert webhook to something that acts: a personal email to the founder, a Slack message, a save sequence in Drip Keeper, or an offer in Cancel Flow. The model ranks accounts; it does not know why they are quiet, and a quiet account on a quarterly workflow is not at risk.
Is it safe to put real customer data in?
Send only account ids you choose, never names or emails. You run the server, so you are responsible for securing the API key, backing up the state file and following the privacy rules where you and your customers live.