ChanlChanl
Side Hustle

The HVAC Company That Never Misses a Call

Build an AI receptionist that answers HVAC calls 24/7, triages emergencies, and books appointments. Then sell it as a service for $400-500/mo per client.

DGDean GroverCo-founderFollow
March 27, 2026
14 min read
HVAC service van parked outside a house at night with a phone screen showing an AI assistant booking an appointment

Dave's phone rang at 11:14 PM on a Thursday in July. He didn't hear it. He was asleep, like every HVAC company owner at 11:14 PM.

The homeowner whose AC had just died left a voicemail, waited three minutes, then called the next company on Google. By morning, Dave had a voicemail. The other company had a $3,200 install.

This happens every night across every trade. HVAC, plumbing, electrical, roofing. The phone rings after hours, nobody answers, and the customer calls someone else. Dave told me he loses three to five calls like this every week during peak season. At an average ticket of $800-3,000, that's $10,000-60,000 in annual revenue walking out the door because nobody picked up the phone.

He tried an answering service. $1.50 per call, and all they do is take a message. They can't tell the difference between "my AC is making a clicking noise" (schedule for Tuesday) and "there's water pouring from my ceiling" (wake someone up now). They definitely can't book an appointment or walk a homeowner through checking the thermostat batteries.

This article builds the thing Dave actually wants: an AI receptionist that answers every call, triages emergencies from routine maintenance, books appointments into his real calendar, and handles basic troubleshooting. Then we'll talk about selling it. Three HVAC clients at $400-500/month each is $1,200-1,500/month recurring. Your costs per client run about $75.

Table of contents

What the Numbers Look Like

This isn't hypothetical. Avoca AI published a case study where after-hours bookings at one HVAC company went from 58 to 208 per month after deploying an AI receptionist. That's a 258% increase on calls that previously went to voicemail. Horizon Plumbing, an Avoca customer, scaled to $129M in annual revenue with AI handling the first touch on every inbound call.

The efficiency gains are real, too. Average human call takes 8-10 minutes. AI handles the same call in 2-3 minutes. Not because it rushes, but because it doesn't small-talk, doesn't put people on hold, and doesn't fumble through a scheduling app.

Here's what we're building:

Inbound Call AI Receptionist Knowledge Base(Services & Pricing) Triage Tool(Emergency vs Routine) Scheduling Tool(Book Appointment) Customer Memory(Equipment & History) Chat Widget(Website Quotes)
AI receptionist architecture: phone call comes in, agent uses tools to triage, troubleshoot, book, and remember

Five pieces. A knowledge base with everything the receptionist needs to know. A triage tool that classifies urgency. A scheduling tool that books real appointments. Customer memory that remembers callers across visits. And multi-channel deployment so the same agent works on the phone and on the company's website.

Piece 1: The Knowledge Base

Dave's receptionist needs to answer questions: What does a furnace tune-up cost? Do you service Carrier units? What's your emergency rate? Right now, that knowledge lives in Dave's head and in a three-ring binder in the office.

We'll structure it and upload it so the agent can search it in real time.

Start by organizing the company's information into three documents. A service catalog with every service, what it includes, and the price range. A troubleshooting guide with the common problems and the steps a homeowner can try before booking. And an FAQ covering service area, warranties, brands serviced, and payment options.

Here's how the service catalog looks as structured content:

markdown
# Dave's Heating & Cooling - Service Catalog
 
## Maintenance
- **AC Tune-Up**: $89-129. Includes refrigerant check, coil cleaning,
  filter replacement, thermostat calibration. Takes 1-2 hours.
- **Furnace Tune-Up**: $79-119. Includes heat exchanger inspection,
  burner cleaning, safety controls test. Takes 1-1.5 hours.
- **Maintenance Plan**: $189/year. Two visits (spring AC, fall furnace).
  15% off repairs, priority scheduling.
 
## Repair
- **Diagnostic Fee**: $89, waived if you proceed with repair.
- **AC Repair**: $150-800 depending on issue. Common: capacitor ($150-250),
  fan motor ($250-450), compressor ($500-800+).
- **Furnace Repair**: $150-600. Common: igniter ($150-250),
  blower motor ($300-500), heat exchanger ($400-600+).
- **Emergency Rate**: 1.5x standard rate. Available 24/7.
  $50 after-hours dispatch fee.
 
## Installation
- **AC Replacement**: $3,500-7,500. Includes removal of old unit,
  new installation, 10-year warranty. Financing available.
- **Furnace Replacement**: $3,000-6,500. Same inclusions.
- **Full System (AC + Furnace)**: $6,000-12,000. Bundle discount applied.

Upload it to a knowledge base so the agent can search it during calls:

javascript
// Upload the service catalog
const catalog = await chanl.knowledge.create({
  title: "Service Catalog",
  source: "text",
  content: serviceCatalogMarkdown,
  metadata: { category: "services" }
});
 
// Upload troubleshooting guide
const troubleshooting = await chanl.knowledge.create({
  title: "Troubleshooting Guide",
  source: "text",
  content: troubleshootingMarkdown,
  metadata: { category: "troubleshooting" }
});

Now when a caller asks "how much does it cost to replace an AC unit?", the agent searches the knowledge base:

javascript
const results = await chanl.knowledge.search({
  query: "AC replacement cost",
  limit: 3
});
// Returns the installation section with pricing: $3,500-7,500

The agent doesn't guess. It pulls the answer from Dave's actual pricing, quotes a range, and mentions financing. If Dave updates his prices in the spring, you update one document and every call from that point forward uses the new numbers.

The troubleshooting guide is where the real value shows up on routine calls. Instead of booking a $89 diagnostic for a homeowner whose thermostat just needs new batteries, the agent walks them through checking batteries, verifying the breaker, and making sure vents aren't blocked. If those steps fix it, the homeowner is thrilled (free fix) and remembers Dave's company next time. If they don't fix it, the agent books the appointment with notes on what was already tried, saving the technician time on-site.

Piece 2: The Emergency Triage Tool

This is the piece the answering service can't do. An answering service treats every call the same way: take a name, take a number, leave a message. But "my furnace stopped working" at 2 AM in January is a fundamentally different call than "I want a quote on a new AC unit."

The triage tool classifies every call into one of three buckets: emergency (dispatch now), urgent (call back within 2 hours), or routine (schedule during business hours).

javascript
const triageTool = await chanl.tools.create({
  name: "classify_call_urgency",
  description: "Classify an HVAC service call by urgency based on symptoms, weather, and safety risk",
  type: "http",
  inputSchema: {
    type: "object",
    properties: {
      symptoms: {
        type: "string",
        description: "What the customer describes: noise, leak, no heat, smell, etc."
      },
      systemType: {
        type: "string",
        enum: ["ac", "furnace", "heat_pump", "water_heater", "thermostat", "other"]
      },
      safetyRisk: {
        type: "boolean",
        description: "True if gas smell, carbon monoxide alarm, electrical burning, or water damage mentioned"
      }
    },
    required: ["symptoms", "systemType", "safetyRisk"]
  },
  configuration: {
    http: {
      method: "POST",
      url: "https://your-api.com/triage/classify"
    }
  }
});

The classification logic behind this tool is straightforward. Safety risks always escalate to emergency. No heat when it's below freezing and no AC when it's above 95 are emergencies too. Everything else is routine unless the customer says something is leaking or flooding, which bumps it to urgent.

Here's how the agent uses it in a conversation:

text
Caller: "Hi, I'm getting a weird burning smell from my vents
         when the furnace kicks on."
 
Agent:  [calls classify_call_urgency with:
         symptoms: "burning smell from vents when furnace runs",
         systemType: "furnace",
         safetyRisk: true]
 
Tool returns: { urgency: "emergency", reason: "burning smell indicates
               potential electrical or heat exchanger failure",
               action: "dispatch_now" }
 
Agent:  "A burning smell from your furnace can be a safety concern.
         I'm going to get a technician headed your way right now.
         In the meantime, please turn off your furnace at the
         thermostat and open a window if the smell is strong.
         Can I confirm your address?"

Compare that to the answering service response: "I'll leave a message for the office and someone will call you back in the morning." The homeowner with a burning smell doesn't want a callback in the morning. They want someone to tell them what to do right now and send help.

For emergencies, the tool triggers a notification to the on-call technician. For routine calls, it feeds the result to the scheduling tool. The triage classification also gets logged so Dave can review every call's urgency rating in his monitoring dashboard and adjust the rules if needed.

Piece 3: Appointment Scheduling

Once a call is triaged as routine or urgent-but-not-emergency, the agent needs to book it. This means connecting to Dave's actual calendar, finding available slots, and confirming with the customer.

The scheduling tool wraps whatever calendar system Dave uses. Google Calendar, Calendly, ServiceTitan, Housecall Pro. The tool interface is the same regardless of what's behind it.

javascript
const schedulingTool = await chanl.tools.create({
  name: "book_appointment",
  description: "Find available appointment slots and book HVAC service calls",
  type: "http",
  inputSchema: {
    type: "object",
    properties: {
      serviceType: {
        type: "string",
        enum: ["diagnostic", "tune_up", "repair", "installation_quote", "emergency"]
      },
      preferredDate: {
        type: "string",
        description: "Customer's preferred date (ISO format) or 'next_available'"
      },
      timePreference: {
        type: "string",
        enum: ["morning", "afternoon", "any"],
        description: "Customer's preferred time of day"
      },
      customerName: { type: "string" },
      customerPhone: { type: "string" },
      customerAddress: { type: "string" },
      notes: {
        type: "string",
        description: "Symptoms described, troubleshooting already attempted"
      }
    },
    required: ["serviceType", "customerName", "customerPhone", "customerAddress"]
  },
  configuration: {
    http: {
      method: "POST",
      url: "https://your-api.com/appointments/book"
    }
  }
});

The handler behind this tool calls the calendar API, finds the next available slot matching the customer's preference, and books it. A typical conversation goes:

text
Caller: "My AC isn't really cooling the house. It runs all day
         but the house stays at like 80 degrees."
 
Agent:  "That sounds frustrating. Let me ask a couple quick questions.
         Have you checked your air filter recently?"
 
Caller: "I don't think I've changed it in a while."
 
Agent:  "That's actually the most common cause of poor cooling.
         A clogged filter restricts airflow and makes the system
         work harder without actually cooling. If you can check
         the filter (it's usually behind a return vent on the
         wall or ceiling) and it looks gray or clogged, replacing
         it might solve it. Filters are about $5 at any hardware store.
 
         If a new filter doesn't help after a few hours, we should
         get a technician out. Want me to go ahead and schedule
         a diagnostic just in case?"
 
Caller: "Yeah, let's do that."
 
Agent:  [calls book_appointment with:
         serviceType: "diagnostic",
         preferredDate: "next_available",
         timePreference: "morning",
         notes: "AC running but not cooling. Possibly clogged filter.
                 Customer will try replacing filter first."]
 
Agent:  "I have Tuesday morning between 8 and 10 AM available.
         Does that work for you?"

The agent tried troubleshooting first. If the filter swap fixes it, the customer cancels and Dave didn't waste a truck roll. If it doesn't, the technician shows up with notes saying the filter was already replaced, so they skip that step and go straight to checking refrigerant levels or the compressor.

The appointment confirmation goes to both the customer (text message) and Dave's calendar. The notes field means the technician walks in knowing what's already been tried.

Piece 4: Wire It All Together

Now we have a knowledge base, a triage tool, and a scheduling tool. Time to create the agent that uses all three.

javascript
const receptionist = await chanl.agents.create({
  platform: "custom",
  name: "Dave's HVAC Receptionist",
  description: "24/7 AI receptionist for Dave's Heating & Cooling",
  type: "Voice Assistant",
  useCase: "support",
  configuration: {
    prompt: `You are the receptionist for Dave's Heating & Cooling,
    a family-owned HVAC company serving the greater Phoenix area.
 
    Your job:
    1. Greet the caller warmly. You represent Dave's company.
    2. Understand what they need (service, quote, emergency).
    3. For emergencies: classify with the triage tool and dispatch.
    4. For service questions: search the knowledge base for accurate pricing.
    5. For routine service: try basic troubleshooting first, then offer
       to schedule an appointment.
    6. Always confirm the customer's contact info and address.
 
    Tone: friendly, competent, not robotic. You're a helpful person
    at a local company, not a call center script.
 
    Important: if you're unsure whether something is an emergency,
    treat it as one. Better to dispatch unnecessarily than to miss
    a gas leak or no-heat situation.`,
    model: "gpt-4o"
  }
});
 
// Assign tools and knowledge to the agent via the dashboard,
// or use toolsets to group tools for the agent's MCP endpoint.

Once the agent has tools and knowledge assigned, your voice platform connects to its MCP endpoint. That single endpoint gives the voice platform access to everything: the triage tool, the scheduling tool, the knowledge base, and customer memory. The voice platform doesn't need to know about each tool individually. It connects to one URL and gets all of the agent's capabilities.

text
// Your agent's MCP endpoint (used by voice platforms like VAPI, Retell, etc.)
https://dave-hvac.chanl.dev/mcp

The agent is ready. Now it needs a phone number.

Voice: The Primary Channel

HVAC customers call when something breaks. The phone is the primary channel. Attach a phone number to the agent through the Chanl dashboard or via a voice platform integration (Twilio, VAPI, etc.), and every inbound call goes to the agent.

When someone calls that number, the agent picks up, greets them, and starts working through the conversation. Voice recognition handles the speech-to-text. The agent reasons about what the caller needs, calls the right tools, and responds with natural speech.

The same agent also works as a chat widget on Dave's website for customers who prefer to type. Add a web chat channel pointing to the same agent, set a greeting message, and embed the widget.

Same knowledge, same tools, same triage logic. Phone for the 11 PM emergency. Chat for the Saturday morning quote request. One agent, two channels.

Piece 5: Customer Memory

This is the piece that separates a good AI receptionist from one that feels like calling a stranger every time.

The first time someone calls Dave's company, the agent doesn't know them. It takes their name, address, and books the appointment normally. But after that call ends, something happens automatically.

How memory works

After every call, the platform runs fact extraction on the full transcript. An LLM reads the conversation and pulls out structured facts: equipment type, equipment age, issue reported, service performed, customer preferences. These facts get saved to the caller's memory profile, keyed by their phone number.

No code needed for this. It happens automatically when the call ends. Here's what the extracted facts look like for a typical HVAC service call:

text
Extracted from call transcript (automatic):
- Equipment: Carrier furnace, installed 2019
- Issue: Burning smell from vents when furnace kicks on
- Service: Emergency dispatch, heat exchanger inspection
- Location: Basement unit
- Preference: Prefers morning appointments
- Note: Has a dog, technician should call before arriving

When the next call comes in, the agent auto-loads the caller's memories by phone number and injects them into the LLM context before the conversation starts. The agent already knows their history before it says hello.

The second call

Here's what the difference sounds like:

text
[First call — no memory]
Agent:  "Thanks for calling Dave's Heating & Cooling.
         How can I help you today?"
 
Caller: "Hi, my furnace is making a weird noise."
 
Agent:  "I'm sorry to hear that. Can you tell me what
         kind of furnace you have?"
 
[Second call — with memory]
Agent:  "Thanks for calling Dave's Heating & Cooling.
         How can I help you today?"
 
Caller: "Hi, my furnace is making a weird noise again."
 
Agent:  "Hi! I can see you have a Carrier furnace that
         was installed in 2019. Last time we came out, it
         was a burning smell issue and the technician
         inspected the heat exchanger. Is this a similar
         noise, or something different?"

The second call is shorter, more accurate, and the customer feels like they're talking to someone who actually knows them. The technician who shows up also gets better notes because the agent can reference what was done last time.

During the call: real-time memory

The agent also has a memory_add tool available during the conversation. If the customer mentions something new that should be remembered, the agent stores it right then:

text
Caller: "Oh, and we got a new thermostat since last time.
         It's a Nest Learning Thermostat."
 
Agent:  [calls memory_add: "Customer upgraded to Nest
         Learning Thermostat, replacing old programmable
         thermostat"]
 
Agent:  "Got it, I've noted the Nest thermostat. That's
         good to know for the technician. ..."

Between the real-time memory_add during the call and the automatic fact extraction after the call ends, the customer's profile builds itself over time. By the third or fourth call, the agent knows their equipment, their service history, their preferences, and their address without asking.

Seeding memory from existing records

Dave has been in business for 15 years. He has customer records in ServiceTitan, or maybe a spreadsheet, or maybe a filing cabinet. Before launch, you can seed the memory system with his existing customer data so the agent is useful from day one, not just after the first AI-handled call.

javascript
// Seed memory from Dave's existing customer records
// (exported from ServiceTitan, spreadsheet, or CRM)
for (const customer of existingCustomers) {
  await chanl.memory.add({
    customerId: customer.phone, // keyed by phone number
    facts: [
      `Equipment: ${customer.equipmentType}, installed ${customer.installYear}`,
      `Address: ${customer.address}`,
      `Last service: ${customer.lastServiceDate}${customer.lastServiceType}`,
      `Maintenance plan: ${customer.hasMaintenancePlan ? 'Active' : 'None'}`,
    ]
  });
}

Now when Mrs. Johnson calls for the first time since Dave switched to the AI receptionist, the agent already knows she has a Trane heat pump installed in 2017 and she's on the annual maintenance plan. She doesn't have to re-explain her entire setup. That's the experience that generates five-star Google reviews.

Testing Before You Go Live

Before Dave's customers talk to this agent, you need to know it works. Not "it probably works." Actually works. That means testing the scenarios that matter most.

Build test scenarios that simulate the calls the agent will get:

Scenario 1: Gas smell emergency. A caller reports smelling gas near the furnace. The agent must classify this as an emergency within the first exchange, tell the caller to leave the house, and dispatch a technician. If the agent tries to troubleshoot a gas smell, that's a failure.

Scenario 2: Routine maintenance request. A caller wants to schedule their fall furnace tune-up. The agent should quote $79-119 from the knowledge base, check calendar availability, and book it. No triage escalation needed.

Scenario 3: Ambiguous symptoms. A caller says "something doesn't sound right with my AC." This could be a loose fan blade (routine) or a failing compressor (urgent). The agent should ask clarifying questions before classifying.

Scenario 4: Off-hours pricing question. A caller at 10 PM asks "how much to replace my whole system?" The agent should pull the $6,000-12,000 range from the knowledge base, mention financing, and offer to schedule a free estimate. It should not try to give an exact quote without a site visit.

Run each scenario with AI-generated test callers playing different personas: the panicked homeowner, the price-shopping neighbor, the elderly customer who isn't sure what's wrong. Review the transcripts. Check that triage classifications were correct, that pricing quotes matched the knowledge base, and that appointments landed in the right time slots.

Scenario 5: Returning customer with memory. A caller who's called before contacts the agent again. The agent should reference their equipment and service history from memory without being asked. If the agent starts from scratch and asks "what kind of furnace do you have?" for a customer who called last month, that's a failure. Memory should make the second call feel like a continuation, not a restart.

Scenario 6: The callback loop. A caller says "I called earlier and left a message but nobody called me back." This is the most dangerous call for customer retention. The agent needs to acknowledge the frustration, not deflect, and immediately offer to solve the original problem. If the agent says "I don't have a record of that call," the customer hangs up and writes a one-star Google review.

Scenario 7: The competitor comparison. A caller asks "Company X quoted me $4,500 for a new AC. Can you beat that?" The agent should not trash the competitor or make promises. It should explain that Dave's pricing depends on the specific unit and installation requirements, quote the general range from the knowledge base, and offer a free on-site estimate to give an accurate number.

These test scenarios aren't a one-time exercise. Run them every time you update the knowledge base or adjust triage rules. A price change that doesn't propagate to the agent's answers creates exactly the kind of confidence-destroying experience you're trying to prevent. Automated scenario testing catches these regressions before customers do.

The Business Model

Here's where this turns into a side hustle.

Your costs per client:

  • Chanl platform: ~$30/month
  • LLM API calls (voice + reasoning): ~$30-40/month for a typical call volume (200-400 calls/month)
  • Phone number: ~$5/month
  • Total: roughly $65-75/month per client

What you charge:

  • Setup fee: $500-750 (structuring the knowledge base, configuring tools, testing)
  • Monthly: $400-500/month

Your margin: $325-425/month per client, recurring.

Three clients gets you to $1,200-1,500/month. That's a real number. Not "scale to a million users" fantasy math. Three local HVAC companies, each paying you what they currently pay an answering service that does less.

Compare that to what Dave currently pays for:

VoicemailAnswering ServiceAI Receptionist
Monthly cost$0$300-500$400-500
After-hours coverageNoYesYes
Books appointmentsNoNoYes
Triages emergenciesNoNoYes
TroubleshootsNoNoYes
Remembers customersNoNoYes
Handles simultaneous callsNoLimitedUnlimited
Revenue recovered/month$0~$500 (messages only)$2,000-5,000+

The economics work because one recovered emergency call per month justifies the entire cost. Dave loses a $3,000 install because nobody answered the phone. You're charging him $450/month. The ROI conversation isn't a conversation. It's a statement.

And here's the compounding part: everything you build for Dave works for the next HVAC company. The triage tool doesn't change. The scheduling integration doesn't change. The agent architecture doesn't change. You swap out the knowledge base with the new company's pricing, adjust the system prompt with their name and service area, and you're live. The second client takes hours, not a weekend.

Scaling Beyond HVAC

The architecture is identical for every home services trade:

Plumbers: Swap triage rules (burst pipe = emergency, dripping faucet = routine). Same knowledge base structure, same scheduling tool.

Electricians: Triage on safety (sparking outlet = emergency, dead outlet = routine). Same everything else.

Roofers, garage door companies, pest control, locksmiths. Every one of them misses after-hours calls. Every one of them pays for answering services that just take messages.

At ten clients across three trades, you're at $4,000-5,000/month recurring. Your per-client costs don't increase much because the architecture is shared. You're maintaining knowledge bases and monitoring dashboards, not rebuilding systems.

Finding Clients

The pitch sells itself because you can demonstrate the problem live.

Call any HVAC company after 6 PM. If you get voicemail, that's your lead. When you follow up during business hours, tell them exactly what happened: you called, nobody answered, and if you'd been a homeowner with a broken AC, you would have called the next company on Google.

Then show them what happens when their customers call your AI receptionist instead. Set up a demo with their actual service catalog, call it in front of them, and watch it triage a fake emergency, quote their real prices, and book into their real calendar.

The answering service comparison closes deals. "You're paying $300-500/month for someone to take a message. I'm offering you something that actually books appointments and handles emergencies. Same price."

Realtors, property managers, and general contractors are secondary markets. Anyone who relies on inbound phone calls and can't afford to miss them.

What You're Actually Selling

You're not selling AI. Nobody buying HVAC services cares about AI. You're selling three things:

Never miss a call. Every call gets answered, every time, including 2 AM on Christmas. The phone never goes to voicemail.

Fewer wasted truck rolls. Basic troubleshooting before dispatch means fewer $89 diagnostics for a tripped breaker or dead thermostat batteries. Dave's technicians spend their time on real problems.

Emergency response. A gas smell at midnight gets treated like a gas smell at midnight. Not like a voicemail to be checked in the morning.

The technology behind those three things is what you've built in this article: a knowledge base for accurate answers, a triage tool for correct classification, and a scheduling tool for real appointments. But the customer buys the outcome, not the architecture.

Handling Objections

Dave will have concerns. Every HVAC owner does. Here are the three you'll hear most.

"My customers want to talk to a real person." Some do. But at 11 PM, their options are voicemail or your AI. Given that choice, 90% prefer the AI that actually helps. And unlike an answering service, the AI remembers them. When Mrs. Johnson calls back, it knows she has a Carrier furnace and her last service was a heat exchanger inspection. That's more personal than most human receptionists. You're not replacing Dave's daytime office staff. You're covering the hours when nobody is there. The 58-to-208 booking jump at that HVAC company? Those were all calls that previously went unanswered. The customers didn't complain about talking to AI. They were relieved someone picked up.

"What if it says something wrong?" This is the legitimate concern, and it's why you built the knowledge base from Dave's actual pricing and the triage tool with conservative defaults. The agent only quotes what's in the knowledge base. It doesn't invent prices. For anything ambiguous, it offers to schedule a visit rather than guess. Show Dave the monitoring dashboard where he can review every conversation and flag anything that needs adjustment. Transparency builds trust.

"I don't understand this technology stuff." Dave doesn't need to. He needs to understand the dashboard that shows him how many calls came in last night, how many got booked, and how many were emergencies. That's three numbers. You handle the technology. He checks three numbers every morning with his coffee.

What Comes Next

You've got the five pieces: knowledge base, triage tool, scheduling tool, customer memory, and multi-channel agent. But production means ongoing work.

Monthly maintenance. Prices change. Services get added. The knowledge base needs updates. Build this into your retainer. One hour per month per client to review call transcripts, update the knowledge base, and tune triage rules.

Monitoring. Review the call analytics weekly. Look for calls where the triage classification was wrong, where the agent couldn't answer a question (knowledge gap), or where customers hung up (conversation failure). Every gap you find is an improvement you make. Check that memory extraction is capturing the right facts after calls. If the agent is missing equipment details or service history, tune the extraction prompts.

Seasonal adjustments. HVAC is seasonal. Summer is AC-heavy. Winter is furnace-heavy. The triage rules should shift with the season. "No AC" in July is more urgent than "No AC" in December. Update the triage tool when the season changes.

Dave doesn't miss calls anymore. Last Thursday at 11:14 PM, a homeowner's AC died. This time, the phone rang and someone answered. The agent recognized the caller from a tune-up three months ago, confirmed the address it already had on file, checked whether it was a safety issue, and booked a morning diagnostic. By the time Dave woke up, the appointment was on his calendar with notes saying the homeowner already tried replacing the filter and that the system was a two-year-old Lennox unit.

The other company on Google never got that call.

Build it this weekend. Land your first client next week. By month three, you'll have a recurring revenue stream that grows every time you add a new trade to your portfolio.


More Side Hustle Guides

The same architecture works across industries. Each guide covers the specific knowledge base, tools, and triage rules for that vertical:

Build an After-Hours Agent This Weekend

Upload a service catalog, wire up triage and scheduling tools. Your HVAC client stops missing calls on Monday.

Start Building
DG

Co-founder

Building the platform for AI agents at Chanl — tools, testing, and observability for customer experience.

Learn Agentic AI

One lesson a week — practical techniques for building, testing, and shipping AI agents. From prompt engineering to production monitoring. Learn by doing.

500+ engineers subscribed

Frequently Asked Questions