Guides

How to write a first iMessage that customers actually reply to

A first business iMessage that customers reply to says who you are and why you're texting, asks one easy question, and leaves the link out, because an iPhone won't make a link from an unknown sender tappable until the person replies or saves your number. ZeroSettle's iMessage API docs recommend a short sequence over one long message: “Three texts a few seconds apart read like a person typing; one paragraph reads like a campaign.” If the customer doesn't answer, send at most one follow-up, then stop.

Key takeaways

  • The formula: your business name, the reason you're texting, and one question they can answer in a word, split into up to three short texts with no link.
  • Links wait: until the person replies or saves your number, an iPhone shows a link as plain text. ZeroSettle still sends it and returns warning.code: "link_not_tappable".
  • Limit math: a three-text opener to one person is one new contact (Pro allows 5 a day per number, Growth 50). On every plan it is also one of the two unanswered messages allowed.
  • When to stop: after one follow-up, or as soon as they send a text with the word STOP in it or a clear request like “take me off your list”. ZeroSettle then blocks every number on your account from reaching them.
  • Price: Pro is $49/month for one number, with unlimited messages with people who message you first. Growth, for several numbers working as one, is from $599/mo.
  • What it does not do: ZeroSettle sends iMessage only. There is no SMS fallback for people without iMessage.

Before you send: name, photo and consent

Set your brand name and photo, confirm the person gave you their number for this, and check the clock. Skip one and even a well-written opener arrives from a bare number, reaches someone who never asked, or lands at 10 pm.

  • Name and photo. The brand name you set in ZeroSettle (up to 64 characters) becomes the contact's first name; the photo is a JPEG or PNG under 3 MB, and a square one of 600 px or more looks best. ZeroSettle shares the card automatically with the first message of every conversation, and the recipient sees “<name> shared a name and photo with you”. See what customers see when a business texts them.
  • Consent. ZeroSettle's docs define it in four points: the person gave you their number for this purpose and you can show the record; your first message says who you are; you honor STOP immediately; and “Don't message before 8 am or after 9 pm in the recipient's time zone for anything promotional.” The FCC's TCPA rules set the same hours for telephone solicitations (47 CFR 64.1200(c)(1)). More in the iMessage TCPA consent guide. This isn't legal advice; have counsel review your program.
  • iMessage only. ZeroSettle is an iMessage API: a real phone number on real iMessage, running on Apple hardware we operate for you, that your code texts customers from and hears back on through a bearer token and signed webhooks. It has no SMS fallback, so the recipient must be on iMessage: your opener never goes out as the green-bubble SMS, MMS or RCS message that Apple describes. ZeroSettle checks every first message with Apple: if the number isn't on iMessage, the send is refused with 422 not_on_imessage and nothing goes out.

Say who you are and why you're texting

The first text names your business and the exact reason you're writing, in words the customer will recognize. “Hi Sam, it's Dana from Harbor Realty. You asked about 22 Oak St on our site this morning” works because it points at something Sam did; “Exciting news!” could come from anyone.

Name the business in the text even though ZeroSettle shares your name-and-photo card right after it. How the card shows up depends on the recipient's iPhone and contact settings, and ZeroSettle's docs count “your first message says who you are” as part of consent.

Ask one easy question

End the opener on one question the customer can answer in a word. A text back makes your links tappable, and any reply, a tapback included, resets the unanswered count.

“Thursday or Friday?” and “Want me to send the times?” are easy. “What are you looking for in a home?” is homework, and two questions in one text leave them choosing which to answer. ZeroSettle's docs give the hosted AI agent (in beta) the same rule: its first_message is 1 to 3 texts and should end on a question, because “a reply keeps the conversation open”.

Put no link in a first message: until the recipient replies to your number or saves it as a contact, an iPhone shows it as plain text they can't tap. In ZeroSettle's docs: “The recipient's phone does this, so no sender can avoid it.”

ZeroSettle still sends such a text and adds warning.code: "link_not_tappable" to the response. The docs give two ways around it:

  1. Ask first. Open with plain text that asks for a reply (“Reply YES for your link”) and send the link once they answer.
  2. Let them text first with a prefilled sms: link. See how to get customers to text you first.

If you text first, Apple's Screen Unknown Senders setting in iOS 26 may also file your opener in a separate Unknown Senders list. It is off by default, but Apple turns it on for anyone who had Filter Unknown Senders on in iOS 18. Details: why links in a first iMessage aren't tappable.

Send three short texts, not a paragraph

Split the opener into up to three short texts: who you are, why you're texting, and the question. As ZeroSettle's docs put it, “one paragraph reads like a campaign.” Each POST /api/imessage/send returns once the line has handed the message to Apple, normally in 2–5 seconds, so a plain loop keeps them in order and spaced a few seconds apart.

python
import os, requests

BASE = "https://portal.zerosettle.io"
HEADERS = {"Authorization": f"Bearer {os.environ['ZEROSETTLE_TOKEN']}"}
OPENER = [
    "Hi Sam, it's Dana from Harbor Realty.",
    "You asked about 22 Oak St this morning. Open house Saturday 11 to 1.",
    "Want me to save you a spot?",
]

for text in OPENER:
    r = requests.post(f"{BASE}/api/imessage/send", headers=HEADERS,
                      json={"to": "+13105550142", "text": text}, timeout=90)
    body = r.json()
    if not r.ok:
        print("stopped:", body["error"]["code"])   # e.g. new_contact_limit, recipient_opted_out
        break
    if "warning" in body:
        print("warning:", body["warning"]["code"])  # link_not_tappable, if a text has a link

After they reply, POST /api/imessage/typing shows the typing bubble while you look something up (ttl_s 1 to 60 seconds, default 25), and your next text clears it. ZeroSettle refuses typing to a number the line has never exchanged a message with (409 no_conversation), so the bubble belongs before replies, not before a cold opener. Their own typing reaches you as typing.started and typing.stopped on the live stream, and on your webhook if you register it with "typing_events": true.

The three texts count once against the new-contact limit, because a new contact is a person ZeroSettle delivers to first, not a message.

What one three-text opener counts against, per number (ZeroSettle API docs, checked October 12, 2026)
LimitProGrowth
New contacts per day (3 AM to 3 AM Eastern)1 of 51 of 50
New contacts per rolling 15 minutes—1 of 3
Unanswered messages to that person1 of 2 (texts within 5 minutes of the first count as one)1 of 2 (texts within 5 minutes of the first count as one)
Typing, your tapbacks, the name-and-photo cardNot countedNot counted
  1. Today 10:14 AM
  2. Business: Hi Sam, it's Dana from Harbor Realty.
  3. Business: You asked about 22 Oak St this morning. Open house Saturday 11 to 1.
  4. Business: Want me to save you a spot?
  5. Customer: yes! can I come at 11:30?👍
  6. Business: You're down for 11:30 Saturday. Directions and floor plan: harborrealty.example/22-oak
  7. Customer: perfect, thanks
Illustrative example with a fictional brokerage. Blue bubbles are sent from the brokerage's number through ZeroSettle; gray bubbles are the customer's replies. The link goes out only after Sam replies, when it is tappable.

Use the features people recognize

A tapback on their reply, a captioned photo and a voice note from someone on your team make a business thread read like a person. ZeroSettle sends all three.

  • Tapbacks. POST /api/imessage/reactions takes love, like, dislike, laugh, emphasize or question on any message, theirs or yours. A like on “yes!” acknowledges it without another text.
  • A photo with a caption. The caption arrives in the same bubble. A photo of the actual listing, part or order beats an adjective.
  • A voice note. It arrives as Messages' own audio bubble with a waveform and the transcript the recipient's iPhone generates. It has no caption, so send any link as a separate text.

Photos and voice messages go only to people who have replied: sent to someone who hasn't, they're refused with 403 attachment_before_reply, so open with text and save them for the conversation.

When should you stop texting someone?

After one unanswered follow-up, and for good the moment they text STOP. ZeroSettle's docs explain why: “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.” More in how to keep a business iMessage number out of spam filters.

  • ZeroSettle enforces one follow-up. A contact can have at most 2 unanswered messages, and texts within 5 minutes of the first count as one, so a three-text opener plus one follow-up is the whole allowance; the next send returns 403 awaiting_reply until they answer. Anything they send back, tapbacks included, resets the count.
  • STOP ends it. A text with the word STOP in it, or a clear request like “take me off your list”, opts the sender out, and every number on your account is blocked from reaching them (403 recipient_opted_out; nothing is sent or stored). They opt back in by texting START. See how STOP and opt-outs work.
  • Don't send a discount as a follow-up to someone who never answered, a second “just checking in”, or marketing into a support thread, which the docs call “a different consent”.

First-message templates by situation

Each opener below names the business and the reason, ends on a question and carries no link; the link goes in your answer to their reply. Send promotional ones only between 8 am and 9 pm in the recipient's time zone.

Illustrative first-message templates, all link-free (fictional businesses)
SituationOpenerAfter they reply
New lead“Hi Sam, it's Dana from Harbor Realty. You asked about 22 Oak St this morning. Want the open house times?”The times, then the listing link.
Demo request“Hi Priya, it's Leo at Northwind Analytics. You requested a demo. Thursday or Friday?”A booking link for that day.
Lapsed customer who opted in to offers“Hi Ana, it's Coastline Coffee Club. You haven't had a box since June, so your next one is 20% off. Want the link?”The checkout link, with the discount already applied.
Review ask“Hi Marco, it's Rowan at Fern Bikes. Thanks for coming in Saturday. Would you leave us a quick review?”The review link, to everyone who says yes.
Failed payment“Hi Jordan, it's Juniper Yoga. This month's membership payment didn't go through. Want the link to update your card?”A like on their reply, then the billing link.

For win-back offers, ZeroSettle's retention-offer guide adds two rules: make the offer real in your billing system before you send it, and send one offer per trigger and one trigger per user per week.

What does sending these texts cost?

ZeroSettle charges a monthly plan price, not a fee per message: messages are unlimited, and what is capped is new contacts per number (plus unanswered messages per contact).

ZeroSettle plans (zerosettle.io and API docs, checked October 12, 2026)
PlanPriceNew contacts per numberHosted AI agent (beta)
Pro$49/month5 a day1,000 AI credits a month
GrowthFrom $599/mo50 a day5,000 AI credits a month

A credit is one text the hosted agent sends, so an agent's three-text opener uses three; a line your own server answers uses none. Both plans have a 30-day money-back guarantee on the subscription. See ZeroSettle pricing, the ZeroSettle iMessage API docs, more iMessage for business guides, or get a number.

Frequently asked questions

Should the first message include my website?

Not as a link: until they reply or save your number, it shows as plain text they can't tap. Name your business instead, and send the link in your answer to their reply.

Is it okay to use emoji?

Sparingly, and only if it matches how your business already talks. The three-text retention example in ZeroSettle's docs uses one emoji; saying who you are and asking an easy question matter more.

How long should I wait before following up?

About a day, and only once. That is the hosted AI agent's default: one follow-up a day after the last message, sent in the morning in the agent's time zone.

What if they reply with only a tapback?

Treat it as engagement and answer with a short text. Their reactions reach your webhook as reaction.received, and a tapback resets the unanswered count like any reply.

Do I need to add “Text STOP to opt out”?

For customers in Canada, the UK, the EU or Australia, plan on it: ZeroSettle's docs list “an easy opt-out in every campaign” among those countries' rules. Wherever they are, ZeroSettle opts out anyone who sends a text with the word STOP in it, or a clear request like “take me off your list”. This isn't legal advice.

Sources

  1. ZeroSettle iMessage API docs: “Links in a first message”, “Reactions (tapbacks)”, “Name and photo”, “Attachments”, “Typing indicators”, “Retention offers”, “Customer support”, “AI agent” and “Errors, limits, and compliance”. Checked October 12, 2026.
  2. ZeroSettle plans, zerosettle.io: Pro and Growth prices, and the FAQ on how your business name appears. Checked October 12, 2026.
  3. View conversations from unknown senders in Messages on your iPhone, Apple Support. Checked October 8, 2026.
  4. Why are my iPhone messages green?, Apple Support. Checked October 8, 2026.
  5. 47 CFR § 64.1200, Delivery restrictions, paragraph (c)(1): no telephone solicitations to residential subscribers before 8 a.m. or after 9 p.m. local time (Legal Information Institute, Cornell Law School). Checked October 8, 2026.

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

Product facts on this page come from ZeroSettle's iMessage API docs and zerosettle.io as of October 12, 2026. Facts about iPhone come from Apple Support pages, and the 8 a.m. to 9 p.m. rule from 47 CFR 64.1200, checked October 8, 2026. All example messages and businesses are illustrative, and nothing here is legal advice.

Text your customers 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. Your code sends with one API call and hears every reply on a signed webhook.

Pro is $49 a month with a 30-day money-back guarantee. Growth, for several numbers working as one, is from $599/mo.