The HVAC Company That Wired AI Into Dispatch (And What Broke First)
An 11-truck residential HVAC company was losing 2-3 service calls a week to scheduling friction. We built an AI dispatch layer that paid for itself in six weeks. We also nearly lost a customer on day three. Here's everything.
The owner was 58. He had been running this HVAC company for 22 years. He was the dispatcher because he was the only one who knew which technician could handle which job in which neighborhood at which time.
He was also exhausted. He'd been doing his own dispatching since 2003. The business had grown from 2 trucks to 11. He had not.
The problem he came to me with was not "I need AI." The problem was "I can't keep doing this and I can't find a dispatcher who knows what I know."
The actual problem
We sat in his office for a day. I asked dumb questions. I watched him work.
The dispatch wasn't complicated. It was tedious. A customer would call. The owner would look at the day's schedule, decide which tech was closest, which had the right skill, which truck had the right parts. He'd call the tech, give them the address, update the spreadsheet. 4-7 minutes per call.
When he was on a service call himself, or eating lunch, or sleeping, calls went to voicemail. Voicemails came back at varying rates. He estimated 2-3 calls a week went somewhere else because nobody answered.
At $400 average ticket, $1,000-1,200 a week of leakage. About $55k a year. To a company doing $2.4M.
What we built
The actual system has three parts.
Part 1: The phone answers. When a call comes in and the owner doesn't pick up in 4 rings, an AI voice agent answers. It's polite. It says it's a scheduling assistant. It asks for name, address, and what's wrong (no heat, no AC, water leak, etc.). It promises a tech will call back within 30 minutes during business hours.
The voice agent is not pretending to be human. We tested both ways. Customers reacted better to "I'm a scheduling assistant" than to a hidden bot. The honesty bought trust.
Part 2: The dispatch decision. When a call drops in (either the AI handled it or the owner did), the dispatch decision is computed in the background. It pulls: - Each tech's current location (Samsara GPS) - Each tech's current job and estimated time to clear - The job type (and which techs are best for it) - The required parts (cross-referenced against truck inventory) - The customer's history (regular customer? new? VIP commercial account?) - Distance and traffic
It returns a ranked recommendation. The owner approves or overrides. 30 seconds per dispatch instead of 4-7 minutes.
Part 3: The tech notification. When a dispatch is locked, the tech gets a text with the address, customer name, job summary, and any prior service history. The text comes from the same number every time. The tech can reply DONE or DELAYED.
The owner gets a dashboard showing every truck's status, the next 4 hours of scheduled work, and any flags.
What broke first
Day three of go-live, a long-time commercial customer (a property management company that books us for 30 commercial buildings) called. The AI answered. The customer was annoyed. She hung up.
She called the owner directly on his cell. She said "I don't want a robot. I'm taking these buildings to a competitor if I get a robot again."
This is a customer worth about $180k/year. We almost lost her in 72 hours.
We fixed it the same day. The AI now checks the incoming caller ID against a list of "high-touch" customers. If the caller is on that list, the call rolls to the owner's cell and to two senior techs in sequence. No AI. Period.
The high-touch list is about 40 customers. They get human treatment. Everyone else gets the AI as backup. The owner approves additions to the list.
This is the lesson I'd tell anyone in trades. You do not blanket-automate your customer relationships. You tier them. Some customers value efficiency. Some customers value human contact. Your system has to know which is which.
The numbers
Six weeks in, the system had: - Answered 47 calls the owner missed (would have gone to voicemail) - Generated 34 booked jobs from those calls - Saved an estimated $13,600 of leakage in that window - Cut average dispatch decision time from 5 min to 45 sec
System cost: roughly $400/mo (voice agent platform + cell SMS + Samsara API). One-time build: about 6 weeks of my work + 2 weeks of integration with their dispatching software.
What I learned
Trades businesses are not waiting for AI. They're waiting for AI that doesn't blow up their customer relationships. The "blow up" part is what every vendor pitching to trades gets wrong. The owners care about the relationships more than they care about the tech.
If you sell AI to trades, you sell the tier-list before you sell the AI. Show them how the AI knows when to step back. That's the entire pitch.
What's still on the list
We haven't automated parts ordering. The owner wants to. I've pushed back because the parts ordering involves judgment calls about which supplier to call based on parts availability that's not in any system. We're capturing that judgment in a notes field for now and will revisit in 6 months.
We also haven't automated the post-job follow-up. The customer-satisfaction call after a job is currently the owner's daughter (she works half-time in the office). The owner does not want to automate this even though we could. I respect the call.
What I'd build first for a trades business
The dispatch decision engine, not the voice agent.
The voice agent gets all the attention because it's flashy. The dispatch decision is where the time savings actually compound. If you have someone doing dispatching, give them a decision engine. They'll process 3x the calls.
If you're the owner doing the dispatching yourself, build the decision engine first so you stop being the bottleneck. Then build the voice agent later when you can't handle the missed-call problem any other way.
Want the full guide? Check out our deep-dive page for more context, FAQs, and resources.
read the full guide