The accounts most likely to leave were invisible
Our ClickUp automation was silently skipping paying customers. I built a Stripe-backed dashboard so at-risk accounts surfaced before they cancelled, not after.
- Company
- GoHighLevel · 2024
- My role
- Account Specialist — analysis, tooling, retention program
- Focus
- Retention, Churn analysis, Data, Automation
- Subject
- why didn't we see this coming?
Account cancelled this morning. Paid, active, no open tickets, nothing in the queue flagged them. Looking back, they'd been running a build from months ago the whole time.
Where it ended up
$1M
ARR brought under active monitoring
150+
Accounts tracked for staleness and payment state
Caught
Churn, through outreach before renewal
02
Context
Retention on my book of accounts depended on knowing which customers were drifting. The system we had for that was a set of ClickUp automations meant to raise tasks when an account needed attention.
Between them, my accounts represented roughly $1M in ARR. The renewal conversation was the moment the relationship was decided, and by then it was usually too late to change the answer.
03
The problem
Cancellations kept arriving without warning. The accounts weren't loud — no escalations, no angry tickets — they simply went quiet and then left.
That's the hardest churn to catch, because silence reads as health right up until it doesn't.
04
What I found
I traced a few of the surprise cancellations back through the system and found the automation itself was the gap: it was failing on a subset of records and skipping paying clients entirely. The queue looked clean because those accounts had never entered it.
The second finding was the more useful one. The accounts that left had something in common — they were running old app versions. They'd onboarded, shipped once, and never come back to rebuild. Staleness was a leading indicator, and nothing in our tooling looked at it.
Together those explained the blind spot: we were monitoring activity in a queue that some paying customers couldn't reach, using no signal for the quiet ones who could.
05
Options I weighed
I built the dashboard. The automation could stay broken and this would still work, which was the point: I wanted a check that didn't depend on the system that had already failed.
- Fix the ClickUp automation — necessary, but it restores a system I'd just watched fail silently, and it still only tracks tickets, not staleness.
- Manual account review on a schedule — reliable while I did it, worthless the week I was busy, and impossible past a certain account count.
- Build a dashboard from the sources of truth — payment state from Stripe, app version per account — so the signal is derived rather than reported.
06
What shipped
A Google Sheets dashboard integrated with Stripe, cross-referencing who was paying against which app version they were running. Accounts on stale builds surfaced as at-risk on their own, without anyone remembering to look.
I worked that list as an outreach queue — contacting accounts based on the risk signal instead of waiting for them to contact me.
07
Impact
Churn that would have arrived as a surprise cancellation turned into a conversation weeks earlier, while there was still something to do about it.
It also changed how I spent my week. Instead of distributing attention evenly across 150 accounts, I could aim it at the ones the data said were drifting.
08
What I'd do differently
Sheets was the right call for proving the signal — I had it running in days without asking anyone for resources. It was the wrong place to leave it. A spreadsheet has no owner, no tests, and no alerting, so it degrades quietly in exactly the way the automation it replaced did.
Once the signal proved out, I should have pushed to move it into the product as an account health field the whole CS team could see. I proved the hypothesis and under-invested in making it permanent.