How it works

Lead Nurture on iMessage Without Getting Your Number Flagged

Lead nurture on an iMessage number works when you send fewer, better texts than an SMS drip would: at most two before the lead's first reply (texts within 5 minutes of each other count as one), each ending on an easy question, with no links until they answer. On ZeroSettle the hosted AI agent runs the follow-ups for you with triggers that land at a different moment for each conversation inside a morning, afternoon or evening window, and the platform refuses the sends that would get a number flagged: a third unanswered text, an attachment before a reply, or anything to someone who texted STOP.

Key takeaways

  • Two before a reply: a contact who has never replied gets at most 2 messages; a third is refused with 403 awaiting_reply. Texts sent within 5 minutes of the first count as one.
  • End on a question: a reply removes the limit for good, so every text before it should be easy to answer in a few words.
  • Timing is built in: the hosted agent's once triggers fire 0 to 30 days after the last message, in a morning (9–11 AM), afternoon (1–3 PM) or evening (6–8 PM) window in your timezone, at a different moment per conversation.
  • Links wait for a reply: until someone texts the number, a link shows as plain text they can't tap, and photos, videos, voice messages and polls are refused.
  • Consent first: nurture only people who gave you their number for this, and treat STOP, “not now” and silence after two touches as answers.

Why doesn't an SMS drip work on iMessage?

An SMS drip doesn't work on iMessage because its habits (many touches to people who never answered, a link in the first text, a flyer as an MMS) are exactly what gets an iMessage number filtered by Apple. ZeroSettle's docs put it plainly: “Repeated messages to people who never answer are the fastest way to get a number flagged by Apple: when that happens every send fails, to everyone.”

That last clause is the part marketers underestimate: a flagged number also stops reaching the customers who were happily texting it. ZeroSettle enforces the most important limits for you, so a sequence designed around them never hits a refusal.

One more difference: iMessage reaches Apple devices. SMS fallback is a limited pilot that ZeroSettle must enable for your account, so don't count on a lead with an Android phone getting your texts; keep email or a call in the plan for them. GET /api/imessage/availability checks whether a number is on iMessage without sending anything.

SMS drip habits and what happens on a ZeroSettle iMessage number (ZeroSettle API docs, checked November 2, 2026)
SMS drip habitOn an iMessage numberDo this instead
5 to 10 touches over two weeks, reply or notA third text to someone who never replied is refused with 403 awaiting_replyTwo touches, then wait
A tracking link in the first textShows as plain, untappable text until they reply or save the numberAsk a question; send the link once they answer
A photo or flyer as the openerRefused with 403 attachment_before_replyText first; photos after a reply
Blasting a whole list at 9:00 sharpNew-contact caps per number (5 a day on Pro; 50 a day and 3 per 15 minutes on Growth)Open conversations as leads arrive
Importing an old or purchased listZeroSettle suspends lines used for unsolicited messagingOnly people who gave you their number for this

People who text the number first never count toward the new-contact caps, and neither does an ongoing conversation.

How many texts can you send before a lead replies?

Two. ZeroSettle allows at most 2 messages to a contact who has never sent the number anything, and refuses a third with 403 awaiting_reply (nothing is sent or stored). The error carries error.handle and error.unanswered, so your code knows who and how many.

Three details make the rule easier to live with than it sounds:

  • Back-to-back texts count as one. Messages sent within 5 minutes of the first count as one, so a greeting plus a question (or a hosted-agent opener of two or three texts) is a single message toward the limit.
  • Any reply removes it for good. A text, photo, video, voice note or even a tapback from them, and there is no limit for that contact afterwards.
  • Failures don't count. Failed sends and the number's own tapbacks are not unanswered messages.

In practice: one opener and one follow-up. The hosted AI agent follows the same rule, and a refused text gives its credit back. The full rules are in Errors, limits and compliance.

Why should every text end on an easy question?

Every text before the first reply should end on an easy question because a reply is the only thing that unlocks the rest of the conversation: more follow-ups, tappable links, photos and polls. The docs say the same about the hosted agent's opener: “End on a question: a reply keeps the conversation open.”

“Easy” means answerable in a few words without thinking or committing to anything:

  • Either-or: “Is this for the whole house or a few rooms?”
  • Timing: “Are you aiming for before the holidays, or is timing open?”
  • Confirming what they asked for: “You mentioned a quote for two bathrooms. Still the plan?”

Avoid asking for a decision (“Ready to book?”), a long answer (“Tell me about your project”) or nothing (“Just checking in!”). How to write a first iMessage customers actually reply to goes deeper on openers.

When should follow-ups go out?

Follow-ups should go out at a normal hour for the person reading them, never in a burst at the same minute for everyone. With the hosted AI agent you set this with triggers; with your own code or CRM, your workflow does the waiting (ZeroSettle has no scheduler for your own sends).

A hosted-agent trigger is a time of day plus an instruction in plain words. Two kinds exist:

  • once: after_days (0 to 30) after the conversation's last message. Every message in the conversation sets it again (not the trigger's own texts), and it never fires when the lead wrote last, because the answer to them owns that. This is the nurture trigger.
  • daily: every day, in every conversation the agent has on the line group, including existing customers. That makes it the wrong tool for lead nurture; keep it for content people asked to get every day.

Each trigger's at is morning (9 to 11 AM), afternoon (1 to 3 PM) or evening (6 to 8 PM) in the agent's timezone (default America/New_York). Each time a trigger is set, in each conversation, it picks a different moment of that window, so texts land like a person's rather than on the dot. Up to 5 triggers per line group; each has enabled so you can pause one without deleting it.

Triggers only ever reach 1:1 conversations: they never fire into a group chat. In a group the agent answers only when a message is meant for it, so a lead you add to a group with your crew or a partner gets no nurture texts there.

Quiet hours across time zones

ZeroSettle's compliance guidance says not to send anything promotional before 8 am or after 9 pm in the recipient's time zone. All three windows sit inside that range in the agent's own time zone, but the setting is one per line group, not one per lead. If the timezone is America/New_York and a lead lives in California, a morning trigger lands between 6 and 8 AM for them. For leads spread across the US, afternoon is the safe window (1 to 3 PM Eastern is 10 AM to 12 PM Pacific), or set timezone to where most of your leads are.

The opener is different: it goes the moment your form, ad integration or Zap calls POST /api/imessage/agent/start. A reply within a minute to a request someone just made is the point of speed to lead; a batch of older leads imported at 10 PM should wait in your own workflow until morning.

Send a link after the lead's first reply. Until someone replies to your number or saves it as a contact, iPhone shows a link in your text as plain text they can't tap, and no sender can avoid it because the recipient's device does it. A send with a link to someone who has never texted the number still goes out, with a warning of link_not_tappable in the response.

Also, iOS 26's Screen Unknown Senders moves texts from unknown senders into a separate list without a notification, which is one more reason a lead who asked to hear from you should expect your text. Details are in why links in a first iMessage aren't tappable.

With the hosted agent, put your booking or payment page in link (with a goal of purchase, trial_start or demo_booked) and keep it out of first_message. The agent shares the link when the person is interested, which by then means they have replied.

What should a nurture text say?

A nurture text should give the lead something useful before it asks for anything: a fact that helps them decide, an answer to the question they probably have, or a simple choice. “Bumping this” gives nothing and spends one of your two touches.

  • Say who you are and why you're texting. The first message names your business and what they asked for. That is part of consent, not just manners.
  • Use what they told you. Their name, the service they picked, the date they mentioned. With POST /api/imessage/agent/start, pass name and the agent knows it for the whole conversation. first_message goes out exactly as written, the same for every lead, so the name isn't in it; the agent uses it in its answers and trigger texts. To personalize the opener too, set first_message_enabled to false and the agent writes its own from your business context.
  • A real fact, not a pitch. Lead times, what an estimate includes, what a first visit looks like. The hosted agent never invents facts its business context doesn't give, so put these in the context.
  • No fake urgency. “Only 2 spots left!” on every lead is a drip habit, and people notice.
  1. Tue 7:12 PM
  2. Business: Hi, it's Sam's assistant at Harbor Line Painting. Thanks for your estimate request!
  3. Business: Are the walls staying the same color, or are you thinking of a change?
  4. Thu 9:47 AM
  5. Business: One thing that helps with planning: we're booking interior jobs about two weeks out right now. Is there a date you're working toward?
  6. Lead: sorry, crazy week. thinking a lighter gray and want it done before the 20th
  7. Business: Before the 20th works. Going lighter usually takes two coats, and the estimate includes both.
  8. Business: Want to pick a time for the walkthrough? https://harborline.example/book
Illustrative example with a fictional painting company. Blue bubbles are the hosted AI agent on the business's number; gray is the lead. The two-text opener is the business's first_message, sent word for word to every lead, and counts as one message; the Thursday text (a once trigger, 2 days after the last message, in the morning window) is the second, and the link waits until Dana replies.

Painters and other home service businesses can see the full flow in how painters can follow up on estimates that went quiet.

What does a 3-touch iMessage sequence look like?

A 3-touch iMessage sequence is an opener, one follow-up for people who haven't replied, and one follow-up for people who replied and then went quiet. The third touch only ever reaches someone who has answered, so the sequence never asks the platform for a third unanswered text.

Sample 3-touch nurture sequence on the hosted AI agent (illustrative; settings from the ZeroSettle API docs, checked November 2, 2026)
TouchWhenSettingExample textRule it respects
1. OpenerThe moment the lead submits the formfirst_message, sent by POST /api/imessage/agent/start“Hi, it's Sam's assistant at Harbor Line Painting. Thanks for your estimate request!” + “Is this for a few rooms or the whole house?”Two texts within 5 minutes count as one; no link
2. Nudge2 days after the last message, morning windowonce trigger, after_days: 2, at: "morning"“We're booking interior jobs about two weeks out. Is there a date you're working toward?”The second and last text before a reply
3. Next step5 days after the last message, afternoon window, only if they replied beforeonce trigger, after_days: 5, at: "afternoon"“Still thinking about the gray for the living room? Happy to hold a walkthrough slot next week.”Only to repliers, so links and photos work

Both triggers rearm on every message, so the instructions say who each one is for. A trigger whose instruction doesn't apply sends nothing.

Triggers replace the default follow-up, because triggers is always the whole list. Set them, with the time zone, in one call (or in the console's Messaging tab, under Triggers):

bash
curl -X PUT https://portal.zerosettle.io/api/imessage/agent \
  -H "Authorization: Bearer $ZEROSETTLE_TOKEN" -H "Content-Type: application/json" \
  -d '{"timezone": "America/Chicago", "triggers": [
        {"id": "nudge", "repeat": "once", "after_days": 2, "at": "morning",
         "instruction": "Only if they have never replied: send one short text with one useful fact from the business context, ending on an easy question. No links. If they have replied before, send nothing."},
        {"id": "next-step", "repeat": "once", "after_days": 5, "at": "afternoon",
         "instruction": "Only if they replied at least once and then went quiet: send one short, low-pressure text that offers the next step and ends on a question. If they said not now, chose someone else, or already booked, send nothing."}]}'

Then open each conversation as the lead arrives, from your form handler, a Zap or your CRM:

bash
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": "Dana"}'

If the third touch somehow fired for a lead who never replied, the platform would refuse it with awaiting_reply and return its credit; the instruction just keeps the agent from trying. Before real leads, start a conversation with your own number and reply the way a lead would, to check the opener and the agent's answers. The console walk-through is in AI agent in the console, and every field is in the AI agent docs.

Leave daily triggers off a nurture number

A daily trigger fires in every conversation the agent has on the line group, including the ones it already had. On a number that also talks to customers, a daily “nurture” text reaches all of them.

How do STOP and opt-outs work in a sequence?

When a lead texts STOP, ZeroSettle blocks every number on your account from reaching them, so no trigger, CRM step or API call can text them again until they text START. Sends return 403 recipient_opted_out and nothing is stored. The hosted agent also points anyone who wants no more texts to STOP.

The match uses the whole message or its first sentence: stop, unsubscribe, quit, opt out and phrases such as “take me off your list”, “remove me”, “no more texts” or “wrong number”. CANCEL and END are not currently recognized, so have someone read replies like those and stop by hand. Pull the list with GET /api/imessage/opt-outs to keep your CRM and other channels in sync. How STOP and opt-outs work covers the rest.

STOP handling is not the same as consent. Nurture only people who gave you their number for this purpose: an estimate request, a web form, a lead-ad form with consent language, a past customer who agreed to texts, or someone who texted you first. Never purchased lists, scraped numbers or cold texting. iMessage marketing and TCPA consent explains the US rules; it is not legal advice, and neither is this post.

When should you stop following up?

Stop following up when the lead has answered, in words or in silence. Concretely:

  • Two touches, no reply: the platform stops you, and you should agree with it. Leave the conversation alone; if they come back, the agent answers.
  • “Not now” or “went with someone else”: thank them and stop. Say so in the business context and in each trigger's instruction, as in the sample above.
  • They replied, then went quiet: one next-step touch, perhaps one more much later (a once trigger can wait up to 30 days), then stop.
  • STOP or anything like it: done, everywhere.

Don't delete a conversation to get around the limits. Deleting makes the handle a new contact again, so your next text uses one of the day's new contacts, and more texts to someone who never answers are exactly what gets a number flagged. What happens if your iMessage number is flagged explains why it isn't worth the risk.

Can you run the sequence from your CRM?

Yes. Sends from GoHighLevel, Zapier, HubSpot or Close follow the same rules as POST /api/imessage/send: an active subscription, STOP, the two-message rule and the new-contact limits. A step those rules refuse is marked failed with the reason (a HubSpot workflow action reports failed or refused with an errorCode), so a 7-step SMS workflow pointed at an iMessage number fails at the third unanswered step for anyone who hasn't replied.

Pick one owner for the sequence. A number managed by the hosted agent only sends through the agent from GoHighLevel, HubSpot and Close: their sends are refused (Close and HubSpot with 403 managed_by_zerosettle). To run the sequence from one of those CRMs, put the number on managed_by: "api" and let the CRM own the follow-ups; to let the agent own them, use its triggers and keep the CRM for logging.

Rebuild the workflow around the same shape as the table above: an opener, one wait-and-nudge branch for non-repliers, and everything else behind a “contact replied” condition. In GoHighLevel, the iMessage (ZeroSettle) app makes your number the sub-account's SMS provider, so workflow Send SMS actions go out over iMessage; the GoHighLevel setup guide for lead gen agencies walks through it. In Zapier, use the Send iMessage action and the New iMessage Received trigger to branch on replies. Setup for each CRM is in CRM integrations.

For the wider picture, from capturing the lead to qualifying it, see iMessage for lead generation, texting Facebook and Instagram lead ad leads in seconds and qualifying leads with an AI agent.

What the follow-ups cost

Texts the hosted agent sends use one credit each; texts your own server or CRM sends use none. Pro is $49 a month for one dedicated number, with 5 new contacts a day and 500 free credits once. Growth is $199 a month per number (upgrade in the console), with 50 new contacts a day per number, 3 per 15 minutes, team members and 1,000 free credits once; from a Growth link it is $599 a month for 3 numbers plus $199 a month for each extra number. Enterprise is custom pricing through sales for high volume and compliance needs (book a demo). The subscription has a 30-day money-back guarantee. Free credits never refill; packs are 1,000 for $50 or 5,000 for $200 and never expire. In the sample sequence, the opener uses two credits and each trigger text one (a trigger can send up to three texts; the sample instructions ask for one), plus one for each text of the agent's answers. Each number allows 10,000 messages a day, sent and received, with known contacts.

Frequently asked questions

How many follow-ups can I send a lead who hasn't replied?

One. ZeroSettle allows at most 2 messages to a contact before their first reply, and the opener is the first. A third is refused with 403 awaiting_reply and nothing is sent. Once they send anything back, even a tapback, the limit is gone for that contact.

Do two texts sent back to back count as two messages?

No. Messages sent within 5 minutes of the first count as one toward the two-message rule, so a two-text opener is one message. A text sent the next morning is the second.

What time do the hosted agent's follow-ups go out?

In the window you pick: morning (9 to 11 AM), afternoon (1 to 3 PM) or evening (6 to 8 PM), in the time zone set on the agent (America/New_York by default). Each conversation gets a different moment inside the window, so texts don't all land on the dot.

What happens if a lead texts STOP in the middle of a sequence?

Every number on your account is blocked from reaching them: texts, photos, reactions and typing all return 403 recipient_opted_out, and no trigger can text them. They opt back in only by texting START.

Can I run the sequence from GoHighLevel, HubSpot or Zapier instead?

Yes. Sends from GoHighLevel, HubSpot, Zapier or your own code follow the same rules as the API: STOP, the two-message rule and the new-contact limits. A step those rules refuse is marked failed, so build the workflow around two touches before a reply. On a number managed by the hosted agent, GoHighLevel, HubSpot and Close sends are refused, so run CRM sequences on a number managed by API.

Do follow-up texts cost credits?

Only when the hosted AI agent sends them: one credit per text. Pro ($49 a month for one number) includes 500 free credits once and Growth ($199 a month per number) includes 1,000 once (from a Growth link, $599 a month covers 3 numbers, plus $199 for each extra); packs are 1,000 for $50 or 5,000 for $200 and never expire. Enterprise is priced through sales. Texts your own server sends use no credits.

Sources

  1. ZeroSettle iMessage API docs: Errors, limits, and compliance (unanswered messages, new contacts, attachments, consent, STOP is enforced). Checked November 2, 2026.
  2. ZeroSettle iMessage API docs: AI agent (Managed by AI Agent, triggers, credits). Checked November 2, 2026.
  3. ZeroSettle iMessage API docs: AI agent in the console. Checked November 2, 2026.
  4. ZeroSettle iMessage API docs: Send a message (links in a first message, SMS fallback pilot). Checked November 2, 2026.
  5. ZeroSettle iMessage API docs: Your iMessage number (pricing), CRM integrations (Close, HubSpot, GoHighLevel, Zapier) and Group chats. Checked November 2, 2026.

Written by the ZeroSettle team. ZeroSettle is an iMessage API: a dedicated phone number on iMessage, running on Apple hardware we operate for you in a server facility, that your code texts customers from and hears back on through a bearer token and signed webhooks.

Product facts on this page come from the ZeroSettle iMessage API docs as of November 2, 2026. Harbor Line Painting is a fictional business, and this page is not legal advice.

Follow up on every lead from your own iMessage number

ZeroSettle gives your business its own phone number on real iMessage, running on Apple hardware we operate for you in a server facility. The hosted AI agent opens the conversation, answers replies and follows up inside the rules, or your code does it through the API.

Pro is $49 a month for one number with a 30-day money-back guarantee. Growth is $199 a month per number, or $599 a month for 3 from a Growth link plus $199 for each extra number. Enterprise pricing is custom, for high volume and compliance needs.