Case study

From 27 missed calls a month to zero after-hours revenue lost to voicemail.

Tim Grok · HVAC & Plumbing Owner · Austin, TX

A 6-truck HVAC and plumbing company was spending $3-4K a month on Google Local Services Ads to generate calls, then losing over a quarter of them after hours.
No one was answering.
No one knew how much revenue was walking out the door.
We fixed that in one week.

27/100After-hours calls previously going unanswered every month
<800msResponse latency engineered into every live call
1 wkFrom kickoff to full live deployment

How a leaking pipeline of $400-$1,200 emergency jobs got sealed

The Challenge

The owner wasn’t short on demand, his ads were working and calls were coming in. The problem showed up when he actually pulled his call logs: 27 out of roughly 100 after-hours calls had gone completely unanswered. His techs are on roofs and under sinks all day. His office manager leaves at 5pm. After 6pm, every call either hit his personal cell, which he ignores during dinner, or fell straight to voicemail.

He had no idea how many of those missed calls were $400-$1,200 emergency jobs. What he did know was the psychology on the other end: a homeowner with a dead AC at 2am, or water pouring into a basement, isn’t waiting for a callback. They call the next name on Google, and a competitor books the job before he even wakes up.

He’d already priced a 24/7 human answering service and rejected it: $600-$1,500 a month for someone reading a script who can’t tell "my AC is making a weird noise" from a genuine emergency. Urgent calls would still land in a generic queue instead of getting flagged and routed immediately.

The Solution

We built a purpose-built emergency-triage voice agent, not a generic answering script:

  • Semantic urgency classification - trained on trade-specific emergency signals ("flooding," "gas smell," "no heat below freezing") to detect real emergencies by meaning, not keywords.
  • Structured warm handoffs - every transfer to a live tech includes a full context packet (name, issue, urgency tier, address, quoted symptoms) via SMS/CRM before the human ever picks up, so no caller repeats themselves.
  • Full observability layer - transcript logging, confidence scoring, and real-time alerts the moment a call fails or hits low-confidence intent.
  • Outcome-based reporting - built-in before/after analytics tracking calls answered, urgency classification accuracy, and jobs booked, so ROI is measured, not assumed.

The system was voice-tuned and stress-tested against real, messy caller behavior (accents, interruptions, background noise, angry customers) before it ever touched a live call.

The Result

Within one week, the after-hours gap that had been quietly costing the business $400-$1,200 per missed job was closed. Every after-hours call is now answered instantly, classified for urgency, and either resolved or hard-routed to a live tech with full context attached. The client confirmed satisfaction against every success criterion set at kickoff: voice quality, urgency detection, handoff quality, and cost predictability.

He no longer wonders how many emergency jobs went to a competitor last night. The agent already answered.

Inside the build

The actual triage system running behind every after-hours call

This is the live voice agent handling Tim Grok’s after-hours line, showing the urgency-classification logic, the handoff packet sent to on-call techs, and the call-monitoring dashboard, all connected in one pipeline.

Urgency Classification Engine

Every call is scored in real time against trade-specific emergency signals and routed accordingly.

Handoff Packet

Name, issue, address, and urgency tier delivered to the tech via SMS before the call connects.

Call Monitoring Dashboard

Every call logged, transcribed, and scored, with instant alerts on failures or low-confidence outcomes.

Key takeaways

What made this build work

The principles from this project apply to any service business where missed after-hours calls mean lost revenue.

Urgency detection has to be the core feature, not an add-on

Generic answering services fail because they treat every call the same; the entire value here came from classifying emergencies by meaning, not keywords.

A warm handoff is only warm if it carries context

Passing the caller’s issue, address, and urgency tier to the tech before pickup eliminated the "repeat yourself" moment that breaks trust in AI-handled calls.

Trust is earned with visibility, not promises

Real-time alerts and full call logging meant the owner never had to wonder if the system was working; he could see it.

Ready to start?

Your business deserves an AgenticUI that actually works.

Book a Free Call