The Problem
Churn is obvious only in hindsight
Small and mid-sized businesses rarely notice a customer drifting away until it's too late to do anything about it — the cancellation, the non-renewal, or the silence after a complaint. Even when the risk is noticed, writing a thoughtful win-back message and following up consistently over the next weeks is exactly the kind of task that quietly falls through the cracks when someone is busy running the rest of the business.
How It Works
A weekly scan, then a durable per-customer sequence
Built and running in Trigger.dev, chosen for its native durable execution and per-customer idempotency. I've also mapped this architecture onto n8n — the node-by-node equivalent, and the two or three spots where n8n needs explicit wiring that Trigger.dev handles for free — as a design exercise, not a second build.
Part 1 — Churn Risk Scan (weekly, Monday 8am)
Scan the customer list
Pulls every row: last order date, order frequency, support ticket count, renewal date, current status.
Skip anyone already flagged
Drops any customer already mid-sequence, so a re-run of the scan never double-starts a win-back.
Score the risk
Checks three signals: an activity gap against that customer's own historical rhythm, 2+ support tickets in the last 30 days, or a renewal within 14 days with no positive signal. Each hit gets tagged "Complained" or "Gone Quiet" — the tag drives the message tone downstream.
Hand off, five at a time
Flags the row "At Risk" and kicks off an independent win-back run per customer, paced so the fan-out doesn't hammer the Sheets API.
Part 2 — Churn Win-Back Flow (per customer, up to ~10 days)
Draft the win-back message
Claude writes an acknowledgment-first, resolution-focused message for "Complained" customers, or a low-pressure check-in for "Gone Quiet" ones.
Wait 3 days, then check
If the owner never marked the draft as sent, the flow escalates with a specific reason instead of leaving it hanging indefinitely.
Wait 7 more days for a response
Anything short of "Resolved" or "Won Back" escalates as "sent but no engagement" — nothing is assumed successful by default.
The result: churn signals caught within a week instead of at the next renewal or cancellation, zero manual review of the customer list, and a direct lift in retained revenue from intervening before a cancellation decision is made. No at-risk customer is ever silently dropped, and owners get ready-to-send personalized copy instead of a blank page.
Tech Stack