How We Built an AI Voice Agent System for a Roofing Company

A detailed case study on building inbound and outbound AI voice agents for a roofing company — what we built, what it cost, and the results after 60 days.

The owner of this roofing company called us after seeing a competitor show up at a job site he’d lost. The homeowner told him: “You called back, but they called back first.” He’d missed the original call by 40 minutes. His competitor had an answering system that caught it in real time.

That story is not unique. It’s the story of almost every roofing business we talk to.

What’s different about this engagement is what we built and what actually happened after we deployed it. I’ll give you the full picture — what the client’s situation was, what we built and why, the technical choices we made, and the real numbers at 30 and 60 days. Including what didn’t go as planned.

The Client’s Situation

Mid-size roofing contractor in the Dallas-Fort Worth area. Four crews, a full-time estimator, and one office manager who handled everything else: phones, scheduling, CRM updates, customer communication. Revenue was in the $1.8M range, with a heavy concentration in insurance restoration work.

Their inbound call problem was structural, not a management failure. The office manager was one person handling a job that required constant attention to multiple things at once. When she was on a call or helping a crew, the next call went to voicemail. During storm season, she was perpetually overwhelmed. After hours, everything went to voicemail.

When we pulled 45 days of call data before starting the project, here’s what we found:

  • 210 inbound calls over the period
  • 67 went to voicemail or were missed entirely (32% miss rate)
  • Average call-back time on voicemails: 4.2 hours
  • After-hours calls (after 6 PM): 38 total, 35 went to voicemail
  • Estimated miss rate during peak hours (10 AM–2 PM): 45%

On top of the inbound problem, they had a dormant estimate database. Over 400 homeowners had requested estimates in the previous 18 months but hadn’t converted. Some were lost jobs. Many were homeowners who got a quote, didn’t decide immediately, and then just… never heard from the company again.

That second problem — a leaking follow-up pipeline — was as significant as the missed inbound calls. Both were fixable with voice.

What We Built

We built two distinct systems: an inbound voice agent to handle all incoming calls, and an outbound voice agent to work through the dormant estimate list.

Inbound: The Always-On Receptionist

The inbound agent answers every call, 24/7, on the company’s main business number. We ported their existing number via Twilio so callers didn’t need to dial anything new.

The conversation flow covers three scenarios:

New leads (the majority of calls): The agent qualifies callers without feeling like a form — reason for calling, property address, homeowner or property manager, whether an insurance claim is open, timeline, and best callback number. Qualification data goes directly into GoHighLevel CRM. The agent books estimate appointments using Google Calendar integration. After-hours calls get full information collected with a morning confirmation expectation.

Emergency calls: Urgency language — “water coming in,” “ceiling is wet,” “emergency” — shifts the agent’s behavior. It collects the address and callback number, sends an immediate SMS to the owner and on-call crew, and texts the caller confirming a callback within 15 minutes. We chose SMS escalation over live call patching because real-time patching at 1 AM is unreliable, and the owner wanted to control which calls warranted immediate response.

Existing customers: Callback requests for active jobs route to the estimator’s cell during business hours. Account-specific questions beyond the agent’s scope get transferred to a human or a callback commitment.

Outbound: Working the Dormant List

The outbound component was a separate build from the inbound agent — different conversation design, different triggering logic, different compliance considerations.

We took the 400-entry dormant estimate list and ran it through a cleaning process first. Removed duplicates, invalid numbers, and entries older than 24 months. The working list was 312 contacts.

The outbound script was deliberately simple. Not a sales pitch — a re-engagement call:

“Hi [Name], this is [Company] calling. We had spoken about roofing work at your property back in [month/year]. I wanted to reach out to see if you’re still in need of any roofing work, or if there’s anything we can help with. Is now a good time to talk?”

If the homeowner engaged, the agent would gather current situation details and attempt to book a new estimate. If not interested, the agent thanked them and removed them from the list. If voicemail, a short message with the callback number.

We ran the outbound calls in batches — 40-50 per day, Tuesday through Thursday, between 10 AM and 4 PM. We specifically didn’t run on Mondays (lower engagement) or Fridays (people checked out before the weekend).

One thing we were careful about: compliance. Texas has specific regulations around robocalls and pre-recorded messages to residential lines. We structured the outbound agent as a live conversational AI rather than a pre-recorded message, which puts it in a different regulatory category, and we included proper opt-out language. We also had the client’s attorney review the call script before going live. For any business running outbound voice campaigns, get legal review first.

The Technical Build

We built both agents on Retell.ai — chosen for latency and reliability under storm-season call spikes. Retell’s concurrent call handling meant a hailstorm Tuesday wouldn’t create a call queue.

LLM: GPT-4o for both agents. We tested Claude 3.5 Haiku on outbound for cost optimization, but GPT-4o’s off-script handling was better for inbound emergency routing. The cost difference was about $60/month — not worth the compromise.

Voice: Cartesia. Latency advantage at Retell’s integration layer was meaningful. The client specifically asked it not sound “robotic or like a phone tree.”

Integrations: GoHighLevel CRM, Google Calendar, Twilio (telephony and SMS), and a custom webhook for emergency-flagged calls.

Build time: 9 business days — slightly over our standard 5-7 due to GoHighLevel API documentation gaps that required troubleshooting to get field mapping right.

Launch and Early Friction

We went live on a Thursday. The following week was unremarkable — normal call volume, the agent handled everything cleanly, the client and office manager were pleased.

Week 3, we hit the first real issue.

A caller used the phrase “I need a roof over my garage” — meaning they wanted a new garage built with a roof attached. The agent interpreted this as a roofing inquiry and proceeded through the qualification flow, eventually booking an estimate. The estimator showed up and found a homeowner wanting a construction project.

We updated the agent’s prompt to include clarifying logic: if the scope of work involved new construction or additions (rather than existing roof repair or replacement), the agent was to ask a clarifying question before continuing. A small prompt update, but it taught us something about how literally the agent interprets property-of-roof language.

The second issue was more subtle. During the first outbound campaign batch, the agent called a homeowner who had passed away in the interim. Their family member answered, which led to an awkward conversation. This wasn’t something we could predict from the lead list, but we added a step where the agent, at the first sign of unexpected information about the contact (name discrepancy, hesitation when asked for the homeowner), would pivot to “Is [Name] available?” rather than proceeding with the script.

Neither issue caused real damage, but both required iteration. This is normal in voice agent deployments — production conversations reveal scenarios your testing couldn’t anticipate. Plan for 2-3 rounds of prompt refinement in the first month.

Results at Day 30 and Day 60

Inbound Performance

Day 30:

  • 218 inbound calls handled
  • 0 missed calls / voicemails (previously 32% miss rate)
  • 41 new qualified leads generated by the agent
  • 28 estimate appointments booked directly by the agent
  • 4 emergency escalations triggered (all legitimate urgent situations)
  • Caller hang-up rate before completing qualification: 11%

The hang-up rate was higher than we’d like. We analyzed those calls and found two patterns: callers who were calling to check on an active job (existing customers with no patience for qualification questions) and callers who clearly wanted to speak to a human immediately. We added a “press 0 to speak to our team” option early in the greeting for the second group, and an “existing customer” routing path for the first. Hang-up rate dropped to 5% by day 45.

Day 60:

  • 231 inbound calls handled
  • 2 escalated to human (one angry customer complaint, one complex commercial project inquiry)
  • 47 new qualified leads
  • 35 estimate appointments booked directly
  • Caller hang-up rate: 5%

The office manager’s workload shifted visibly. She went from spending 3–4 hours per day handling initial inbound calls and qualification to roughly 45 minutes reviewing the AI’s work, confirming booked appointments, and handling escalated situations.

Outbound Performance

Outbound results over 60 days:

  • 312 contacts called
  • 187 connected (60% contact rate — better than expected)
  • 31 expressed interest in scheduling a new estimate (17% re-engagement rate)
  • 22 estimate appointments booked
  • 8 closed into jobs (36% close rate on re-engaged estimates)
  • Average job value of closed outbound leads: $5,400

8 jobs × $5,400 = $43,200 in recovered pipeline revenue from a list that had been sitting dormant.

The re-engagement rate surprised us — 17% is higher than typical for a cold outbound campaign. The explanation, we think, is that these weren’t cold leads. These were homeowners who had already shown enough interest to request an estimate. Many of them still had the roofing need — they just hadn’t been prompted to act on it.

Combined ROI Summary

MetricBeforeAfter 60 Days
Monthly call miss rate32%<2%
Avg. callback time on new leads4.2 hoursImmediate (AI)
New leads qualified per month~18 (estimated)44 avg
Estimate appointments bookedManual, same-day delaysInstant booking
Office manager time on initial calls3-4 hrs/day45 min/day
Outbound pipeline recovery$0 (not attempted)$43,200 in 60 days

Monthly investment: $1,000/month for the inbound voice agent subscription, plus a one-time outbound campaign setup fee.

The client’s words after 60 days: “We’ve closed enough jobs from the outbound campaign alone to cover a year of the subscription. And the inbound system has basically replaced the need for a second office manager.”

What We’d Do Differently

Start the outbound campaign during a slower inbound period. Launching both simultaneously meant the client was reviewing inbound leads and outbound reports at the same time. Staggering by 2 weeks would have been smoother.

Test the CRM integration with the client’s team before go-live. The GoHighLevel field mapping was technically correct but the lead card layout wasn’t what the estimator expected — it took a week before he trusted the data.

Invest more in the knowledge base upfront. The first version lacked specific service area zip codes, which led to a handful of appointments outside their coverage radius. One prompt update fixed it, but the wrong-location bookings were awkward to back out of.

The Broader Lesson

This engagement reinforced something I’ve come to believe: the technology is no longer the limiting factor. The infrastructure works. What determines success is the quality of the conversation design, the integrations with real business systems, and the iteration discipline in the first 30 days.

Contractors who get the most from these systems review call transcripts weekly and treat the first month as collaborative optimization. Those who treat it as set-and-forget are usually disappointed by month three.

For more on how voice agents work across service industries, see our post on the best voice agent for roofing companies or our analysis of how to calculate ROI on a voice agent.

Frequently Asked Questions

How long did the build and deployment take?

9 business days from kickoff to live calls — slightly longer than our standard 5-7 days due to a GoHighLevel API integration issue. The outbound campaign was built concurrently and launched on the same day as the inbound agent. If you have a standard CRM integration (most major platforms: HubSpot, Salesforce, ServiceTitan, Jobber), expect 5-7 days for a system like this.

Did the office manager feel threatened by the AI system?

This was a real conversation we had before and after deployment. The honest answer: initially there was some uncertainty. After 30 days, she described it as a relief. The volume of repetitive, draining work — answering the same qualification questions 15 times a day — was replaced by more meaningful work: handling real customer needs, managing the schedule, and supporting the estimator. The fear of replacement was replaced by what was essentially a promotion in how her time was used.

What happened to calls that were too complex for the AI?

Two escalations in 60 days. One was an angry existing customer who wanted to speak to the owner immediately about a warranty claim — the agent detected the frustration correctly, said “I want to make sure you get the right person on this,” and sent an emergency SMS to the owner. The other was a commercial property manager inquiring about a 40,000 sq ft flat roof replacement — clearly beyond the agent’s qualification scope, which triggered a “let me get our commercial estimator to call you back” response. Both escalations were handled appropriately.

Can the outbound campaign be run again with new leads?

Yes, and the client is planning a pre-summer push with their current estimate backlog and a fresh scrape of storm-affected zip codes from this past winter. Outbound voice campaigns are repeatable — the setup cost is one-time, and each subsequent campaign mostly requires list preparation and a prompt review. The key constraint is having a quality contact list. Garbage in, garbage out — high wrong-number or disconnected-number rates tank both contact rates and (potentially) your phone number reputation.

Is the voice agent compliant with call recording laws?

We included a call recording disclosure at the start of every call — “This call may be recorded for quality assurance” — which satisfies Texas’s single-party consent requirement. Texas is a one-party consent state for recording. If this roofing company operated in a two-party consent state (California, for example), we would have required explicit consent before recording. Always verify state-specific requirements before recording customer calls.

Ready to Get Started?

Tell us what you're working on. We'll review every submission and respond within 24 hours.