What customers see when a business texts them on iMessage
When a business texts from a ZeroSettle number, customers on iPhone get an ordinary iMessage conversation: blue bubbles, the business's shared name and photo (shown as “Maybe: Your Company” until they save the contact), tapbacks and the typing bubble, because every message goes through Apple's own iMessage network. The exact display depends on their device and contact settings. Two things surprise businesses: a link in a first message isn't tappable until the customer replies or saves the number, and iOS 26 can file a cold first text under Unknown Senders without a notification.
Key takeaways
- What ZeroSettle is: 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.
- What the customer sees: an iMessage thread from your number with the name and photo you set, photos with captions, voice messages, tapbacks and a typing bubble.
- Surprise one: a link sent to someone who hasn't replied or saved your number shows as plain text. If they have never texted your number, the API still sends it and returns
warning.code: "link_not_tappable". - Surprise two: with Screen Unknown Senders on (iOS 26), a cold first text lands in a separate list with no notification.
- What they never see: a verification badge. People without iMessage, Android users included, receive nothing, because there is no SMS fallback.
- Price: Pro is $49/month for one number. Growth, for several numbers working as one, is from $599/mo.
What does the first message look like?
The first message from a ZeroSettle number arrives as an iMessage from a phone number, followed by your name-and-photo card, so the thread can show your brand instead of a bare number. ZeroSettle's homepage says customers see “Maybe: Your Company” and your photo even if they don't have you in their contacts; the exact display depends on their device and contact settings.
- Name: up to 64 characters. It becomes the contact's first name.
- Photo: a JPEG or PNG under 3 MB. Square and 600 px or larger looks best.
- When it is shared: with the first message of every conversation, and again with the next message after you change it.
- What the customer gets: “<name> shared a name and photo with you”, which they can save to your contact card.
The blue is on the customer's side: incoming texts are gray on iPhone, and the customer's replies go out as blue iMessage bubbles instead of green SMS, MMS or RCS ones (see blue vs green bubbles for business texting).
- Today 4:12 PM
- Business: Hi Sam, it's Tidewater Bikes. Your road bike is tuned up and ready for pickup.
- Tidewater Bikes shared a name and photo with you
- Business: Want the invoice here so you can pay ahead? Reply YES.
- Customer: YES
- Business: Here it is: pay.example.com/tb/4821. Open until 7 tonight.
- Customer: Paid. Can I come by at 6:30?👍
- Business is typing
What do photos, voice messages and tapbacks look like?
Photos, voice messages, tapbacks and the typing bubble from a ZeroSettle number use Messages' native bubbles, the same ones friends send. Each is one API call; what an iMessage API can send has the full formats.
| On the customer's iPhone | Sent with | Options and limits |
|---|---|---|
| A photo, caption in the same bubble | POST /api/imessage/send with image_b64 (+ text) | 5 MB; JPEG, PNG, GIF, HEIC, WebP, TIFF, BMP; only to contacts who have replied |
| A voice message: waveform, play button, transcript the recipient's phone generates | The same endpoint with audio_b64 | 6 MB; m4a, mp3, wav, aiff, caf, flac, aac, mp4, amr; only to contacts who have replied |
| Your tapback on any message in the thread, theirs or yours | POST /api/imessage/reactions | love ❤️ like 👍 dislike 👎 laugh 😂 emphasize ‼️ question ❓; remove_ retracts |
| The typing “…” bubble | POST /api/imessage/typing | ttl_s 1–60 (default 25); clears on any send |
- Photos: a JPEG, PNG or GIF up to 2048 px on the long edge goes out exactly as sent, and a GIF keeps its animation. HEIC, WebP, TIFF, BMP and anything larger are re-encoded to JPEG, which strips EXIF and GPS data.
- Replies first: photos and voice messages go only to someone who has replied to your number; otherwise the API answers
403 attachment_before_reply, so a first message is always text. - Voice messages: Messages has no caption on a voice bubble, so send words as a second message.
- Tapbacks: the ones the customer sends reach your code as
reaction.received. - Typing: only in an existing conversation; otherwise
409 no_conversation, because “a ‘…’ is not a way to probe a number.” When the customer types, your code getstyping.startedandtyping.stoppedon the live stream, and on the webhook if you opt in with"typing_events": true.
Why isn't the link tappable?
A link in a first message isn't tappable because the customer's iPhone won't open links from an unknown sender. ZeroSettle's docs explain:
An iPhone won't open links from an unknown sender. Until the recipient replies to your number or saves it as a contact, a link in your text shows as plain text they can't tap. The recipient's phone does this, so no sender can avoid it.
ZeroSettle iMessage API docs, “Links in a first message”
Apple's iPhone User Guide gives the customer's fix for a link they can't open: mark the sender as known or add them to Contacts. ZeroSettle still sends a text or caption with a link to someone who has never texted the line, and returns warning.code: "link_not_tappable" in the response so your code can tell.
The send-a-message docs recommend two patterns:
- Let them text first. A prefilled
sms:link makes your number a known sender from the first message, and every link after that works. - If you text first, “open with plain text that asks for a reply (‘Reply YES for your link’) and send the link once they answer.”
After a reply, links in texts and photo captions are tappable. Don't promise customers a preview card: the ZeroSettle console shows rich previews for URLs, but that is your view of the thread, not theirs. More in why links in a first iMessage aren't tappable.
Will the customer even get a notification?
Not always. On iOS 26, a customer with Screen Unknown Senders turned on gets texts from unknown numbers in a separate list, with no notification unless they have allowed notifications for that kind of text, so a cold first text from a ZeroSettle number may never be seen.
- Who has it on: anyone who had the older unknown-sender filter turned on, according to ZeroSettle's docs, and anyone who switches it on under Manage Filtering in Messages.
- How a sender gets out: the customer taps Mark as Known or adds the number to Contacts. Until then, Apple's guide says, later messages are filtered too.
- What your code can tell: not whether it was seen. ZeroSettle reports
message.sent(the message left the line) andmessage.failed, never delivered or read status. - How to avoid it: let the customer text first, which also keeps them outside the new-contact limit. See getting customers to text you first.
What don't customers see?
Customers don't see a verification badge on a ZeroSettle thread, and people without iMessage don't see the message at all.
No verification badge
The name and photo are the ones the business set and shared through Share Name and Photo; nothing marks them as checked by Apple. In Apple Messages for Business, by contrast, Apple's Messages for Business FAQ says a business is identified by a Business ID that Apple assigns during registration, and customers can only reach businesses Apple has approved. ZeroSettle is not Messages for Business, and ZeroSettle's terms state that it is not affiliated with Apple. See Apple Messages for Business vs an iMessage number, and for the customer's view, a business texted me on iMessage: is it legit?
Nothing, if they don't use iMessage
“The address must be on someone's iMessage; there is no SMS or email fallback,” say ZeroSettle's docs. When an iPhone user texts someone without an Apple device, the message goes as SMS, MMS or RCS in a green bubble (Apple's page on green messages). A ZeroSettle number has no such fallback, so Android users receive nothing. SMS fallback for non-Apple phones and group chats are on ZeroSettle's roadmap, and video, files and text effects can't be sent yet.
How do you make the first message count?
Set the name and photo before the first send, say who you are, let customers text first where you can, and hold links until they reply.
- Set the card first, with the call below or in the console.
- Check it on your own iPhone. Text yourself from the line. Deleting that conversation and texting again presents the name and photo afresh, as a new customer sees them.
- Offer a text-first button or QR code that opens Messages with
sms:+18055550100&body=…prefilled (see the customer support docs). On Android it opens the SMS app, so keep email or chat for those visitors. - If you text first, have consent. The person gave you their number for this purpose (keep the record), the first message says who you are, and nothing promotional goes out before 8 am or after 9 pm in their time zone. Consent rules vary by place and purpose; this isn't legal advice.
- Ask for a reply, then send the link.
- Honor STOP immediately. ZeroSettle enforces it too, across every number on your account.
# Set the name and photo customers see. Run once before the first send.
import base64, os, requests
BASE = "https://portal.zerosettle.io"
TOKEN = os.environ["ZEROSETTLE_TOKEN"]
with open("logo.png", "rb") as f: # JPEG or PNG under 3 MB
photo = base64.b64encode(f.read()).decode()
r = requests.put(f"{BASE}/api/imessage/profile",
headers={"Authorization": f"Bearer {TOKEN}"},
json={"name": "Tidewater Bikes", "image_b64": photo},
timeout=60)
print(r.status_code, r.json().get("status")) # 200 profile_set
For the wording of that first text, see how to write a first iMessage customers reply to.
What does ZeroSettle cost?
ZeroSettle Pro is $49 a month for one number; Growth, for several numbers working as one, is from $599/mo. The plans also differ in how many new contacts each number can start a conversation with.
| Plan | Price | Numbers | New contacts per number |
|---|---|---|---|
| Pro | $49/month | One to start; more can be added | 5 a day |
| Growth | From $599/mo | 3+, working as one | 50 a day, 3 per rolling 15 minutes |
The day runs 3 AM to 3 AM Eastern. Anyone who texted your number first is never limited, and messages with them are unlimited.
Both are billed monthly with a 30-day money-back guarantee on the subscription. See ZeroSettle plans and pricing, the ZeroSettle iMessage API docs and more explainers on how ZeroSettle works, or get a number.
Frequently asked questions
Can customers tell the message came from an API?
Nothing in the thread says so: it arrives as an iMessage from your number, with your name and photo. If an AI writes the replies, ZeroSettle's terms require transparent disclosure of AI interaction unless it is contextually evident; ZeroSettle's hosted AI agent (Beta) says it is your automated assistant if sincerely asked.
Can I change the name or photo later?
Yes, in the console or with another PUT /api/imessage/profile, where the photo is optional after the first call (the current one is kept). Existing customers get the new card with your next message to them, not at the moment you change it; POST /api/imessage/profile/share sends it to one person on demand.
Can I check whether someone is on iMessage before texting them?
Yes. ZeroSettle checks every first message to a new contact with Apple: if the number or email address isn't on iMessage, the API answers 422 not_on_imessage, nothing is sent and no new-contact slot is used. Anyone who isn't on iMessage, Android users included, needs another channel.
Does sharing the name and photo count as a new contact?
No. A new contact is a handle your line delivers a text, voice message or photo to first; name-and-photo shares, typing and tapbacks never count.
What does a customer see after texting STOP?
Nothing more from any number on your account: ZeroSettle refuses texts, photos, voice messages, tapbacks, typing and name-and-photo shares to them with 403 recipient_opted_out. You still receive their messages, and they can opt back in by texting START.
Sources
- ZeroSettle iMessage API docs: “Send a message” (including “Links in a first message” and “Name and photo”), “Attachments”, “Typing indicators”, “Customer support”, “Webhooks, step by step” and “Errors, limits, and compliance”. Checked October 12, 2026.
- ZeroSettle homepage: “Your name and photo”, plans, and the FAQ “How does my business name appear?”. Checked October 12, 2026.
- ZeroSettle iMessage API Terms of Service, AI disclosure and third-party platforms. Last modified September 28, 2026.
- Screen and filter text messages on iPhone, iPhone User Guide for iOS 26, Apple Support. Checked October 8, 2026.
- Why are my iPhone messages green?, Apple Support. Checked October 8, 2026.
- Apple Messages for Business Frequently Asked Questions, version 3.1 (July 21, 2026), Apple. Checked October 8, 2026.