The problem
The warning signs sat in Slack, in plain text, for months, and nobody was reading for them.
The year before, two accounts worth ~$180k had walked. In both post-mortems the signals, slow replies, repeated requests, a cancelled review, had been sitting in the threads the whole time. Nobody's job was to read across all of it.
Owner visibility was the weekly meeting where managers report on themselves, plus the moment a client asks for 'a quick call'. By then the decision is usually made.
The approach
Watch the agency's own service quality, in the channels it already owns.
Phase 1: read-only ingestion across the channels the agency runs clients in, Slack, email, WhatsApp Business, Telegram, with every message classified as a request, a complaint, an approval, or noise.
Phase 2: score each account against the agency's own communication standards, timeliness both directions, tone, whether requests actually got closed, and turn open requests into a tracked list with an owner and an age.
Phase 3: a weekly colour-coded health report to the owner, each red flag linked straight to the thread that caused it, so the owner reads exceptions, not transcripts.
I used to find out we'd lost a client when they told me. Now I find out on a Monday, while there's still something to do about it.
What was messy
Where the first version needed tuning, and a hard privacy line.
The privacy line came first and stayed fixed: the agency monitors its own service quality in channels it already owns, and it was framed to clients that way. In rollout conversations it was never once an objection; several clients asked for the same thing on their side.
Early scoring over-flagged, a terse-but-fine reply read as 'cold'. We calibrated tone scoring against the agency's own best threads before trusting it.
Voice notes and calls were the gap, a lot of real requests live there. Transcription plus timecoded capture closed most of it, but long calls still get a human skim.
The outcome
The owner stopped finding out last.
- At-risk accounts caught and saved0 process → 2/2$260k retained
- Dropped requests per month14 → 2tracked list
- Response time, five largest accounts31h → 6hmonitored
- Owner visibility into account healthweekly meeting → live reportby design
How we measured it
Baseline, sample and method, so the numbers above are checkable.
Baseline: the prior year, 20 retained clients, ~$2.1M in annual retainer revenue, and two lost accounts (~$180k) whose warning signs were reconstructed after the fact.
Run: 9 months live across all 20 accounts.
Two accounts flagged red; the owner stepped in within a week of the flag; both renewed. The ~$260k 'saved' is the annual retainer on those two accounts, attributed by the agency, it's their judgement that the flag changed the outcome, not a controlled counterfactual.
Response-time figures (31h → 6h on the five largest accounts) come from the monitoring itself; dropped-request counts (14 → 2/month) from the tracked list.
What we did not automate
The system watches; humans decide.
The layer never messages a client. It flags to the owner; the owner or account lead decides what to do.
It reads only channels the agency owns and operates, no client-side systems, no covert monitoring.
Judgement about a relationship stays human, the report surfaces the signal and the thread, it doesn't diagnose the client.
What's next
The health report is becoming the account review.
The weekly report replaced most of the status meeting where managers used to report on themselves, the owner now walks in with the exceptions already in front of them.
The same signal is being turned into an onboarding-quality check, so a new account's communication health is watched from day one, not after the first scare.