Case study · 75-day engagement

He was getting calls. A third of them were junk.

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

"My CPL looks great on paper. My booked-job rate is killing me."

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:

  • 27% of calls were wrong-number or for a previous business at the same phone number from before he bought the company.
  • 14% were telemarketers, robocalls, or "Google Business Profile updates" scammers these came in 2-3 a day during business hours.
  • 9% were for plumbing brands he did not service ("I have a Rinnai water heater problem"). The agency had been bidding on brand-specific keywords with no exclusions.
  • Of the actual plumbing emergencies that called his dispatcher missed 18% because she was already on the line with one of the junk calls.

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

Stop measuring calls. Start measuring booked jobs.

Step 1: AI call scoring layer (week 1-2)

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.

Step 2: Routing by intent (week 2)

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.

Step 3: Negative keyword pass (week 3)

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.

Step 4: After-hours plus missed-call recovery (week 4)

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

The internal stack that did the heavy lifting.

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.

Tool 01Real-time call transcription + AI scoring

Whisper-based transcription with a scoring model trained on 11k previous calls. Gets the junk vs job classification right about 94% of the time.

Tool 02Intent-based call routing

Sends high-urgency calls straight to the tech, quote requests to dispatch, junk to a recorded line. Cuts dispatcher interruptions by 40%+.

Tool 03Missed-call SMS recovery

Fires within 30 seconds of an unanswered call. Texts the caller a contextual question. Recovers about 4 in 10 missed jobs.

The execution

Week-by-week timeline.

WeekWhat we shippedWhat moved
Week 1CallRail audit, 11k previous calls labeled for trainingJunk rate baseline established at 41%
Week 2AI scoring model live, intent-based routing rules deployedDispatcher load drops 38%
Week 3Negative keywords from junk-tagged calls, ad copy refreshCPL down 14%
Week 4Missed-call SMS recovery online, after-hours routingRecovery rate at 41% on first 30 misses
Week 6Booked-job tracking added to weekly reportOwner sees real numbers for the first time
Week 10Mid-engagement review, scoring model retrainingJunk filter accuracy at 94%
Week 12Retainer continues, water heater landing page nextRun rate stable at 119 booked calls/mo

The numbers

What changed in the data.

3.1×
Booked calls per month
41%
Junk filtered before dispatch
-22%
Cost per booked job

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.

Owner·Plumbing company · Dallas, TX · 8 trucks

Keep reading

Three more turnarounds you might find useful.

Want a story like this with your numbers on it?

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.

Book my 30 min call Run my free audit