Speed to Lead for Home Service Businesses: Answer Every Request in Seconds
Short answer: answer every estimate request with a text in seconds, from a dedicated iMessage number, while the homeowner still has your site open. With ZeroSettle, a form submission (through Zapier or your own code) calls POST /api/imessage/agent/start and the hosted AI agent opens the conversation, asks your qualifying questions, shares your booking link and sends anything that needs judgment to a person; homeowners who text you first get the same instant answer, day or night. Text only people who agreed to it on the form, keep links out of the first text, and pick a plan whose new-contact limit fits your lead volume.
Key takeaways
- Why it matters: homeowners often ask several companies at once, and the first useful reply has the best shot at setting up the visit.
- Two ways in: the homeowner texts your number first (no limit, links work at once), or your number texts a form lead first (counts as a new contact, at most 2 messages before they reply).
- Wiring: form → Zapier or your webhook →
POST /api/imessage/agent/startfor the hosted agent, orPOST /api/imessage/sendfor your own opener. - Qualify by text: zip code, scope, timeline, then photos once they've replied. Hand anything urgent, angry or ready to book to a person.
- Plans: Pro is $49/month for one number with 5 new contacts a day; Growth is $199/month per number with 50 a day (or $599/month for 3 numbers from a Growth link); Enterprise is custom pricing through sales.
Why does the first reply win so many home service jobs?
The first reply wins because a homeowner with a leaking water heater, a peeling deck or a move-out clean rarely waits for one company. They fill in two or three forms, or a lead marketplace passes the same request to several pros, and they tend to book whoever makes the next step easy first. By the time a slower company calls back, the homeowner has already sent photos to someone else and has a walkthrough on the calendar.
Speed alone isn't the whole story. The reply has to be useful: it should say who you are, show that you read the request, and ask the one question that moves the job forward. A text does that better than a voicemail: the homeowner answers when it suits them, and the thread keeps their address, photos and your quote in one place.
This guide covers the whole loop for painters, HVAC, plumbing, electrical, roofing, cleaning and landscaping companies: getting the lead into a text thread in seconds, asking the right questions, and handing the job to a person at the right moment. For the bigger picture, see how to grow a home service business with iMessage.
What does speed to lead look like on iMessage?
Speed to lead on iMessage comes in two shapes, and the rules differ between them: the homeowner texts your number first, or your number texts a lead who filled in a form.
| Homeowner texts first | Your number texts a form lead | |
|---|---|---|
| Where it starts | A “Text us” button, yard sign QR code, truck wrap, Google profile | Website form, lead ad form, quote calculator |
| Counts toward new contacts | Never | Yes (5 a day on Pro, 50 a day on Growth, per number) |
| Messages before they reply | No limit; they already wrote | At most 2 (messages within 5 minutes of the first count as one) |
| Links | Tappable right away | Plain, untappable text until they reply |
| Photos and polls from you | Allowed | Only after they reply |
Every number allows 10,000 messages a day, sent and received, with known contacts (people who texted it first or that it already has a conversation with).
The simplest speed-to-lead win is to make texting first the easy option. Put a pre-filled sms: link (“Text us for a quote”) next to your form and on the form's thank-you page, so a homeowner who wants an answer now can get one, and the conversation never touches your daily limit. How to get customers to text you first covers the link format and QR codes. iMessage reaches only Apple devices, so keep your office phone number and email on the page too, for homeowners who don't use iMessage.
What consent do you need before texting a lead?
You need the homeowner's agreement to be texted by you about their request, given when they handed you their number. ZeroSettle's docs put it simply: the person gave you their number “for this purpose”, and “if you are unsure whether you have consent, you don't.”
In practice, add a short line and an unchecked checkbox next to the phone field on your estimate form. An illustrative example:
☐ Text me about this request. By checking this box, I agree that Summit Roof & Gutter may text me at the number above about my estimate, including automated texts. Message frequency varies. Reply STOP to opt out. Agreeing is not a condition of purchase.
Store the submission with the time and the wording they saw. A few sources and how to treat them:
- Your own website form: text the lead if they checked the box. If they didn't, call or email instead.
- Facebook and Instagram lead ads: add the same consent language to the form's custom disclaimer. Texting lead ad leads on iMessage walks through it.
- Lead marketplaces and directories: the homeowner gave their number to that platform, not to you. Whether that covers a text from your number depends on the platform's terms and its request form. When it isn't clear, reply inside the platform and invite them to text your number.
- Past customers: only those who agreed to hear from you by text.
In the U.S., federal rules (47 CFR 64.1200) generally require prior express written consent for advertising or telemarketing texts covered by the autodialer rules, and state laws can add their own.
Never text purchased lists, scraped numbers, door-knocking sheets or anyone who didn't ask. Besides the legal exposure, unsolicited texts are what get a number filtered by Apple, and ZeroSettle suspends lines used for unsolicited messaging. Every number honors STOP automatically across your whole account. The TCPA consent guide goes deeper on U.S. rules. This is not legal advice.
How do you wire a web form to an instant text?
Send each new form submission to ZeroSettle within seconds, by one of three routes: a Zapier zap, a GoHighLevel workflow, or a few lines in your own form handler.
| Route | How it works | Who answers replies |
|---|---|---|
| Zapier, Send iMessage | Trigger: your form tool's new submission. Action: ZeroSettle's Send iMessage with your opener, using the lead's first name and the service they picked | You in the console (on a number Managed by API), or the hosted agent, which reads your text as its own and answers what they reply |
| Zapier, webhook step | A webhook POST to /api/imessage/agent/start with your API key as a bearer token | The hosted agent |
| GoHighLevel | Install the iMessage (ZeroSettle) app and make it the sub-account's SMS provider; a workflow's Send SMS action then sends from your number | You, from the GoHighLevel inbox (the number must be Managed by API) |
| Your own code | Your form handler calls POST /api/imessage/agent/start or POST /api/imessage/send | The hosted agent, or your code behind a signed webhook |
The Zapier app lives under Settings → CRM → Zapier in the console. GoHighLevel sends follow the same rules as POST /api/imessage/send, and a number the hosted agent manages sends only through the agent, so GoHighLevel sends from it are refused. Pick one owner for each number: the hosted agent, or GoHighLevel and your team. See GoHighLevel + iMessage and iMessage automations with Zapier, n8n or Make.
With the hosted agent on, starting the conversation is one request. name is optional; the agent knows it for the whole conversation, though it isn't inserted into your first_message:
curl -X POST https://portal.zerosettle.io/api/imessage/agent/start \
-H "Authorization: Bearer $ZEROSETTLE_TOKEN" -H "Content-Type: application/json" \
-d '{"to": "+15125550123", "name": "Dana"}'
A form handler in TypeScript that checks consent, starts the conversation and keeps leads it can't text yet:
// Called by your form tool's webhook on each new estimate request.
const BASE = "https://portal.zerosettle.io";
type Lead = { name: string; phone: string; textConsent: boolean };
export async function onEstimateRequest(lead: Lead) {
if (!lead.textConsent) return { action: "call_or_email" }; // no checkbox, no text
const res = await fetch(`${BASE}/api/imessage/agent/start`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.ZEROSETTLE_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ to: lead.phone, name: lead.name.split(" ")[0] }),
});
if (res.ok) return { action: "texted" };
const { error } = await res.json();
switch (error?.code) {
case "new_contact_limit": // over today's or this 15 minutes' new contacts
return { action: "retry", afterSeconds: error.retry_after_s };
case "recipient_opted_out": // they texted STOP before: never retry
return { action: "do_not_text" };
case "ai_credits_exhausted": // buy credits at error.buy_url
case "not_managed": // the number is Managed by API
default:
return { action: "alert_owner", message: error?.message };
}
}
Your code keeps the retry queue; ZeroSettle doesn't schedule sends for you. If you'd rather write an opener that names the job (“your water heater request”), send it yourself with POST /api/imessage/send and {"to", "text"}. On a number the hosted agent manages, your send still works and the agent treats it as its own, answering whatever the homeowner replies. On a number Managed by API, every reply reaches your signed webhook instead.
What should the first text say?
The first text should say who you are, mention their request, and end on a question they can answer in a few words. It should not contain a link.
An iPhone shows a link from an unknown sender as plain text that can't be tapped, until the person replies or saves your number. Your send still goes out, and the response carries a link_not_tappable warning. So ask first and send the booking link after they answer; why first-message links aren't tappable explains it in full. Photos of your past work wait too: until a contact replies, the number can send them only text.
Openers that work across trades (illustrative):
- Painting: “Hi, this is Ridgeline Painting. Thanks for your estimate request. Is it interior, exterior or both?”
- HVAC: “Hi, Northgate Heating & Air here about your service request. Is the system running at all right now?”
- Plumbing: “Hi, this is Clearwater Plumbing. Got your request. Is any water leaking right now?”
- Cleaning: “Hi, Tidy Nest Cleaning here. Thanks for asking about a cleaning. Is this a one-time clean or a regular one?”
With the hosted agent, this is the first_message setting: 1 to 3 texts sent exactly as written, the instant a conversation starts. It is also the agent's first answer to anyone who texts the number first, so write it to fit both. Or turn first_message_enabled off and the agent writes its own opener from your business context. Keep the opener to one or two texts sent together. Your number gets two messages before the lead's first reply (texts within 5 minutes of the first count as one), so the opener uses one and a single follow-up uses the other.
Which questions qualify a home service lead?
Four things qualify most home service jobs: what the job is, where it is, when they want it, and what it looks like. Ask one or two at a time, so each text is easy to answer: the opener asks about the job, the zip code comes next, and photos come last.
| Trade | Scope question | Timing question | Photo to ask for |
|---|---|---|---|
| Painting | Which rooms or surfaces, interior or exterior? | Is there a date it has to be done by? | A wide shot of each room from the doorway |
| HVAC | Repair, tune-up or replacement? Heat or cooling? | Is the house too hot or cold right now? | The unit's data plate |
| Plumbing | What's the problem, and which fixture? | Is it leaking now? | The fixture and anything under it |
| Roofing | Leak, storm damage or a full replacement? | Is water coming inside? | The ceiling stain, and the roof from the street |
| Cleaning | Bedrooms, bathrooms, one-time or recurring? | Which day works? | Usually none needed |
| Landscaping | Mowing, cleanup or a design project? | One-time or for the season? | The yard from the back door |
Ask for the zip code (or street address) early in every trade: it settles whether you serve the area before anyone spends time on details.
Ask for photos once they've replied. The homeowner can send pictures any time, and they arrive in your inbox, on your webhook and in a connected CRM, but asking in the opener makes the first text longer and harder to answer. For small jobs, photos often get you to a ballpark without a drive; text-a-photo quotes for the trades shows that workflow. For the qualifying conversation itself, qualify leads with an AI agent over iMessage goes further.
- Tue 7:52 PM
- Business: Hi, this is Summit Roof & Gutter. Thanks for your request on our site.
- Business: Is this for a leak, storm damage, or a full replacement?
- Homeowner: leak. stain on the bedroom ceiling after the rain sunday
- Business: Sorry to hear it. What's the zip code, and is water dripping inside right now?
- Homeowner: 78731. not dripping, just the stain
- Business: Good, we cover 78731. If you can, text a photo of the stain and one of the roof from the street. It helps the inspector bring the right materials.
- Homeowner: Photo: the ceiling stain👍
- Business: Thanks. Inspections are free and take about 45 minutes. Pick a time here: https://summitroof.example/inspect
- Homeowner: booked thursday 9am
first_message with no link and asked for photos only after the homeowner replied. The booking link comes after her reply, so it is tappable.With the hosted agent, these questions go in the business context, the brief it answers from. It never invents facts the context doesn't give. An excerpt:
You are Summit Roof & Gutter's assistant, texting homeowners who asked
for a roof inspection or repair. Get them a free inspection booked.
Service area: zip codes 78701-78759. Outside it, say so kindly.
Your opener asks: leak, storm damage or replacement. Then ask, one or
two at a time: zip code; is water coming inside now; then a photo.
Inspections: free, about 45 minutes, Mon-Sat. Book at the link.
Prices: never quote a price. The inspection sets it.
Urgent: water coming inside now, or a tree on the roof: tell them to
call (512) 555-0177 right away, any hour.
Hand off: insurance claims, complaints and jobs in progress go to Alex
at (512) 555-0177.
Never: promise a date, discuss other roofers, or guess.
Set the goal to Demos booked with your scheduling page as the link (of the three goals, it is the closest to booking an inspection or walkthrough), the personality to Friend or Professional, and the response time to Instant. AI agent in the console has every setting step by step.
How do you answer leads after hours?
Let the hosted agent answer every homeowner who texts your number, at any hour, and hold your own outreach to form leads to daytime. Requests don't arrive on your schedule: evenings and weekends, when the owner is on a job or with family, are exactly when a slow reply loses the job.
- They texted first: answer right away, whatever the time. They started the conversation. With
response_timeset toinstant, the agent's typing bubble shows up and the answer follows. - Form leads late at night: ZeroSettle's consent guidance says not to send anything promotional before 8 AM or after 9 PM in the recipient's time zone. The cautious choice is to hold a late form lead's opener until 8 AM (in your code, or with a Zapier delay step) and offer the “Text us now” button on the thank-you page for anyone who wants an answer tonight.
- Emergencies: a burst pipe or no heat in January shouldn't wait for a booking link. Put your emergency line in the business context with a clear rule for when to give it out.
- Follow-ups: the agent's triggers fire in a morning (9–11 AM), afternoon (1–3 PM) or evening (6–8 PM) window in your
timezone, so they land in reasonable hours. The default is one follow-up the morning after a lead goes quiet.
Each text the hosted agent sends uses one credit. As an illustration, a two-text opener, four answers of about two texts and one follow-up use 11 credits, so Pro's 500 free credits cover roughly 45 conversations like that. Free credits come once and never refill; packs are 1,000 for $50 or 5,000 for $200 and never expire. AI receptionist on iMessage covers after-hours answering in more depth.
When should the owner take over?
The owner should take over when the job needs judgment: a price, an insurance claim, a complaint, an unusual job, or a lead who asks for a person. Write those cases into the business context as hand-off rules, with the name and number to give out.
There are three ways to run the hand-off, depending on how hands-on you want to be:
- Agent qualifies, you close. The agent asks the questions and shares your booking link; you see every conversation in the console inbox, and
GET /api/imessage/agent/startedlists the leads it opened with whether each onereplied. When you want to reply yourself, switch the line group to Managed by API in the Messaging tab. That switch covers every conversation on the group, not just one. - Instant opener, personal replies. Set
response_timetodont_reply(Don't Reply in the console). The agent still sends the opener the instant a lead arrives and its follow-up triggers still fire, but it never answers; you reply yourself. - Your own system. Keep the number Managed by API. Every reply reaches your webhook, so your code can post hot leads to your crew's channel or your CRM and you answer from the console. Close, HubSpot and GoHighLevel log every 1:1 text on the lead or contact, and Zapier can start a Zap on each message; see CRM integrations.
Once a job is booked, a group chat with the homeowner, your project manager and the crew lead can carry it from there. One iMessage group per job shows how; every member must have agreed to hear from you, and each one your number has never messaged counts as a new contact.
How many new leads can one number text a day?
On Pro, one number can start 5 new conversations a day; on Growth, 50 a day per number, at most 3 per 15 minutes. Only conversations your number starts count. Homeowners who text you first never do, and neither do ongoing conversations.
| Plan | Price | Form leads you can text first, per number per day | Free credits (once) |
|---|---|---|---|
| Pro | $49/month, one dedicated number | 5 | 500 |
| 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 | 50 (3 per 15 min) | 1,000 |
| Enterprise | Custom pricing through sales, for high volume and compliance needs | Set with sales | Set with sales |
The day resets at 3 AM Eastern. Over a limit, a send is refused with 429 new_contact_limit and retry_after_s. Pro and Growth come with a 30-day money-back guarantee on the subscription.
As an illustration, a painter with three form leads a day fits Pro; a roofer whose storm-season ads bring in twenty needs Growth, and when a burst goes past 3 in 15 minutes, the extra leads wait for retry_after_s in your queue. Either way, the “Text us” button takes pressure off the limit, since those homeowners start the conversation. To talk volume or compliance, book a demo. Plan details are on ZeroSettle pricing.
The same rules protect your number. At most 2 messages go to a lead who hasn't replied; a third is refused with 403 awaiting_reply. Repeated texts to people who never answer are the fastest way to get a number flagged, and then every send fails. Lead nurture without getting your number flagged covers follow-up pacing.
What should you check before going live?
Test the full loop from your own iPhone before real homeowners hit it:
- Submit your own form with the consent box checked. The opener should arrive within seconds and contain no link.
- Submit it with the box unchecked. Nothing should be sent.
- Text the number yourself, as a homeowner would. The first answer should make sense after any request, since
first_messageis also its first answer to inbound texts. - Ask about a zip code you don't serve, a price, and an emergency. Each should get the answer your business context sets, not a guess.
- Reply STOP. The next send to you should be refused with
403 recipient_opted_out. Text START to opt back in. - Replace the example business context. Until you do, the agent talks about a made-up software business.
- Decide who watches the inbox, and how fast a person picks up a hand-off.
iMessage reaches Apple devices. SMS fallback is a limited pilot that ZeroSettle must enable for an account, so keep calling or emailing leads who aren't on iMessage; GET /api/imessage/availability checks a number's iMessage registration without sending. For the full playbook across sources, see iMessage for lead generation, and for trade-specific setups, iMessage for painting contractors and an AI booking agent for HVAC, plumbing and electrical. To start, get your iMessage number.
Frequently asked questions
Can I text a lead who filled out my website form?
Yes, if the form told them you would text them about their request and they agreed, for example with a checkbox next to the phone field. Keep a record of the submission. Without that, reply by email or phone, or show a Text us button on the thank-you page so they can text you first. This is not legal advice.
What if more leads come in than my plan allows?
Only conversations your number starts count. Pro allows 5 new contacts a day per number; Growth allows 50 a day per number, at most 3 per 15 minutes. Past the limit a send is refused with 429 new_contact_limit and retry_after_s, so queue the lead and try again then. Homeowners who text you first never count.
Do I need a developer to set this up?
No. The hosted AI agent answers from a business context you write in the console, Zapier's ZeroSettle app can send the first text when a form is submitted, and GoHighLevel can send from a number Managed by API once iMessage (ZeroSettle) is the sub-account's SMS provider. Code is only needed if you want your own form handler.
Will homeowners on Android get the text?
iMessage reaches Apple devices. SMS fallback is a limited pilot that ZeroSettle must enable for an account, so plan for another way to reach everyone else, such as a phone call or email, and check numbers without sending using GET /api/imessage/availability.
Can I take over a conversation from the AI agent?
Yes. Switch the line group to Managed by API in the console's Messaging tab and reply yourself; the switch covers every conversation on that group. If you want to answer every lead personally, set the agent's response time to Don't Reply: it sends the instant opener and follow-ups, and you write the replies.
Sources
- ZeroSettle iMessage API docs: “Your iMessage number” (Pricing), “Send a message” (Links in a first message, SMS fallback), “AI agent” (Managed by AI Agent, Triggers, Credits), “AI agent in the console”, “Webhooks, step by step”, “Errors, limits, and compliance” and “CRM integrations” (GoHighLevel and LeadConnector, Zapier). Checked November 2, 2026.
- 47 CFR 64.1200, Delivery restrictions, Electronic Code of Federal Regulations. Checked November 2, 2026.
- ZeroSettle iMessage API Terms of Service.