
An HVAC Owner's AI Agent Stack (And Why It Transfers to Other Trades)
Table of Contents
The HVAC agent stack that works is five jobs, not a chatbot: dispatch, missed-call follow-up, estimate follow-up, review ask, and parts/status — and those same five jobs transfer to plumbing, electrical, and roofing because the work is field service, not HVAC physics. If you only fund a website widget, you still lose the after-hours ring, the estimate that dies in a driveway, and the review you never asked for.
I'm William Spurlock — AI Solutions Architect, Fractional AI CTO, and studio founder. I've built 500+ automations and spent 20,000+ hours inside agentic systems. This post is the vertical playbook. The parent post, AI agents for operations, owns the generic ops pattern: read-only first, human approval, measure hours. I am not rewriting that. I am naming the five HVAC jobs I actually wire, the systems they sit on, and why a plumber or roofer can steal the same stack without inventing a new architecture.
I do not invent shop names, contract values, or ROI slides. When I say "an HVAC owner" or "a trades shop," I mean the pattern, not a case study I fabricated. n8n is the wiring layer. The model is a classifier and a drafter. The owner still owns the P&L.
If you still need the definition of an agent versus a fixed automation, start with what an AI agent means for business owners and AI agents vs AI automation. Then come back here for the trades map.
What AI agent stack works for an HVAC business? #
An HVAC shop does not need a general-purpose "AI employee." It needs five narrow agents on the jobs that already eat the office: dispatch, missed-call follow-up, estimate follow-up, review ask, and parts/status. Each agent has one trigger, one allowed action set, and one human who can kill it. The rest of the business stays human.
That is the stack I recommend in August 2026. Not a single mega-agent that "runs the company." Five lanes that share a job board, a CRM or field-service system, and n8n as the wiring.
| HVAC job | Agent | What it may do | What it may not do |
|---|---|---|---|
| Who goes where today | Dispatch | Draft a board: tech, window, skill, travel, emergency vs maintenance | Reassign a live job, cancel a customer, override a union or overtime rule |
| Phone rings and nobody picks up | Missed-call follow-up | Text or voicemail-to-SMS in minutes; offer two bookable slots | Quote a price, diagnose a no-cool, promise a same-day tech it cannot see |
| Estimate left on the kitchen table | Estimate follow-up | Timed SMS/email: day 1, day 3, day 7; log replies | Change the price, add a discount, mark the job sold |
| Job complete and paid | Review ask | Send one honest-feedback link after a clean close | Gate happy vs unhappy customers, offer a gift, ask for a 5-star script |
| Part on order / tech en route | Parts and status | Pull the real status and send the real ETA | Invent warehouse inventory or a delivery date the vendor did not give |
The transfer rule is simple: if another trade has the same job, it can run the same agent with different nouns. A plumber's "no-cool" is a burst pipe. A roofer's "estimate on the table" is a storm-season bid. The wiring does not change.
I treat n8n as the switchboard. n8n's own docs (current as of this writing) describe it as a fair-code workflow tool that combines AI steps with business process automation. The n8n Production AI Playbook (2026) is explicit: agents sit inside workflows, and the workflow controls what the model sees, which tools it can use, and what happens after it answers. That is the architecture I want for a trades shop — not a chat window with your customer list pasted in.
For inbound lead capture that is not HVAC-specific, I already wrote how to use an AI agent to handle inbound leads while you sleep. This post owns the field-service jobs that sit after the ring.
What "stack" means here (and what it does not) #
A stack is five named agents plus the systems they read:
- Job board / dispatch — ServiceTitan, Housecall Pro, Jobber, or a disciplined Airtable. The brand does not matter. The fields do: tech, skill, zip, window, emergency flag, parts hold.
- Phone / SMS — the number customers already call. Missed-call webhooks beat a new "AI phone line" nobody knows exists.
- Estimate records — the PDF or line items the tech left, with a status and an owner.
- Review destination — Google Business Profile first. One link. No tablet in the driveway.
- n8n — triggers, credentials, retries, approval pauses. Optional MCP later if you want a model to call tools through a protocol instead of a pile of HTTP nodes.
It is not a new CRM. It is not a replacement for a licensed tech. It is not a promise that "AI will grow the shop 30%." I will not write that sentence because I cannot source it for your trucks.
Why start with HVAC instead of a generic ops agent? #
I start with HVAC because the shop already has a board, a phone, estimates, reviews, and parts holds — five jobs that repeat every day and transfer to any trade that rolls trucks. A generic ops agent that "analyzes the business" is useful later. It does not catch the after-hours no-cool. The vertical stack does.
The labor math is why this is not a toy. The U.S. Bureau of Labor Statistics Occupational Outlook Handbook (last modified August 28, 2025) counts 425,200 heating, air conditioning, and refrigeration mechanics and installers in 2024 and projects 8% growth from 2024 to 2034 — much faster than average — with about 40,100 openings a year when you include replacements. That is a workforce under pressure. An owner who burns office hours on callback tag and "where's my part?" is not short on AI hype. They are short on dispatcher minutes.
The parent ops post is still the right read for weekly briefs, read-only analysis, and how to measure hours. I link it on purpose: AI agents for operations owns "which repetitive ops tasks first" at the company level. This post owns the trades board. If you skip the vertical jobs and start with a Monday KPI memo, you will have a pretty Slack message and a full voicemail box.
The failure mode I see on trades work #
Owners buy a chatbot, point it at the website, and call it an agent. Then they grant it write access to the field-service system because a vendor demo booked a fake appointment. That sequence is backwards.
My sequencing for a trades shop:
- Missed-call follow-up — highest speed-to-lead, lowest write risk if the agent only texts and offers slots the calendar already shows as open.
- Estimate follow-up — the money is already quoted; the agent only nudges and logs.
- Review ask — one compliant ask after a clean close.
- Parts/status — read the vendor or PO status; do not invent ETAs.
- Dispatch — last among the five, because a wrong assignment is a truck in the wrong driveway.
Dispatch is the highest-value job and the easiest to break. I do not let an agent move a live tech on day one. I let it draft the morning board.
Why HVAC is a better first vertical than "all field service" #
HVAC has a clean emergency vs maintenance split, a seasonal spike you can name (heat wave, first freeze), and parts that actually stall jobs. Plumbing shares the emergency split. Electrical shares the permit/status pain. Roofing shares the estimate-follow-up pain at storm volume. Start where the split is obvious, then copy the agents.
I have written a related field-ops pattern for pool shops — n8n and Airtable for small pool field operations. Same idea: board, visit record, inbox triage. Different nouns. I am not claiming that build is your HVAC ROI. I am saying the architecture repeats.
Which HVAC jobs should become agents first? #
Hand an agent the jobs that are high-volume, rule-shaped, and expensive when they sit — missed calls and estimate follow-up first; dispatch only after the drafts match how a human would have built the board. If a job needs a license, a price exception, or a safety call, it stays human.
Here is the scoring I use with an HVAC owner. I do not need their books. I need last week's call log and the estimate pipeline.
| Score the job | Missed-call | Estimate follow-up | Review ask | Parts/status | Dispatch |
|---|---|---|---|---|---|
| Volume this week | High if the phone is the lead source | High if techs leave paper or PDFs | One per closed job | Every delayed job | Every truck, every morning |
| Rule-shaped? | Yes: text, two slots, opt-out | Yes: day 1 / 3 / 7, stop on reply | Yes: one ask, no incentive | Yes if status is a field | Mixed: skill + zip + emergency |
| Cost of a miss | Lead calls the next shop | Quote dies quietly | Reviews stay thin | Customer calls twice | Wrong truck, overtime, callback |
| Safe first mode | SMS draft or auto-send with a script | Auto-send on a locked template | Auto-send after close flags | Read-only status SMS | Draft board for human publish |
| First-month risk | Over-promising arrival | Nagging after a "no" | Review gating (policy hit) | Invented ETA | Live reassignment |
If you want the generic "which ops tasks first" rubric — hours, error rate, reversibility — it lives in the operations agents post. The HVAC-specific call is: start where the customer is waiting on you, not where you want a dashboard.
What I tell a shop to start this week #
Three workflows. Not fifteen.
- Missed-call → SMS in under five minutes with two real windows pulled from the calendar.
- Estimate status = sent → follow-up sequence that stops on reply, book, or "not now."
- Job status = complete + paid + no open complaint → one review ask.
That is enough to prove the wiring. Intake and onboarding for other businesses is a different first automation — I covered that in the first AI automation every small business should build. For a trades shop, the first automation is the phone you already miss.
Jobs that look tempting and waste the first month #
- Live voice agent that diagnoses HVAC. A model will invent a capacitor. The homeowner will buy the wrong part. Keep diagnosis with the tech.
- Auto-discount to close the estimate. That is pricing, not follow-up. A human owns margin.
- Dispatch that "optimizes routes" against a map the CRM does not trust. Bad geocodes make confident nonsense.
- Review kiosk in the driveway. Google's Maps user-generated content policy (Prohibited & restricted content) bars pressuring people to review on the premises and bars selectively soliciting positive reviews. A tablet at the truck is a policy problem, not a growth hack.
How does the dispatch agent actually run a day? #
The dispatch agent drafts the morning board from open jobs, tech skills, zip clusters, and emergency flags — then a named dispatcher publishes it. It does not move a live truck until a human has matched its drafts for a boring streak of weeks. If that sounds slow, good. A wrong assignment is not a typo. It is a callback and a customer who tells the neighborhood.
Here is the day I want:
| Time (shop local) | Agent action | Human action |
|---|---|---|
| 5:45 a.m. | Pull overnight emergencies, leftover callbacks, maintenance windows | None |
| 6:00 a.m. | Draft board: tech, job, window, travel note, parts hold | Dispatcher reads exceptions only |
| 6:20 a.m. | Flag conflicts: two emergencies, one install crew, missing part | Dispatcher reorders or calls the customer |
| All day | Propose inserts for new emergencies into open gaps | Dispatcher accepts or rejects |
| 4:30 p.m. | Draft tomorrow's leftover list | Office confirms parts and permits |
The agent needs fields, not vibes:
- Skill tags — install vs service vs commercial vs refrigeration. A maintenance tech is not your heat-pump install.
- Emergency flag — no-heat / no-cool / gas smell. Gas smell is never an agent decision. It is a human, now.
- Parts hold — if the condenser is not on the truck, the job is not "open." It is a status-agent job.
- Customer window — the promise you already made. The agent cannot silently shrink it.
Prompt I lock for a morning board (template only) #
You are a dispatch analyst for an HVAC shop.
You may READ: open jobs, tech roster, skill tags, zip, parts-hold flag, emergency flag.
You may NOT: assign a live job, cancel a customer, change a quoted price, or invent travel time.
Goal: Draft tomorrow's board for {{date}} for approval by {{dispatcher}}.
Rules:
1) Emergency (no-heat, no-cool, gas) outranks maintenance. Gas smell = escalate to human only; do not slot it.
2) Do not assign a job whose parts-hold = true.
3) Prefer the tech whose skill tags match AND who is already in that zip cluster.
4) If two emergencies compete for one tech, list both and mark CONFLICT. Do not pick.
5) Output a table: time window | tech | job id | address city | job type | notes.
6) If a field is missing, write MISSING: {{field}} and skip that job.
Tone: dispatcher-facing. No hype. No customer-facing copy.That prompt is boring on purpose. Boring drafts are what a dispatcher will actually publish.
What transfer looks like on this job #
| HVAC dispatch input | Plumbing | Electrical | Roofing |
|---|---|---|---|
| No-cool / no-heat | Active leak / sewage backup | No-power / sparking panel | Active leak after storm |
| Install vs service skill | Service vs repipe vs water heater | Service vs panel vs EVSE | Repair vs full tear-off |
| Parts hold on condenser | Fixture or valve on order | Panel or meter socket lead time | Material drop not on site |
| Maintenance window | Recurring drain or water-heater flush | Recurring inspection | Gutter / tune-up route |
Same agent. Different emergency nouns. The conflict rule stays: two emergencies, one crew, human picks.
I do not let this agent talk to the customer. Status texts belong to the parts-and-status lane. Dispatch that also "keeps the customer updated" is how you get two messages that disagree.
How do you recover missed HVAC calls without sounding like a robot? #
A missed-call agent should text within minutes, name the shop, offer two real calendar slots, and stop the moment a human picks up the thread — it should not diagnose the system or quote a price from a voicemail. Speed is the job. Personality is optional. Honesty is not.
The dated receipt on speed is old and still the one I cite. Oldroyd, McElheran, and Elkington in Harvard Business Review, The Short Life of Online Sales Leads (March 2011), audited 2,241 U.S. companies and found an average response of 42 hours among firms that replied within 30 days, with 23% never responding. In a related lead study they report, firms that tried to contact a prospect within an hour were nearly seven times as likely to qualify the lead as those that waited even an hour longer, and more than 60 times as likely as those that waited 24 hours or more. That paper is about web leads, not HVAC voicemail. I treat it as a ceiling on delay, not as your close rate. A homeowner with a dead AC in August does not wait 42 hours. They call the next logo.
So the agent’s SLA is minutes, not "we’ll get back to you."
The recovery sequence I actually wire #
| Step | Timing | Message job | Stop if |
|---|---|---|---|
| 1. Recovery text | Under 5 minutes, ideally under 60 seconds | "We missed you. Reply 1 for a callback, or book one of these two windows." | They book, they say stop, or a human takes the SMS |
| 2. Slot confirm | Immediate on reply | Confirm window, address check, emergency vs maintenance | Address is not in service area |
| 3. Same-day nudge | 2–4 hours later if no reply | One more offer, then silence until next day | Still no reply |
| 4. Next-morning | Next business morning | Last polite touch, then close the loop | Still no reply — mark dead, do not spam |
The slots must be real. If the agent offers 2–4 p.m. and the calendar is full, you taught the customer that your texts lie.
What the agent may say vs what it must refuse #
| Allowed | Forbidden |
|---|---|
| Shop name, callback number, two open windows | "Sounds like a capacitor" |
| "If this is a gas smell, call 911 / your gas utility, then us" | A price band pulled from last summer's average ticket |
| Service area check | "We'll be there in 45 minutes" when no tech is free |
| After-hours: first window tomorrow, plus emergency flag to on-call human | Booking a job the on-call tech did not accept |
Voice tone: short, local, human. I write the SMS as if the owner typed it between jobs — not as a "delightful brand moment."
For the broader overnight inbound pattern (forms, chat, email), use inbound leads while you sleep. This section owns the missed ring on a trades line.
Transfer table for this job #
| HVAC missed-call | Plumbing | Electrical | Roofing |
|---|---|---|---|
| No-cool after hours | Burst pipe / no water | Outage / breaker trip | Storm leak |
| Maintenance tune-up request | Water-heater quote | Panel upgrade request | Inspection / bid request |
| Same two-slot SMS | Same two-slot SMS | Same two-slot SMS | Same two-slot SMS; storm days need a human overflow |
The SMS skeleton does not change. The emergency escalation line does.
How should estimate follow-up work after the tech leaves? #
Estimate follow-up is a timed sequence on a locked template: day 1, day 3, day 7, then stop — the agent may nudge and book, it may not change the price or invent a "this week only" discount. The tech already did the hard part. The office losing the quote in a text thread is the leak.
Most HVAC estimates die of silence, not of a better competitor pitch. The homeowner meant to ask a spouse. The PDF sat under a magnet. Nobody called. That is a workflow job, not a sales-genius job.
| Day | Channel | Job of the message | Agent may | Agent may not |
|---|---|---|---|---|
| 0 (tech leaves) | SMS + email | "Here is the estimate. Reply with questions." | Attach the real PDF / portal link | Add a surprise fee |
| 1 | SMS | "Any questions on the {{system}} option?" | Answer from a FAQ the owner approved | Re-quote a different tonnage |
| 3 | SMS or call request | Offer a 10-minute call window | Book a callback on the calendar | Drop the price $400 to "help it land" |
| 7 | Last check-in, then close | Mark status = stale | Keep weekly nags for a month | |
| On reply | Whatever they used | Route to a human if the question is not in the FAQ | Hand off with the thread | Guess at financing terms |
Stop rules are the product:
- They say no, not now, or stop.
- They book.
- They ask a question the FAQ cannot answer — human takes it.
- The estimate expires per the shop's written rule (I like 14 or 30 days, written on the PDF).
Why I keep price out of the agent's hands #
A model will "help" by shaving the number. That is not help. That is margin walking out the door with no owner decision. If you want a promo, put it on the template as a dated, owner-approved line — not as a tool the agent can call.
If you need a way to score whether follow-up is even worth building, use how to calculate the ROI of AI automation before you build anything. Count stalled estimates and hours spent chasing them. Do not invent a close-rate lift I did not measure in your shop.
Transfer table for this job #
| HVAC estimate | Plumbing | Electrical | Roofing |
|---|---|---|---|
| System replacement / heat pump | Repipe, water heater, sewer | Panel upgrade, EV charger | Tear-off, insurance supplement |
| Maintenance agreement upsell | Recurring service plan | Whole-home surge / inspection | Maintenance plan after storm |
| Day 1 / 3 / 7 cadence | Same cadence | Same cadence | Compress during storm season; human overflow |
Roofing is the trade where this agent pays fastest in volume, because storm weeks produce more PDFs than any office can chase by hand. HVAC is the trade where I still start, because the year-round cadence is easier to debug.
When should the review-ask agent fire — and when must it stay quiet? #
The review-ask agent fires once, after the job is complete, paid, and free of an open complaint — and it asks every qualifying customer for honest feedback, not only the ones you expect to be happy. If you filter for five-star vibes, you are not running an agent. You are running review gating.
Google's own rules are the constraint, not my taste. The Maps Prohibited & restricted content policy says contributions must reflect a genuine, unbiased experience. It bars paid or in-kind reviews, bars offering incentives for a review or for removing a negative one, and bars discouraging negative reviews or selectively soliciting positive reviews. It also says merchants should not pressure people to rate or write reviews while on the premises, or request that specific content be included. Google's tips to get more reviews repeats the incentive ban. Business Profile restrictions are what you risk if Fake Engagement is found: unpublished ratings, a review freeze, a public warning.
So the agent’s job is a single, boring ask — not a kiosk, not a "mention Mike by name" script, not a gift card.
When it fires #
| Condition | Fire? | Why |
|---|---|---|
| Job status = complete AND invoice paid | Yes | The experience happened |
| Open complaint, warranty callback, or 1–2 star private survey | Still yes if you use one ask for everyone — route the unhappy path to a human reply, do not skip them | Skipping them is selective solicitation |
| Job canceled / never ran | No | No experience to review |
| Customer already reviewed this visit | No | Do not nag |
| Customer opted out of SMS | Email only, or skip | Respect the channel they refused |
I am careful here: some operators want to "protect" the profile by only asking happy people. That is the practice Google names as selective solicitation. The compliant pattern is one ask, same link, then a human who replies to every public review — including the rough ones.
What the message looks like #
One SMS or email. Shop name. "If you have a minute, honest feedback helps other homeowners." Link to the Google Business Profile review form. No star coaching. No "we aim for 5s."
If you also want the shop to show up when people ask AI for a local HVAC rec, that is a different job — visibility, not this agent. See can local businesses show up in Google AI Mode and how to get your local business into AI-generated recommendations. This section only owns the ask after the truck leaves.
Transfer table for this job #
| HVAC close | Plumbing | Electrical | Roofing |
|---|---|---|---|
| Install or major repair paid | Water-heater swap paid | Panel upgrade paid | Install paid, punch list closed |
| Maintenance visit paid | Drain clear paid | Trouble-call paid | Repair paid |
| Same one-ask rule | Same | Same | Same — do not wait in the driveway with a tablet |
What does a parts-and-status agent own? #
A parts-and-status agent reads the real hold — PO, vendor ETA, tech en route — and texts the customer that fact. It does not invent a warehouse quantity or a Tuesday delivery the vendor never promised. Status is where shops lose trust. One optimistic text is enough.
This is the agent owners skip because it feels small. It is not small. "Where is my part?" and "is the tech coming?" are the two calls that blow up a dispatcher’s afternoon.
| Status the agent may send | Source of truth | Forbidden rewrite |
|---|---|---|
| Part on order, vendor ETA {{date}} | PO line or vendor portal field | "Should be any day now" |
| Tech en route, window {{start}}–{{end}} | Dispatch board, published only | "He's 10 minutes away" from GPS the shop does not use |
| Job delayed, new window offered | Dispatcher-approved reslot | Silent cancel |
| Permit pending | Permit status field | "We'll start Monday" with no permit |
If the field is empty, the agent says the field is empty — or it stays quiet. "MISSING" is a valid customer-facing outcome only when a human has approved that honesty. Most shops would rather the agent wait than guess.
Why this agent stays read-heavy #
n8n's production AI agent guidance (2026) puts human-in-the-loop, error handling, and monitoring in the same conversation as the model. Status texts are customer-facing. I start them as approve-to-send for two weeks, then auto-send only the templates that never drifted.
If you want the deeper production sequence — kill switch, staging, write access last — I already wrote how to deploy an AI agent to production without breaking everything. For customer-facing copy that invents facts, see how to stop client-facing AI agents from hallucinating. Status is the HVAC version of that problem.
Transfer table for this job #
| HVAC status | Plumbing | Electrical | Roofing |
|---|---|---|---|
| Condenser / coil on order | Special-order fixture | Panel / meter equipment | Material drop / dumpster |
| Permit for install | Permit for water heater or sewer | Permit / inspection | HOA / permit / insurance adjuster |
| Tech en route | Same | Same | Crew day confirmation |
Roofing adds insurance and adjuster status. Electrical adds inspection. Plumbing adds municipal water-shutoff windows. The agent still only repeats a field.
How does the same stack transfer to plumbing, electrical, and roofing? #
The stack transfers because plumbing, electrical, and roofing run the same five jobs — board, missed ring, estimate sitting on a table, review after close, and "where's my part" — with different emergency nouns and different status fields. You do not need a new architecture. You need a new glossary and a few extra stop rules.
This is the section I write for the owner who says "we're not HVAC, this doesn't apply." It does apply. The license on the truck changes. The office pain does not.
| HVAC job | Agent | Plumbing | Electrical | Roofing |
|---|---|---|---|---|
| Who goes where | Dispatch | Leak vs water-heater vs repipe skill | Outage vs panel vs EVSE skill | Repair vs tear-off vs crew-day |
| Missed ring | Missed-call follow-up | After-hours flood | After-hours spark / outage | Storm-week overflow |
| Quote on the table | Estimate follow-up | Repipe / sewer bid | Panel / whole-home bid | Storm bid + insurance supplement |
| Job paid | Review ask | Same one-ask rule | Same | Same — after punch list, not in the driveway |
| Delay / ETA | Parts and status | Fixture PO, city shutoff | Gear lead time, inspection | Material drop, dumpster, adjuster |
What I change per trade (and what I refuse to change) #
Change: emergency vocabulary, skill tags, the status fields, and who is on-call after hours.
Refuse to change: five agents, n8n as the wiring, read-then-approve on customer-facing sends, no live dispatch writes on day one, no price tool, no review gating.
Electrical adds permit and inspection as first-class status. Roofing adds insurance. Plumbing adds municipal constraints. Those are extra columns on the status agent, not a sixth philosophy.
What does not transfer #
- HVAC seasonal no-cool volume is not a roofer's hail week. Storm weeks need a human overflow queue, not a braver agent.
- Gas-leak and sparking-panel rules are life-safety. The agent escalates. It does not "handle" them.
- Flat-rate vs T&M pricing cultures change the estimate template. They do not change the follow-up cadence.
If you want the local-visibility side of a trades shop — showing up when someone asks an engine for a plumber in your city — that is not this stack. That is local AI recommendations. This post stays on the trucks and the phone.
How do I wire the stack in n8n without giving the agent the shop? #
I wire each agent as its own n8n workflow: one trigger, one model call with a locked prompt, one approval pause on anything customer-facing or board-changing, and credentials that can read the job system without write keys until the miss log is boring. The model never holds the shop. The workflow does.
n8n is the layer I name because I can see the graph, attach an error workflow, and cut a credential without a vendor lock-in speech. n8n's docs describe that mix of AI features and process automation. The 15 best practices for deploying AI agents in production (n8n Blog, 2026) call out queue mode, human-in-the-loop, version control, and monitoring. I do not need you to run Kubernetes on day one. I need you to have a kill switch and a miss log.
MCP is optional. The Model Context Protocol spec dated 2026-07-28 is the current protocol revision for exposing tools to a model over JSON-RPC. I use it when a shop wants one tool server in front of the field-service API instead of five brittle HTTP nodes. I do not start there. I start with n8n talking to the APIs the shop already pays for. If you want the owner-facing MCP explainer, it is MCP explained. If you need the CRM/email/site wiring in under an hour as a pattern, use how to connect n8n to your CRM, email, and website.
Shape of a missed-call workflow (n8n, not a tutorial) #
You do not paste this and go live. You use it as the skeleton: trigger, read calendar, draft, gate, send, log.
{
"name": "hvac-missed-call-followup",
"nodes": [
{
"name": "Missed Call Webhook",
"type": "n8n-nodes-base.webhook",
"notes": "Carrier or PBX missed-call event. Require a shared secret. No write creds here."
},
{
"name": "Read Open Slots",
"type": "n8n-nodes-base.httpRequest",
"notes": "READ-ONLY calendar or field-service API. Two next windows in service area."
},
{
"name": "Draft SMS",
"type": "@n8n/n8n-nodes-langchain.agent",
"notes": "Locked prompt. Temperature low. Model: Claude Sonnet 5 or GPT-5.5. No price tool attached."
},
{
"name": "Policy Gate",
"type": "n8n-nodes-base.if",
"notes": "Block send if draft contains a dollar amount, a diagnosis, or a slot not in the read payload."
},
{
"name": "Wait for Approve",
"type": "n8n-nodes-base.wait",
"notes": "Week 1-2: Slack approve. After a clean streak, skip wait for the locked template only."
},
{
"name": "Send SMS",
"type": "n8n-nodes-base.httpRequest",
"notes": "SMS provider. Log message id + job id. Honor STOP."
}
],
"settings": {
"timezone": "America/New_York",
"errorWorkflow": "hvac-agent-page-owner"
}
}Wire errorWorkflow to page a human. Silent failure is how a shop decides "AI doesn't work" when the webhook expired.
Models I actually point at in August 2026 #
I route routine classification and SMS drafts to a workhorse and save the expensive model for ugly threads.
| Job | Model I use first | Dated source | Why |
|---|---|---|---|
| SMS draft, slot pick, review ask | Claude Sonnet 5 | Anthropic, Introducing Claude Sonnet 5 (June 30, 2026) | Tool use and agent work at workhorse price |
| Ugly estimate thread, conflicted dispatch draft | Claude Opus 4.8 | Anthropic, Introducing Claude Opus 4.8 (May 28, 2026) | Harder judgment, still behind a human publish |
| Alternate workhorse | GPT-5.5 | OpenAI, Introducing GPT-5.5 (April 23, 2026) | Flagship for tool-heavy professional work |
I do not need you to pick a religion. I need one model ID in the node, a locked prompt, and a gate that blocks dollar signs the calendar did not emit.
Credentials I will not attach on day one #
- Write access to the field-service dispatch board
- Payment or refund tools
- A "set price" or "apply discount" tool
- The Google review form as a kiosk session
- Anything that can text a customer a diagnosis
Read-only calendar and job status. Draft. Approve. Then a narrow auto-send. That is the shop-safe order.
How do I know the stack is working in the first 30 days? #
The stack is working when missed-call time-to-first-text drops, stalled estimates get a logged touch, and the miss log is shorter than last week — not when a vendor slide shows a made-up ROI. I measure operations. I do not invent a payback period for a shop I have not seen.
| Metric | How to count it | Green after 30 days | Kill or rewind |
|---|---|---|---|
| Time-to-first-text on missed calls | Webhook timestamp → SMS sent | Median in minutes, not hours | Hours-long delays or silent drops |
| Slot honesty | Offered window vs calendar at send time | Zero phantom slots | Any booked slot that was never open |
| Estimate touches | % of sent estimates with day-1 and day-3 logged | Most open quotes touched | Sequence still running after a "no" |
| Review asks | Asks sent / closed paid jobs | Near 1:1 on qualifying jobs | Asks only on 5-star private scores |
| Status accuracy | Customer complaint "you said Tuesday" vs PO field | Zero invented ETAs | Any ETA not in the source field |
| Miss log | Wrong slot, wrong tone, wrong job | Fewer this week than last | Same miss repeating |
Hours saved belong on the scoreboard only if you timed the old process. "We used to spend Thursday afternoon chasing quotes" is a valid before. "$47,000 ROI" is not a number I will write for a generic HVAC owner.
The parent post has the generic measurement frame — hours, dollars at risk, cost of inaction — in how you measure what an operations agent is saving you. This scoreboard is the trades version.
Expand vs kill #
Expand when the miss log is dull and a dispatcher says the drafts match what they would have sent.
Kill when the agent invents a price, a part, or a window. That is not a prompt tweak. That is a tool you should not have attached.
Do not expand into live dispatch writes because the SMS agent had a good month. Those are different blast radii.
If you want help mapping the five jobs onto your actual board and phone vendor, book an AI automation strategy call. Bring last week's missed-call count, the estimate pipeline, and the name of the system that already holds the jobs. I will tell you which agent is first and which credential stays off.
Frequently Asked Questions #
Do I need ServiceTitan before I can run this stack? #
No. You need a job record with fields the workflow can read — tech, window, status, phone — not a specific enterprise logo. ServiceTitan, Housecall Pro, Jobber, and a disciplined Airtable all work if the fields exist and the API or export is honest. If your "system" is a whiteboard, start with missed-call SMS and a calendar, then put the board in software before you touch dispatch.
Can the same agents run if I only have Housecall Pro or a spreadsheet? #
Yes for missed-call, estimate follow-up, and review ask. Dispatch and parts/status get sloppy on a spreadsheet because two people will edit the same row. Housecall Pro (or any field-service app with slots and job status) is enough to start. A spreadsheet is a temporary source of truth, not a place I attach write credentials.
Will an HVAC agent replace my dispatcher? #
No. The dispatch agent drafts the board. A named dispatcher publishes it and owns the conflicts. I have not seen a shop where "fire the dispatcher" was the honest first outcome. The honest first outcome is fewer 6 a.m. scrambles and fewer "I thought you had that job" texts. Staff still run the exceptions.
What model should I use for trades agents in August 2026? #
Start with Claude Sonnet 5 for drafts and classification; escalate ugly threads to Claude Opus 4.8; GPT-5.5 is a valid alternate workhorse. Those names are current as of this post: Sonnet 5 on June 30, 2026, Opus 4.8 on May 28, 2026, GPT-5.5 on April 23, 2026. The gate and the prompt matter more than the logo on the node.
How fast should a missed-call text go out? #
Minutes, not hours — I aim under five minutes, and I treat under 60 seconds as the target when the webhook is clean. The HBR March 2011 lead-response audit is the dated warning against 42-hour averages, even though it measured web leads, not HVAC voicemail. A no-cool caller does not wait for your morning huddle.
Can the agent send the review ask to every customer? #
It should send the same honest-feedback ask to every customer who had a real, completed, paid visit — not only the ones you expect to be happy. Google's prohibited content rules bar selectively soliciting positive reviews, incentives, and on-premises pressure. Skipping the unhappy jobs is the policy problem. Replying like an adult to a rough public review is the human job.
What happens when the agent books the wrong tech? #
A human unbooks it, the miss goes in the log, and I take write access off dispatch until the draft streak is clean again. Wrong truck is a process bug, not "AI being creative." If the agent assigned a live job, that is on the credential you attached too early. Draft-only until the dispatcher is bored.
Does this stack work for a one-truck shop? #
Yes, and it is often easier: one calendar, one skill set, less conflict logic. The missed-call and estimate-follow-up agents still pay because you are the tech and the office. Dispatch is just "do I have a gap." Do not skip the review-ask compliance rules because you are small. Google's policy does not have a headcount exception.
How is this different from a generic operations-agent post? #
The generic ops post owns analysis, approval, and measurement. This post owns the five HVAC/trades jobs and the transfer map. If you only read AI agents for operations, you know how to keep a human on the button. You do not yet have a dispatch / missed-call / estimate / review / parts stack. That is the split I am paid to keep clean.
Do I need MCP, or is n8n enough? #
n8n is enough to ship the five agents. MCP is the later tool-server layer if you want one protocol in front of the field-service API. The current MCP spec is 2026-07-28. I do not block a trades shop on protocol fashion. I block them on missing fields and write keys they should not have yet.
Can the agent quote a price on a missed-call text? #
No. A missed-call text can offer two slots and a callback. It cannot quote. Price lives on an estimate the tech or the office already produced. A model guessing a range from "AC not cooling" is how you eat a callback and a bad review. If they ask "how much?" the agent books a callback or a diagnostic window.
What should I measure in the first 30 days? #
Time-to-first-text, phantom slots, estimate touches, review-ask coverage, invented ETAs, and the miss log. If those move the right way, expand one lane. If any customer-facing lie appears, cut the send. I will not give you a dollar ROI for a shop I have not timed. I will give you a scoreboard you can fill on Monday.
Related Posts

What an Agentic OS Means for Running Your Business Day to Day
An agentic OS is the standing layer that runs your inbox, calendar, CRM, and approvals every day — not a chatbot, not a search agent, and not a bake-off.

No-Code AI Agents: Drag, Click, Add the Variables, Run Until It Works
You build a no-code AI agent by dragging nodes, mapping variables, and hitting run until the output matches the job — n8n, Make, Zapier, Flowise-class.

The AI Already Inside Your Tools (And Why Most Owners Never Turn It On)
Most owners already pay for AI inside Notion, Airtable, HubSpot, Slack, Shopify, and Workspace — and still buy a new agent instead of turning it on first.

