Project 05

Customer Win-Back /
Churn Signal Agent

Nobody notices a customer drifting away until it's too late — and even when they do, following up consistently over the next weeks is exactly the kind of task that falls through the cracks.

Platform Trigger.dev
Built with Claude + Google Sheets
Sequence length ~10 days, unattended
Weekly Risk scan catches churn before renewal
10 days Unattended per-customer follow-up
0 At-risk customers silently dropped

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)

01

Scan the customer list

Pulls every row: last order date, order frequency, support ticket count, renewal date, current status.

02

Skip anyone already flagged

Drops any customer already mid-sequence, so a re-run of the scan never double-starts a win-back.

03

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.

04

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)

05

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.

06

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.

07

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

Tools powering the workflow

Trigger.dev
Claude / Anthropic
📊Google Sheets
← All projects