Every Monday: the 5 accounts most likely to churn this month
MondayKeep compares each customer with its own normal week, not with your average customer. Every flag shows the numbers behind it and tells you whether it is a risk you can fix or just noise.
US$ 29/month, cancel anytime. Works from a CSV you can export in a few minutes.
What each Monday email gives you
- Each account against its own baselineThis week's active users vs the median of that account's previous 8 weeks, with its normal range.
- Seats as a number and a percentFor example “-2 seats (40%)”, so a small team losing two people is not hidden.
- Fixable risk or NoiseFailed payments, expiring cards, removed seats and downgrades are fixable. Quiet weeks inside normal variance are noise.
- 1 or 2 reasons with the raw evidenceThe exact numbers behind each reason, plus a next step you can do this week.
Sample report
This is the exact layout of the Monday email and the dashboard.
Sample report · week of Nov 2, 2026
The 5 accounts most likely to churn
5 accounts to look at: 4 fixable risks, 1 probably noise. 12 accounts checked against their own baselines.
-
1Fixable risk
Northwind Labs
acc_1001- Risk score
- 58/100
- Active users
- 20 vs 39 baseline (-49%) · normal range 30–48
- Seats
- -5 seats (10%) · 45 now, 50 baseline
- MRR
- 1,500
- Usage dropped below its normal range +40
Evidence: 20 active users this week vs 39 baseline (median of the previous 8 weeks): -49%. Normal range 30–48. Below the normal range 2 weeks in a row.
- Seats removed +18
Evidence: -5 seats (10%): 45 seats this week vs 50 baseline (median of the previous 8 weeks).
Next step: Reach out this week: ask what changed for their team and offer a short check-in call.
-
2Fixable risk
Pinecrest Legal
acc_1003- Risk score
- 53/100
- Active users
- 3 vs 4 baseline (-25%) · normal range 1–7
- Seats
- -2 seats (40%) · 3 now, 5 baseline
- MRR
- 150 (-40% vs 250 baseline)
- Seats removed +27
Evidence: -2 seats (40%): 3 seats this week vs 5 baseline (median of the previous 8 weeks).
- Downgraded (MRR down) +23
Evidence: MRR 150 this week vs 250 baseline (median of the previous 8 weeks): -40%.
Next step: Ask the account admin who left. If it was your main contact (your champion), find and onboard a new one.
-
3Fixable risk
Blue Heron Clinics
acc_1002- Risk score
- 50/100
- Active users
- 18 vs 18 baseline (0%) · normal range 14–22
- Seats
- No change (0%) · 20 now, 20 baseline
- MRR
- 800
- Repeated failed payments +30
Evidence: failed_payments = 2 in the week of Nov 2, 2026 (and 1 the week before).
- Card expires soon +20
Evidence: card_exp = 2026-11: valid until Nov 30, 2026, 22 days after this week ends (Nov 8, 2026).
Next step: Email the billing contact a link to update the card before the next retry.
-
4Fixable risk
Sunset Dental Group
acc_1004- Risk score
- 30/100
- Active users
- 11 · new account: 2 weeks of history, baseline starts after 4
- Seats
- No change (0%) · 12 now, 12 baseline
- MRR
- 480
- Card on file has expired +30
Evidence: card_exp = 2026-10: the card expired on Oct 31, 2026, 8 days before this week ended (Nov 8, 2026).
Next step: Ask for a new card now, before the next invoice fails.
-
5Noise
Tiny Studio
acc_1006- Risk score
- 5/100
- Active users
- 1 vs 2 baseline (-50%) · normal range 0–4
- Seats
- No change (0%) · 2 now, 2 baseline
- MRR
- 60
- Tiny team, small change +5
Evidence: 1 active user this week vs 2 baseline (median of the previous 8 weeks): -50%. Normal range 0–4. That is 1 person: too few to read as a trend.
Why it is probably noise: No action needed. Check again next Monday.
- 1 account has no row for this week and was not scored: Old Mill Bakery.
Download the sample data as CSV to see the input that produced this report.
How scoring works
Every account gets points from fixed rules. The same data always gives the same result. Risk score = sum of points, capped at 100. The top 5 go in the email.
| Signal | Rule | Tag | Points |
|---|---|---|---|
| Usage drop | Active users at least 25% below the account's own median of the previous 8 weeks, below its normal range (median − 2 × robust spread), and at least 2 people lower. Needs 4+ weeks of history. | Fixable | 15–45, +10 if 2+ weeks in a row |
| Usage stopped | 0 active users for 2+ weeks after normal use. | Fixable | 15–55 |
| Seats removed | Seats below the account's own median. Shown as a number and a percent. | Fixable | 15–45 |
| Failed payments | failed_payments above 0 this week. | Fixable | 20–40 |
| Card expiring | card_exp month ends within 31 days of the report week (expired: 30 points). | Fixable | 20–30 |
| Downgrade | MRR at least 10% below its own median. | Fixable | 15–35 |
| Paying, not using | 0 active users all along while MRR is above 0. | Fixable | 25 |
| Quiet week | A dip of 10%+ that is inside the normal range, a tiny-team change, or in line with a base-wide dip (the typical account down 15%+ the same week). | Noise | 1–10 |
Robust spread = 1.4826 × median absolute deviation of the previous weeks (at least 1 person or 10% of the median), so one odd week does not distort the baseline. Noise never scores above 10; every fixable signal scores 15 or more, so fixable risks always rank first. Ties go to the account with more MRR. The rules were chosen in public, in a conversation with Grok on X.
Your data in: one CSV
One row per account per week. The first row holds the column names. Upload the last 8 to 12 weeks the first time; after that, upload only the newest week each Monday.
| Column | Needed | What goes in it |
|---|---|---|
account_id | Required | Your stable ID for the customer account (any text, up to 64 characters). |
account_name | Recommended | Readable name shown in the report. Falls back to account_id. |
week_start | Required | A date in YYYY-MM-DD. Any day inside the week works; rows are grouped by the Monday of that week. |
active_users | Required | People who used your product that week (whole number, 0 or more). |
seats | Required | Paid seats on the account that week (whole number, 0 or more). |
mrr | Recommended | Monthly recurring revenue for the account that week, in your billing currency (number, 0 or more). |
card_exp | Optional | Optional. Card expiry month in YYYY-MM. Leave blank if unknown or invoiced. |
failed_payments | Optional | Optional. Failed payment attempts that week (whole number, 0 or more). |
How to export this from Stripe or your database
From your database. Count distinct active users per account per week, and add the seat count and MRR you store for each account. In PostgreSQL, date_trunc('week', …) returns the Monday of the week:
SELECT a.id AS account_id,
a.name AS account_name,
date_trunc('week', e.created_at)::date AS week_start,
COUNT(DISTINCT e.user_id) AS active_users,
a.seats AS seats,
a.mrr AS mrr
FROM events e
JOIN accounts a ON a.id = e.account_id
WHERE e.created_at >= now() - interval '12 weeks'
GROUP BY 1, 2, 3, 5, 6
ORDER BY 3, 1;
Rename the tables and columns to match yours. If you only store today's seats and MRR (no weekly history), that is fine: use the current values. Upload every Monday and MondayKeep builds the history, because new uploads merge into earlier ones.
From Stripe. The Stripe Dashboard can export customers, subscriptions and invoices as CSV. In a spreadsheet, join them by customer ID: the subscription quantity is usually your seat count, the subscription amount is your MRR, the card's expiry month and year give card_exp (write it as YYYY-MM), and failed invoice payment attempts that week give failed_payments. Usage (active users) comes from your own product data.
From a spreadsheet. Keep one tab with one row per account per week, then use File → Download → CSV.
Pricing
MondayKeep
US$ 29/month
- Monday email with your top 5 churn risks
- Dashboard with the same report any day you upload
- Baseline per account, seats in number and percent, Fixable or Noise, raw evidence
- Cancel anytime
You sign in with Google, then pay on Stripe's checkout page.
FAQ
What data do I need?
One row per account per week with account_id, week_start, active_users and seats. Add account_name, mrr, card_exp and failed_payments for more signals. Most teams export it from their database or billing tool in a few minutes; the template and the guide on this page show how.
Why compare an account with itself instead of my average customer?
A 3-person agency and a 300-seat company never look alike. Average-based alerts flag small accounts every week and miss big ones sliding slowly. MondayKeep uses each account's own median of the previous 8 weeks and its usual week-to-week swing.
What does "Fixable risk" vs "Noise" mean?
Fixable risk: something you can act on this week, like a failed payment, a card about to expire, seats removed, a downgrade or usage clearly below that account's normal range. Noise: a dip that is within the account's normal swing, a tiny team where one person is on vacation, or a week when your whole customer base dipped together.
Is the score a prediction from AI?
No. It is a fixed set of rules with points, listed on this page. The same data always gives the same score, and every reason shows the numbers behind it.
Do I have to upload every week?
For a Monday email, yes: upload the newest week before Monday 13:00 UTC. New uploads merge into earlier ones, so you can upload only the latest week. If the data is more than 14 days old on Monday, you get a short reminder instead of a report.
Do you connect to Stripe or my database?
No. You upload a CSV and nothing else. MondayKeep never asks for API keys or database passwords.
What happens to my data?
It is used only to build your report. We keep the last 12 weeks, and one button on the dashboard deletes it right away.
How much does it cost?
US$ 29 per month, billed by Stripe. Cancel anytime.
Who makes this
MondayKeep is built by SaaSCron, which makes small, honest tools for people running software businesses. The product is new, so there are no testimonials here. Read the guide to churn early warning signals or look at the sample report and judge for yourself.