iMessage for Lead Generation: The Complete Guide
iMessage belongs in lead generation after a person raises their hand: they filled in a form, submitted a lead-ad form with consent language, or texted you. Text them from a dedicated number within seconds, let an AI agent ask the qualifying questions and send a booking link once they reply, follow up no more than the rules allow, and log every message in your CRM. It does not belong in cold outreach: texting people who never answer is how a number gets flagged, and then every send fails, to everyone.
Key takeaways
- Who to text: only people who gave you their number for this purpose. Never purchased lists, scraped numbers or cold lists.
- Speed: start the conversation from your form handler with
POST /api/imessage/agent/start, so the first text goes out while the lead is still on your thank-you page. - Qualify and book: the hosted AI agent asks your questions from a business context you write and shares your booking link (goal
demo_booked) once the lead is interested. - Follow-ups: at most 2 messages before a lead's first reply. The default follow-up trigger fits inside that.
- Volume: Pro ($49/month) starts 5 new conversations a day; Growth ($199/month per number, or $599/month for 3 from a Growth link plus $199 per extra number) starts 50 a day per number; Enterprise is custom for high volume and compliance needs.
- Routing and measurement: GoHighLevel, HubSpot, Close and Zapier connect without code;
GET /api/imessage/agent/startedsays who replied.
Where does iMessage fit in lead generation?
iMessage fits at the moment a lead has asked to hear from you, and at every step after it. It is a conversation channel for people who opted in, not a top-of-funnel channel for reaching strangers.
ZeroSettle gives you a dedicated phone number on iMessage, running on Apple hardware we operate for you in a server facility. Your code, your CRM or the hosted AI agent sends from it and hears every reply. In a funnel it does five jobs: the first touch seconds after a submit, qualification, booking, one follow-up when a new lead goes quiet, and a clean handoff to a closer with the whole thread in the CRM.
It does not generate leads. Ads, content, referrals and forms do that; iMessage makes sure the leads they produce get answered fast, by a name and photo the lead recognizes.
How do you capture consent on forms and lead ads?
Capture consent at the point the lead gives you their number: a consent line next to the phone field that says you will text them about their request, and a stored record of when they agreed. Without it, don't text.
ZeroSettle's docs put the test plainly: the person gave you their number “for this purpose” and “you can show the record”. Your first message says who you are, STOP is honored at once (on every number of the account), and nothing promotional goes out before 8 am or after 9 pm in the lead's time zone. In the United States, FCC rules generally require prior express written consent for advertising or telemarketing covered by the autodialer rules, and state laws may add more. Our TCPA consent guide goes deeper. This is not legal advice; have counsel review your consent wording.
| Lead source | Consent to collect | Who texts first | Counts as a new contact? |
|---|---|---|---|
| Website form | Consent line by the phone field, timestamp stored with the lead | Your number, via agent/start or send | Yes |
| Facebook or Instagram lead ad | Consent language on the form itself, kept with the lead export | Your number, from the lead webhook | Yes |
| “Text us” button or QR code | The lead's own text is the request; still honor STOP | The lead | No |
| Demo or quote request in your app | Checkbox in the request flow | Your number | Yes |
| Purchased, scraped or cold list | None you can show | Nobody. Don't text it. | Not applicable |
A “new contact” is someone your number delivers a message to first. People who text first are never limited.
The “Text us” row is underrated. A lead who texts you first never counts toward a new-contact limit, every link you send them is tappable, and your replies stay out of iOS 26's Screen Unknown Senders list, which can hide a first text from an unknown sender without a notification. Put an sms: link next to every form; how to get customers to text you first shows the markup. For paid social, texting Facebook and Instagram lead ad leads on iMessage covers the lead-form wording and the webhook.
How fast should the first text go out?
The first text should go out while the lead is still on your thank-you page: wire the form submit straight to an API call, not to a person's to-do list. A text that arrives in seconds reads as an answer rather than an interruption.
With the hosted AI agent on, one call opens the conversation. The agent sends your first_message, answers whatever the lead replies, and its triggers handle the follow-up. name is optional; the agent knows it for the whole conversation.
curl -X POST https://portal.zerosettle.io/api/imessage/agent/start \
-H "Authorization: Bearer $ZEROSETTLE_TOKEN" -H "Content-Type: application/json" \
-d '{"to": "+13105551234", "name": "Priya"}'
Call it from your form backend, a lead-ad webhook, or any automation step that can make an HTTP POST. Handle the answers you can get back: 429 new_contact_limit means wait retry_after_s and try again (queue it, don't drop it), 403 recipient_opted_out means this person texted STOP before and must not be retried, 402 ai_credits_exhausted means buy credits, and 409 not_managed means the line group is still managed by API, so switch it to the agent first. The AI agent docs list every field, and speed to lead for home service businesses applies the same flow to estimate requests.
No links in the opener
Until a lead replies to your number or saves it as a contact, iPhone shows a link from you as plain text they can't tap. End the first message on a question and send the booking link after they answer. Photos, voice messages, videos and polls also wait for a reply (403 attachment_before_reply), so the opener is text only. Why first-message links aren't tappable explains it.
Set the number's name and photo in the console so the lead sees your brand, and say on the thank-you page: “We just texted you from (your number). Reply there and we'll get you sorted.” Now the text is one they were told to expect.
How does an AI agent qualify leads over iMessage?
The hosted AI agent qualifies leads by asking the questions you list in its business context, one or two at a time, and sharing the booking link only when the answers fit. You write the rules in plain words; there is no flow builder.
Switch the line group to Managed by AI Agent in the console's Messaging tab (step by step in AI agent in the console), then write the business context: who the leads are, the qualifying questions in order, what disqualifies someone, common objections and your answers, and when to hand off to a person. A short version (illustrative example; Northgate Remodeling is a fictional business):
You are Northgate Remodeling's assistant. You text people who asked
for a kitchen or bath quote on our ads or website a minute ago.
Goal: book a free in-home estimate with our designer.
Ask, one at a time: kitchen or bath? full remodel or a refresh
(cabinets, counters)? rough timeline? the zip code of the home?
We serve zip codes 98101-98199 only. Outside it, say so kindly and stop.
Under 3 months out and in our area: offer the booking link.
Prices: refreshes usually start at $12,000; full kitchens at $40,000.
Never quote an exact price. The designer does that in person.
If they ask for a person, give (206) 555-0148, Mon-Fri 8-5.
Keep each text to one or two sentences.
Then set the settings that matter for lead gen, in the console or with PUT /api/imessage/agent. Only the fields you send change:
curl -X PUT https://portal.zerosettle.io/api/imessage/agent \
-H "Authorization: Bearer $ZEROSETTLE_TOKEN" -H "Content-Type: application/json" \
-d '{"managed_by": "zerosettle", "personality": "professional", "response_time": "instant",
"goal": "demo_booked", "link": "https://northgate-remodel.example/book"}'
Write the opener in the console's First message box: 1 to 3 texts sent together, exactly as written, ending on a question. It goes out when you start a conversation, and it is also the first answer to anyone who texts the number first, so word it to work for both (“Thanks for asking about a quote! Is this for a kitchen or a bathroom?”).
Because first_message goes out exactly as written, it can't include the lead's name. To personalize, turn first_message_enabled off and the agent writes its own opener using the name you passed; if it can't write one just then, agent/start answers 502 agent_unavailable and sends nothing, so retry.
- Thu 7:12 PM
- Business: Hi, it's Northgate Remodeling. Thanks for asking about a quote!
- Business: Is this for a kitchen or a bathroom?
- Lead: kitchen. cabinets are falling apart
- Business: Got it. Are you thinking new cabinets and counters, or a full remodel with layout changes?
- Lead: probably just cabinets + counters. what does that cost
- Business: Refreshes usually start around $12,000, and our designer gives an exact number at a free in-home estimate. When are you hoping to start, and what's the zip code?
- Lead: after the holidays. 98115
- Business: We're in your area. Pick any open slot for the estimate here: https://northgate-remodel.example/book
- Lead: booked tues at 10
- Business: Perfect, see you Tuesday. Text here if anything changes.
The agent never invents facts the business context doesn't give, says it is your automated assistant if sincerely asked, and points anyone who wants no more texts to STOP. Test it from your own iPhone with the questions your worst leads ask. Qualify leads with an AI agent over iMessage goes deeper on question order and disqualification wording, and an AI SDR for demo requests covers the B2B version.
How do you get from a reply to a booked call?
Set the agent's goal to demo_booked and its link to your booking page; the agent invites interested leads to book with that link once they qualify. Because it goes out after the lead's first reply, the link is tappable.
- Collect the phone number on the booking page. It is the key that matches bookings to conversations later.
- Write the booking rules down. “Only offer the link inside the service area” is a rule the agent follows; a rule you leave out, it can't.
- Connect a scheduling MCP server if you have one (Messaging → Connectors) so the agent can check availability or book a time. Tools that change something start off, because anyone who texts your number can ask the agent to use them.
- Hand the hot ones to a person: tell the agent when to give a phone number or say someone will follow up.
How many follow-ups can you send?
Before a lead's first reply, at most 2 messages; after they reply once, that rule no longer applies to them, but restraint still wins. A third message to someone who never answered is refused with 403 awaiting_reply, and nothing is sent.
Messages sent within 5 minutes of the first count as one, so a two-text opener uses one of the two. That leaves exactly one follow-up for a lead who goes quiet, which is what the hosted agent's default trigger sends: once, the morning after the last message, only if they haven't replied. Triggers fire at a random moment in their window (morning is 9 to 11 AM in the agent's timezone), so texts land like a person's.
Make that follow-up a different, easier question, not “just checking in”: “Still thinking about the kitchen? Happy to hold a slot for after the holidays.” Put the instruction in the trigger:
curl -X PUT https://portal.zerosettle.io/api/imessage/agent \
-H "Authorization: Bearer $ZEROSETTLE_TOKEN" -H "Content-Type: application/json" \
-d '{"timezone": "America/Los_Angeles", "triggers": [
{"id": "followup", "repeat": "once", "after_days": 1, "at": "morning",
"instruction": "If they have not replied to your last text, send one short, easy question about their project. No link, no pressure."}]}'
A once trigger fires once each time a conversation goes quiet, so the default follow-up also nudges leads who replied and then stopped before booking. For a second, later nudge, add another once trigger a few days out: it reaches leads who have replied at some point, and for leads who never did it is refused, since it would be a third unanswered message. Avoid daily triggers in lead gen: they fire in every conversation the agent has on the line group. Lead nurture on iMessage without getting your number flagged has the full cadence.
How many leads can one number handle?
Leads who text a number first never count toward its new-contact limit; that limit is on conversations the number starts. Pro starts 5 new contacts a day; Growth starts 50 a day per number, at most 3 per 15 minutes. Every number also allows 10,000 messages a day, sent and received, with known contacts.
| Plan | Price | New contacts your number starts | Free credits (once) |
|---|---|---|---|
| Pro | $49/month, one number | 5 a day | 500 |
| Growth | $199/month per number (upgrade in the console), or $599/month for 3 numbers from a Growth link plus $199 per extra number | 50 a day per number, 3 per 15 minutes; team members included | 1,000 |
| Enterprise | Custom pricing through sales | Set with sales, for high volume and compliance needs | Ask sales |
Every subscription has a 30-day money-back guarantee. Free credits come once and never refill; packs are 1,000 for $50 or 5,000 for $200 and never expire. Book a demo to talk about Enterprise.
For paid campaigns the 15-minute window matters more than the daily one. If an ad drops 30 leads in an hour on one Growth number, 3 per window go out at once and the rest get 429 new_contact_limit with a retry_after_s. More numbers fix that: a new lead goes to the number with the most room left today, and anyone you already talk to always hears from the same number. Three Growth numbers start up to 150 conversations a day, 9 per 15 minutes. You can add numbers from the console or the API; see Your iMessage number.
Credits are the other budget: one per text the hosted agent sends. As arithmetic, not a benchmark, a two-text opener (2), three answers of one or two texts each (3 to 6) and a follow-up (1) come to 6 to 9 credits, so Growth's 1,000 free credits cover more than a hundred such leads. They come once and never refill; after that you buy packs. Texts your own server sends use none.
How do conversations get into your CRM?
Connect the CRM from Settings → CRM in the console and every message is logged there with no code: GoHighLevel and LeadConnector, HubSpot, Close, or Zapier for anything else. Pick one source of sends per line group, because a number the AI agent manages only sends through the agent.
| CRM | What gets logged | Sending from the CRM |
|---|---|---|
| GoHighLevel / LeadConnector | An SMS in the contact's conversation, including the agent's texts | The iMessage (ZeroSettle) app makes your number the sub-account's SMS provider: inbox, mobile app, workflow Send SMS and bulk actions |
| HubSpot | An SMS communication on the contact, or a conversation in your HubSpot inbox | The iMessage card, the Send iMessage workflow action, or an inbox reply |
| Close | An iMessage activity on the lead, including the agent's texts | Log an iMessage activity with a Message and an empty Status |
| Zapier | A trigger on each message received, sent or failed | The Send iMessage action in any Zap |
Two setups work. Either the hosted agent texts and qualifies while the CRM logs every message, or the line group is managed by API and your CRM's workflows do the texting. If you try both on one number, sends from Close and HubSpot are refused with 403 managed_by_zerosettle, and a GoHighLevel send is marked failed with the reason. With more than one number you can put them in separate line groups and run one setup on each. CRM sends follow the API's rules: STOP, the 2-unanswered rule and the new-contact limits. Group chat messages are not logged in Close or HubSpot, so keep lead conversations 1:1 (or read building a group chat assistant if a group is the point).
Agencies running client sub-accounts should read GoHighLevel + iMessage: a setup guide for lead gen agencies, and CRM integrations has every setting.
What should you measure?
Measure four things: how fast the first text went out, how many leads replied, how many booked, and how many opted out. ZeroSettle gives you the first, second and fourth; your calendar gives you bookings.
GET /api/imessage/agent/started lists the conversations you opened that the agent is in, newest first, up to 500, with replied for each:
curl -s https://portal.zerosettle.io/api/imessage/agent/started \
-H "Authorization: Bearer $ZEROSETTLE_TOKEN"
# {"group_id": null, "conversations": [
# {"handle": "+13105551234", "name": "Priya", "started_ts_ms": 1790000000000,
# "last_ts_ms": 1790000360000, "replied": true}]}
| Metric | How to get it |
|---|---|
| Time to first text | Your form's submit time against started_ts_ms |
| Reply rate | Rows with replied: true divided by rows started, per campaign or lead source |
| Booked | Your booking tool's bookings, matched on the lead's phone number |
| Opt-outs | GET /api/imessage/opt-outs, matched the same way |
| Agent spend | ai_credits from GET /api/imessage/agent, or the console's top bar |
Pull the list daily and store it, since it returns only the newest 500. Leads who texted first aren't in it; count them from GET /api/imessage/conversations or your CRM. Track by lead source: low replies or rising opt-outs from one source mean weak consent or targeting, and that becomes a deliverability problem.
Why does cold texting burn numbers?
Cold texting burns numbers because people who didn't ask to hear from you don't reply, report the message, or ignore it, and repeated messages to people who never answer are, in ZeroSettle's docs' words, “the fastest way to get a number flagged by Apple: when that happens every send fails, to everyone.”
That includes your warm leads: one cold campaign can take down the conversations your qualified leads are in the middle of. ZeroSettle also suspends lines used for unsolicited messaging. The new-contact limits and the 2-unanswered rule exist to keep numbers out of spam filters, and as the docs say, they are “a floor, not a licence”: staying under them doesn't make a cold list acceptable. If you're unsure whether you have consent, you don't. What happens if your iMessage number is flagged covers the warning signs, and keeping a business number out of spam filters covers the habits that prevent it.
Broadcast doesn't change this: POST /api/imessage/broadcast sends separate 1:1 messages to up to 100 people with every per-send rule applied to each, and it is for opted-in lists, not strangers. Also plan a call or email route for leads who aren't on iMessage, which reaches Apple devices; SMS fallback is a limited pilot ZeroSettle must enable per account. GET /api/imessage/availability checks a number without sending.
What does a launch checklist look like?
A launch is consent on the form, a branded number, a tested agent, a CRM connection and a report.
- Add consent language to every phone field and lead-ad form, and store when each lead agreed.
- Get a number (Pro is self-serve; upgrade to Growth in the console for volume) and set its name and photo.
- Write the business context, a question-ending
first_messagewith no link,goal: demo_booked, your bookinglinkand thetimezone. - Test from your own iPhone, then wire submits to
agent/startwith a queue that retries on429. - Add a “Text us”
sms:link next to every form, connect your CRM, and pullagent/starteddaily.
Home service businesses can follow the same steps with a trade-specific playbook in how to grow a home service business with iMessage. The limits and error codes are all in Errors, limits, and compliance.
Frequently asked questions
Can I upload a purchased or scraped lead list and text it?
No. ZeroSettle is only for people who gave you their number for this purpose, such as a form, a lead-ad form with consent language or a text they sent you. ZeroSettle suspends lines used for unsolicited messaging, and texting people who never answer is the fastest way to get a number flagged. This is not legal advice.
Do leads who text us first count toward the new-contact limit?
No. People who text your number first are never limited, and neither is an ongoing conversation. Only conversations your number starts count: 5 new contacts a day on Pro and 50 a day per number on Growth (and 3 per 15 minutes).
Will leads on Android get the texts?
Plan on iMessage reaching Apple devices only. SMS fallback is a limited pilot that ZeroSettle must enable per account, so don't build a funnel that depends on it. GET /api/imessage/availability tells you whether a number is on iMessage without sending anything, so you can route other leads to a call or email.
Can the AI agent and GoHighLevel workflows both text from the same number?
Not at the same time. A number managed by the AI agent only sends through the agent, so a GoHighLevel send from it is marked failed with the reason. Pick one per line group: the agent answers and GoHighLevel logs every message, or the line group is managed by API and GoHighLevel workflows do the texting. With more than one number you can put them in separate line groups and run one of each.
How many credits does one lead use?
One credit per text the hosted agent sends. As arithmetic, a two-text opener (2), three answers of one or two texts each (3 to 6) and one follow-up (1) come to 6 to 9 credits. Pro includes 500 free credits once, Growth 1,000 once; they never refill. Packs are 1,000 for $50 or 5,000 for $200 and never expire. A number your own server answers uses no credits for texts.
Will the agent tell leads it is an AI?
It says it is your automated assistant if sincerely asked, and points anyone who wants no more texts to STOP. If you want to disclose up front, say so in your first message: it opens the conversations you start and is also the first answer to anyone who texts the number first. If you turn first_message off, tell the agent in the business context to introduce itself that way.
Sources
- ZeroSettle iMessage API docs: “Your iMessage number” (Pricing, More than one number, Add a line), “Send a message” (Links in a first message, Broadcast to many recipients, SMS fallback), “AI agent” (Managed by AI Agent, Triggers, Connectors, Credits), “AI agent in the console”, “Errors, limits, and compliance” (Limits, Compliance, STOP is enforced), “CRM integrations” and “Group chats” (Not covered). Checked November 2, 2026.
- 47 CFR 64.1200, Delivery restrictions, Electronic Code of Federal Regulations. Checked November 2, 2026.