Skip to content
Jay Moore

Case study

Lead Response Loop.

I designed and built a system that turns missed calls into bookings for HVAC and plumbing businesses. When the business misses a call, the system texts the caller back, qualifies the lead, and asks the owner yes or no. Approved leads get a booking link. Try the live demo below.


Choose a scenario

+ Write your own (advanced)
0/280

Prospect thread

— waiting for scenario —

Owner view

— no notifications yet —


+1 (555) 432-1098

📞 Missed call

Sorry we missed your call. Can we help via text? Reply with what you need and we'll get back to you. Reply STOP to opt out.

water heater leaking everywhere can someone come today

Prospect

Auto Lead Response Loop

New lead: Caller A1
water heater repair
URGENT · 92% conf

“water heater leaking everywhere”

Reply YES / NO / INFO

Owner

+1 (555) 432-1098

Book a time that works: cal.com/spm/hvac-appointment

✓ Booking confirmed · Tue 2:00pm

Prospect (after YES)


TL;DR

Metrics first

Shipped end to end in 14 days. Live decision support over real Twilio calls and real Claude qualifications. Beta partner onboarding is in progress.

Qualification accuracy
96%
across a 50-item labeled test set
Beta response time
1.6s
well under the 5-second target
Beta partner status
onboarding
telemetry lands the week of measurement

Problem

The response window is measured in minutes.

Most plumbers and HVAC companies miss 30 to 40% of their calls during the workday. The owner is usually driving between jobs, and there’s no receptionist to catch what comes in. Each missed call is real money. Studies show a 5-minute reply is roughly 21 times more likely to convert than a 30-minute one. A leaking water heater goes to whoever picks up first.

The tools that already exist don’t fit. CRMs take weeks to set up. Auto-responders send the same generic text to every caller, including spam. Neither one closes the gap between a missed call and a booked job.

So I designed something that does.


Interaction design

The simulator was designed, too.

The thing you played with above isn’t a screenshot. It’s part of the work. Four choices worth pointing out.

The whole point: close the gap.

A prospect calls and hangs up. The owner's phone buzzes about twenty-two seconds later. That's the whole product. The industry baseline for missed-call follow-up is hours or days. This one fits inside the prospect's walk to the kitchen.

Every step shows how long it took.

The simulator stamps each step in the pipeline with a duration. The 2-second wait between the AI classifying the call and the SMS going out isn't buried in a log. It's right there in the UI. If the system ever feels slow, you can see exactly which step is slow.

First: what kind of lead. Second: how sure. Third: a quote.

Owners glance, decide, move on. So the SMS is ranked for that. The rings light up from the inside out in the order the owner should read: label first, then confidence, then one verbatim quote from the caller. Five seconds from start to finish, yes or no.

When something breaks, it says so.

If the demo can't reach its endpoint, whether Twilio is down or the network drops or anything else, it says so out loud, with the error code and what it's doing to recover. The systems this replaces fail quietly: blank screens, missed messages, owners thinking everything's working when it isn't. I'd rather show a 504 than pretend.


Design decisions

Three calls.

A

Show the owner. Don't auto-send.

The default move with AI is to auto-book the confident matches. But one wrong booking and the owner has to apologize. So the system shows them every lead (label, confidence, the caller's words) and books only when the owner says yes.

B

Reply in under a minute.

Industry data says a 5-minute reply is roughly 21 times more likely to convert than a 30-minute one. The system aims to get a buzz on the owner's phone in under a minute. If the AI is slow, the message routes to the owner with no classification. Slower, but never silent.

C

SMS, not a dashboard.

Owners drive between jobs, work under sinks, climb ladders. A web dashboard assumes a laptop they can't reach. So the system uses one SMS notification per lead and one keyword reply. Read and decide in five seconds, no app to open.


Roadmap

What's next.

Web form follow-up.

Same idea, but for someone who fills out a contact form instead of calling.

Owner dashboard.

Everything happens over text right now. A web view becomes useful once a business hits 10 or more leads a day, or wants office staff handling decisions.

Weekly summary email.

What happened that week: calls handled, bookings, where things went wrong.

AI receptionist.

Voice instead of text. Pick up the call instead of letting it ring out. Bigger project, saved for after the text version is live.


Engineering proof

The technical detail, for anyone who wants it.

Expand · stack, testing, reliability, repos

Stack

Cloudflare Workers + D1 + KV + Cron Triggers. Twilio Voice and SMS. Anthropic Claude Haiku 4.5 for qualifying the message. Cal.com for booking. Resend for escalation email. Upstash Redis for rate-limiting the public simulator on this page.

Testing

50-example labeled test set, confusion matrix, latency tracked at the 50th and 95th percentile. v1 prompt landed at 96% label accuracy, 74% urgency accuracy, 1.6s P95 latency.

Reliability

Twilio webhook signatures verified, duplicate webhooks discarded via keyed locks in KV, failed outbound texts retried with exponential backoff via a Cloudflare Cron Trigger that runs every 60 seconds. The JSON shape that the AI returns is frozen at version v1 and shared between the simulator on this page and the production webhook through a single Server Action proxy.