Case study · 75-day engagement
A Dallas plumbing owner had a perfectly fine ad spend, a perfectly fine CPL, and a phone that rang constantly. The problem was that 31% of those calls were wrong-number, telemarketers, callers shopping for a plumbing brand he did not sell, or people calling for the previous business at the same number. The dispatcher was burning out triaging junk.
The challenge
This is the most common service business problem we run into. The agency dashboard shows 86 leads at $24 CPL. The owner looks at his calendar and sees 38 booked jobs. Where did the other 48 go?
When we audited his call log:
The agency did not see this because their definition of a "lead" was a phone call lasting more than 30 seconds. That definition treated a 90-second telemarketer pitch as a successful conversion.
The plan
We bolted a custom transcription + scoring model on top of CallRail. Every inbound call gets transcribed in near real time and scored on three axes: is this a real customer, is this within our service area, does the caller have intent to book today. Calls below the threshold do not interrupt the dispatcher.
High-intent emergency calls go straight to the on-call tech. Quote requests go to the dispatcher. Junk goes to a recorded "press 1 if you want to leave a message" branch. The dispatcher stopped being interrupted by the 41% of calls that were never going to book a job.
We pulled every search term that had produced a junk-tagged call and added the relevant negatives. The brand-specific water heater queries, the appliance-repair-style queries, the "free quote" shoppers. Spend went down, qualified call rate went up.
When the dispatcher missed a call, our bot fired an SMS within 30 seconds asking "saw we missed your call, what can we help with?" 41% of those texts converted to a booked job within an hour. Most of those would have called the next plumber on the search results page.
AI tools we used
We do not pretend the work happens by hand. Three of our internal tools are the reason this engagement moved as fast as it did. Each of them replaces what used to be days of human time.
Whisper-based transcription with a scoring model trained on 11k previous calls. Gets the junk vs job classification right about 94% of the time.
Sends high-urgency calls straight to the tech, quote requests to dispatch, junk to a recorded line. Cuts dispatcher interruptions by 40%+.
Fires within 30 seconds of an unanswered call. Texts the caller a contextual question. Recovers about 4 in 10 missed jobs.
The execution
| Week | What we shipped | What moved |
|---|---|---|
| Week 1 | CallRail audit, 11k previous calls labeled for training | Junk rate baseline established at 41% |
| Week 2 | AI scoring model live, intent-based routing rules deployed | Dispatcher load drops 38% |
| Week 3 | Negative keywords from junk-tagged calls, ad copy refresh | CPL down 14% |
| Week 4 | Missed-call SMS recovery online, after-hours routing | Recovery rate at 41% on first 30 misses |
| Week 6 | Booked-job tracking added to weekly report | Owner sees real numbers for the first time |
| Week 10 | Mid-engagement review, scoring model retraining | Junk filter accuracy at 94% |
| Week 12 | Retainer continues, water heater landing page next | Run rate stable at 119 booked calls/mo |
The numbers
The 119 booked calls a month came from:
The dispatcher used to handle 86 calls a day. She now handles 119, and somehow has more time to actually book jobs. The owner stopped treating "more calls" as the goal and started treating "more booked jobs" as the goal. Different math, different result.
I asked my old agency for a year to look at my call log. They said calls were the leads, the dispatcher's job was to qualify them. After we switched, I realized I had been paying my dispatcher to do an agency's job.
Keep reading
Thirty minutes. We pull up your account on screen. We tell you what we would do, what we would not do, and whether we are the right fit for your business.