An AI Booking Agent for HVAC, Plumbing and Electrical Companies
An AI booking agent for a trades company answers every text to your business number at any hour: it sorts emergencies from routine work and sends emergencies to your phone line, collects the address, the problem and photos, then books the job with your online booking link or through an MCP server connected to your scheduling system. On ZeroSettle this is the hosted AI agent on a dedicated iMessage number, set up from a business context you write, with no server to run. It quotes only the fees you give it and never promises an arrival time.
Key takeaways
- Triage first: the agent tells anyone with a gas smell, sparking panel, active leak or no heat in freezing weather to call your emergency line. It never books those by text.
- Intake second: address, problem, equipment, photos and access notes, one or two questions at a time, so dispatch reads a complete request in the morning.
- Booking: a booking link works on day one. An MCP server lets it check open slots; tools that create or cancel bookings start off until you turn them on.
- Never promise: repair prices it wasn't given, arrival times, diagnoses or warranty coverage.
- Cost: one credit per text the agent sends. Pro is $49/month for one number with 500 free credits once; Growth is $199/month per number with 1,000 free credits once; Enterprise is custom pricing through sales.
What does an AI booking agent do for a trades company?
It does the first five minutes of every service call by text, at any hour: works out whether it is an emergency, gathers what your dispatcher needs, and gets routine work onto the schedule. Your office still owns the schedule, the pricing and the people; the agent makes sure no request sits unanswered at 9:40 PM until someone opens the inbox at 7:30 the next morning.
On ZeroSettle you get a dedicated iMessage number, running on Apple hardware we operate for you in a server facility. Put it on your trucks, website, invoices and Google profile as the number to text. Then switch it to Managed by AI Agent in the console's Messaging tab (or managed_by: "zerosettle" with PUT /api/imessage/agent), and ZeroSettle's hosted agent answers every inbound text from a business context you write. The console walkthrough covers the switch step by step, and how the hosted agent works explains its behavior in depth.
Customers who text your number first never count against your new-contact limit; they share the number's 10,000 messages a day with known contacts. In the trades, most conversations start with the customer: a leak, a dead furnace, a breaker that won't stay on.
How should the agent separate emergencies from routine calls?
By a written list of emergency signs in its business context, and one fixed instruction: send those customers to your emergency phone line right away, before asking anything else. The agent texts; it does not call, dispatch or judge danger, so it should not try to work an emergency by text.
| Trade | Treat as an emergency: tell them to call | Routine: collect details and book |
|---|---|---|
| HVAC | No heat in freezing weather, a gas smell, a carbon monoxide alarm sounding, no cooling in extreme heat with someone vulnerable in the home | Weak airflow, short cycling, noises, tune-ups, thermostat questions, quotes for replacement |
| Plumbing | Water actively leaking or flooding, sewage backing up, no water at all, a gas smell near the water heater | Slow drains, running toilets, a dripping faucet, water heater flushes, fixture installs |
| Electrical | Sparking, burning smell from an outlet or panel, a breaker that trips the moment it is reset, any exposed or damaged wiring | Dead outlets, flickering lights, new circuits, EV charger and panel upgrade quotes |
The point of the list is consistency, not diagnosis. When in doubt, the instruction should lean toward "call us".
Word the emergency reply yourself and put it in the context exactly as you want it sent. For a gas smell, use the safety wording your gas utility publishes, not something the agent composes. Then tell the agent to stop asking intake questions until the customer says they have called.
What should it collect before a job is booked?
Everything your dispatcher would otherwise call back to ask: where, what, which equipment, a photo, and when someone can let the tech in. Ask for it one or two questions at a time; a single text with eight questions reads like a form and gets half answered.
- Service address with ZIP. Also confirms you serve that area.
- What is happening and since when. Error codes on a thermostat or furnace board help.
- Equipment. Furnace, heat pump, boiler, tankless or tank water heater, panel brand, rough age if they know it.
- A photo. The data plate, the leak, the breaker panel. Photos customers send are stored in the conversation with the file, where your team sees them in the console inbox (if you later switch to your own code, your webhook receives them too). Don't tell the agent to diagnose from a photo; tell it to say the tech will look.
- Access. Who will be home, pets, gate codes, where the unit is (attic, crawlspace, closet).
- Preferred days and times. Ask for windows, then hand off to the booking link or your scheduling tools.
Text-a-photo quotes for the trades shows how to use those photos when pricing work.
- Tue 9:41 PM
- Customer: hi our upstairs AC is blowing warm air
- Customer: can someone come look at it
- Business: Sorry about that, warm air on a hot night is no fun. We can help. What's the address, and when did it start?
- Customer: 14 Alder Ct 62704, started this afternoon
- Business: Thanks. Is anyone home who can't handle the heat, like a baby or an older relative? And is the outdoor unit running at all?
- Customer: no just us two. outside fan is not spinning
- Business: Got it. If it's easy, a photo of the label on the indoor unit helps the tech bring the right parts.
- Customer: 📷 Photo
- Customer: can you come tonight and how much to fix
- Business: Thanks, dispatch will see the photo with your request. The service call is $89, credited toward the repair if you go ahead.
- Business: I can't promise a time tonight or price the repair: the tech gives you an exact price on site before any work starts. Every open slot is here: northgate.example/book
- Customer: ok booked tomorrow 8-10
What goes in the business context?
Everything the agent is allowed to know and say: your service area, hours, emergency line, triage rules, intake questions, the fees you publish, policies, and a list of things it must never say. The agent knows only what you write there (up to 40,000 characters) plus files you connect, and it never invents facts the context doesn't give.
You are the texting assistant for Northgate Heating, Plumbing & Electric.
You answer people who text our number about heating, cooling, plumbing
and electrical work. Sort emergencies from routine work, collect what
dispatch needs, and get routine jobs booked. If anyone sincerely asks,
say you are Northgate's automated assistant.
EMERGENCIES (never book these by text). Signs: gas smell, carbon monoxide
alarm, sparking or burning smell from an outlet or panel, water actively
leaking or flooding, sewage backing up, no water at all, no heat below
freezing, no cooling in a heat wave with a baby, an older person or
anyone medically fragile at home (ask about this on every no-cooling
request). Reply first with exactly: "That needs a person right now.
Please call our 24/7 line, (217) 555-0142." Ask nothing else until they
say they have called.
ROUTINE WORK. Ask one or two at a time: service address with ZIP; what is
happening and since when; equipment and rough age; a photo if easy; who
will be home, pets, gate codes; preferred days. Then send the booking
link: https://northgate.example/book
PRICES YOU MAY QUOTE (only these):
Service call / diagnostic: $89, credited toward the repair if they go ahead.
Evenings after 6pm and weekends: $149 service call.
AC or furnace tune-up: $119. Water heater flush: $139.
Northgate Club plan: $15/month, two tune-ups a year, no service call fee.
Anything else: "The tech gives you an exact price on site before any
work starts."
NEVER: promise an arrival time or a same-day slot; guess what is wrong;
say a repair is covered by warranty; give DIY gas or electrical steps;
quote a price not listed above.
HOURS: office Mon-Fri 7am-6pm, Sat 8am-2pm. Emergency line 24/7.
SERVICE AREA: ZIPs 62701-62712 and Chatham. Outside it, say so kindly
and suggest they search for a local company.
A PERSON: office (217) 555-0100 during hours.
Long lists (every ZIP you serve, your full flat-rate menu for maintenance work, membership terms) can go in a connected file instead: PDF, Excel, CSV, Word or text, up to 10 MB each and at most 10, sharing a space limit of 20,000 (estimated the same way as the business context's tokens). A scanned PDF with no selectable text has nothing to read, so export the price sheet from your software instead. The agent reads every file before every answer. The AI agent docs list the limits.
How does the agent actually book the job?
Two ways: send your online booking link, or let it use the tools of an MCP server connected to your scheduling system. Start with the link; add MCP when you want the agent to see real availability.
Option 1: a booking link
Put the link in the business context with the instruction to send it once intake is done. The agent's goal setting accepts purchase, trial_start or demo_booked with a link, such as a calendar booking page; the default is purchase, so change it. For service bookings, either use demo_booked with your booking page or turn the goal off (goal_enabled: false) and describe booking in the context. Because the customer texted first, the link is tappable. Links only show as plain, untappable text to people who have never texted the number.
Option 2: an MCP server for your scheduling system
If your field service or scheduling software offers an MCP server, or your developer puts a small one in front of its API, connect it under Messaging → Connectors. ZeroSettle lists every tool the server offers and turns on only the ones that just read (readOnlyHint). Any tool that can change something starts off.
# connect the server: read-only tools come on, the rest stay off
curl -X POST https://portal.zerosettle.io/api/imessage/agent/mcp \
-H "Authorization: Bearer $ZEROSETTLE_TOKEN" -H "Content-Type: application/json" \
-d '{"url": "https://schedule.northgate.example/mcp", "token": "YOUR_SERVER_TOKEN"}'
# later, turn on one write tool you are comfortable with (id from the response)
curl -X PATCH https://portal.zerosettle.io/api/imessage/agent/mcp/mcp_9c1e… \
-H "Authorization: Bearer $ZEROSETTLE_TOKEN" -H "Content-Type: application/json" \
-d '{"enable_tools": ["request_appointment"]}'
Why write tools start off: as the docs put it, “anyone who texts your number can ask the agent to use it, so turn it on only if that's fine.” A prank texter, a confused customer or someone who isn't the account holder could fill your Thursday with fake jobs or cancel a real one. Decide tool by tool:
| Tool | Starts | Recommendation |
|---|---|---|
check_availability (read only) | On | Keep on. The agent can offer real windows instead of "pick a time on the page". |
check_service_area (read only) | On | Keep on, or put your ZIP list in a file. |
request_appointment (writes a pending request) | Off | Good first write tool: it holds a window that a dispatcher confirms, so a bad request costs a phone call, not a truck roll. |
book_appointment (confirmed booking) | Off | Turn on only if your schedule already takes unreviewed online bookings. |
cancel_appointment, reschedule | Off | Leave off. Send those to the office, which can confirm who is asking. |
At most 5 MCP servers per line group. The token is sent as Authorization: Bearer; OAuth sign-in isn't supported here. If the server can't be reached, the agent answers without its tools.
Design read tools to return as little as possible: open windows, yes or no on a ZIP. A tool that hands a customer's address and job history to anyone who texts is a privacy problem, whatever the agent is told.
What must the agent never promise?
Anything a technician has to stand in front of the equipment to know. Those promises turn into one-star reviews.
| Customer asks | Never | Instead |
|---|---|---|
| "How much to fix it?" | A repair or replacement price it wasn't given | The service call fee, and "the tech prices it on site before any work starts" |
| "When will he get here?" | An arrival time or "within the hour" | The booked window, and that you text when the tech is on the way |
| "Is it the capacitor?" | A diagnosis | "The tech will check it; the photo helps them bring parts" |
| "Is this under warranty?" | Coverage | "The office checks warranty with the install date" |
| "Can I reset the breaker myself?" | DIY gas or electrical steps | Your emergency line, or a booked visit |
Then test it. Text your number from your own phone with each of those questions and with each emergency sign, and fix the context until every answer is one you'd sign. The console guide suggests exactly this: ask something the context doesn't cover and check that it says so instead of guessing.
Which settings fit a trades company?
Instant replies, a professional or friendly voice, no fixed first message, and one follow-up rewritten for service calls.
| Setting | Suggested | Why |
|---|---|---|
response_time | instant (the default) | Someone with a leak is not waiting 5 to 10 minutes for "human-like" pacing. |
personality | professional or friend | Calm and plain; skip eager and zoomer. |
first_message_enabled | false | first_message is also sent, exactly as written, as the first answer to anyone who texts first. A canned greeting would ignore "water is pouring through my ceiling". Off, the agent writes its first reply from the context. |
triggers | The default follow-up, rewritten | Instruction: "If they described routine work but haven't booked, send one short note with the booking link. If the conversation was an emergency or they booked, send nothing." No daily triggers. |
timezone | Yours | The follow-up lands in your morning, not New York's. |
A once trigger never fires when the customer wrote last, and it resets with every message, so it goes once each time a conversation goes quiet.
Where do voice messages from your techs fit?
In recordings the agent sends for you, and in voice notes your team receives. First, an MCP tool can hand the agent a recording to send: a link to an audio file (m4a, mp3, wav and similar, up to 6 MB) on the same host as the MCP server, served publicly. Say in the business context when to send it, and the agent sends it as an iMessage voice message after its texts, one per answer, for one credit. Voice messages go only to people who have texted the number, which every inbound customer has. A 30-second note from your lead tech on "what to expect at your first tune-up" or "where your water shut-off usually is" sounds like your company, not a bot.
Second, voice messages sent to the number (by customers, or by techs who talk faster than they type) arrive in the conversation as recordings your team can play. With your own code, turning technicians' voice notes into job reports shows how to turn them into write-ups.
When should you connect your own code instead?
When booking needs your dispatch system's logic: matching skills to techs, zones, parts on the truck, membership priority, creating the job record. Then set the line group to managed_by: "api"; every inbound text, photo and voice message is POSTed to your signed webhook, and your code (and your own model, with your keys) decides what to reply with POST /api/imessage/send. Building iMessage agents walks through that loop in TypeScript, and the webhook guide covers signatures and retries. No developer? A Zapier Zap on New iMessage Received can create a lead in your field service tool (see CRM integrations).
There is a middle path: keep the hosted agent answering and let your dispatch system send the operational texts. POST /api/imessage/send still works on a line group the agent manages, and the agent reads those texts in the thread as its own and answers what customers reply. That is how appointment reminders and technician on-the-way texts with a photo fit alongside the booking agent: your system sends them, the agent fields "can he use the side gate?".
Two constraints to plan around. While the agent manages a line group, the console composer is off and sends from Close or HubSpot are refused with 403 managed_by_zerosettle. And switching to Managed by API hands back every conversation on that group, not one. For bigger jobs with several people, one iMessage group per job keeps homeowner, project manager and crew together. Every member must have agreed to hear from you, each member the number has never messaged counts as a new contact, and the agent answers in a group only when a message is meant for it (its follow-ups never fire into a group).
Inbound is easy; outbound needs consent
Answering people who text you needs nothing special. Having the agent text someone first (POST /api/imessage/agent/start, or Start a conversation in the console) is only for people who gave you their number for this, such as a web form asking for service. Never purchased lists or door-knock lists. The TCPA consent guide explains the rules; it is not legal advice. A number allows at most 2 messages to a contact before their first reply, and STOP is enforced on every number of the account.
What does it cost to run?
The subscription for the number, plus one credit for each text the agent sends. Credits pay only for the hosted agent's texts (and videos); a number your own code answers uses none for texts.
| Plan | Price | Free credits (once) | New contacts the number texts first |
|---|---|---|---|
| Pro | $49/month, one number | 500 | 5 a day |
| Growth | $199/month per number (upgrade in the console), or $599/month for 3 numbers plus $199 per extra from a Growth link; team members included | 1,000 | 50 a day per number, 3 per 15 minutes |
| Enterprise | Custom pricing through sales, for high volume and compliance needs | Set with sales; book a demo | |
Free credits come once per account and never refill. Packs: 1,000 for $50 or 5,000 for $200, and they never expire. The subscription has a 30-day money-back guarantee.
The booking conversation above is five agent texts, so five credits, plus one for any follow-up it sends. At zero credits the agent goes quiet until you buy a pack; texts still arrive in the inbox. Inbound booking requests never touch the new-contact limit; it only matters if the agent starts conversations with web-form leads. Speed to lead for home service businesses covers that side, and growing a home service business with iMessage puts it all together. When you're ready, get your number.
Frequently asked questions
Can the AI agent handle emergency calls?
No, and it shouldn't try. It texts; it doesn't call, dispatch or judge how dangerous something is. Write your emergency signs into the business context and tell the agent to send those customers straight to your emergency phone line, then stop asking questions.
Will the agent quote prices to customers?
Only the prices you write into its business context or a connected file, such as your service call fee, after-hours fee, tune-up price and maintenance plan. It never invents facts the context doesn't give, so leave repair and replacement prices out and tell it to say the technician prices the work on site.
Can it book straight into my scheduling software?
Yes, if your scheduling system has an MCP server, or you put a small one in front of it. Tools that only read, such as checking open slots, come on by default. Tools that change something, such as creating or cancelling a booking, stay off until you turn them on, because anyone who texts your number can ask the agent to use them. Without an MCP server, the agent sends your online booking link.
Can my dispatcher take over a conversation?
Not one conversation at a time. While the agent manages the number, the console composer is off, but your dispatch system can still send with the API (or the MCP send_imessage tool), and the agent treats those texts as its own and answers what the customer replies. To answer by hand, switch the line group to Managed by API, which hands every conversation on it back to your team.
What does it cost?
Pro is $49 a month for one number with 500 free credits once. Growth is $199 a month per number with 1,000 free credits once, or $599 a month for 3 numbers plus $199 per extra number from a Growth link. Enterprise is custom pricing through sales for high volume and compliance needs. Each text the agent sends uses one credit, free credits never refill, and packs of 1,000 for $50 or 5,000 for $200 never expire. The subscription has a 30-day money-back guarantee.
Does it reach customers with Android phones?
ZeroSettle numbers send iMessage, which reaches Apple devices. SMS fallback is a limited pilot that ZeroSettle must enable per account, so keep your regular phone line and booking page for everyone else.
Sources
- ZeroSettle iMessage API docs: “Your iMessage number” (Pricing), “Send a message” (Links in a first message, SMS fallback), “Attachments”, “AI agent” (Managed by AI Agent, Triggers, Connectors: files and MCP servers, Credits), “AI agent in the console”, “Errors, limits, and compliance” and “CRM integrations” (Zapier). Checked November 2, 2026.