You spent an afternoon getting the Open Graph tags right. The product image is a clean 1200×630. The title reads "Fall Drop — 30% off ends Sunday." You send yourself a test text, it unfurls beautifully into a rich card with the image and headline, and you ship the campaign feeling good.
Then a customer screenshots what they got: a bare, blue, tappable URL. No image, no headline, no card. Same message, same link, different phone — and the visual you thought you were sending never existed for most of your list.
Full disclosure: I work for Ready, an SMS platform. We spend a lot of time in the weeds of what carriers actually deliver versus what senders think they're sending, and the link-preview gap is one of the most common "wait, why doesn't it look like my test?" moments we field. So here's the honest version.
The link preview isn't part of your message
The first thing to understand: when you send a text with a URL in it, you are not sending an image or a card. You're sending characters — a plain-text URL. The pretty preview card is generated later, by the recipient's device or messaging app, by fetching your link and reading its Open Graph metadata.
That's the whole trick. The unfurl is a client-side rendering behavior, not a payload. Which means whether it appears depends on three things you don't control:
- The recipient's OS and messaging app — iMessage renders rich previews aggressively; the stock Android Messages app (RCS aside) is far more conservative; third-party SMS apps vary wildly.
- Whether the message got downgraded to plain SMS at the gateway — and plain SMS has no concept of a preview at all.
- Whether the carrier or gateway rewrote or stripped your URL on the way through, which breaks the OG fetch entirely.
Your "test on my iPhone" only proves the best case: iMessage-to-iMessage, where Apple happily fetches your OG tags. A2P marketing traffic almost never travels that path.
Why A2P sends don't behave like your test text
When you text a friend from your personal number, that's peer-to-peer — and if you're both on iMessage, it never touches the SMS carrier gateway at all. Apple handles the unfurl.
When you send a marketing blast from a registered 10DLC number, that traffic goes over the carrier A2P channel. It lands on the recipient's phone as SMS, delivered by the carrier's messaging pipeline. iMessage's rich-preview engine does still attempt to unfurl links inside SMS threads on iPhone — but far less reliably, and only when the link survives intact and the device decides to fetch it. On Android, most SMS clients don't unfurl at all.
So the population that reliably sees your card is small: mostly iPhone users, on a good day, with a clean URL. Everyone else gets the raw link. If you've built your CTA around the visual, most of your audience is getting a stripped-down version of your pitch.
Carriers actively rewrite your links — and that kills the fetch
Even the iPhone users who could see a preview often don't, because the URL they receive isn't the one you sent.
Carrier gateways and A2P filters routinely rewrite, wrap, or flag URLs. Public shortener domains (bit.ly, tinyurl, and friends) are the worst offenders — they're shared by spammers and legit senders alike, so carriers treat them with suspicion, sometimes rewriting them through a redirect and sometimes filtering the whole message. When a link gets wrapped in a carrier redirect, the OG fetch either hits the wrapper (which has no product metadata) or fails outright. No fetch, no card.
We've written about this failure mode in depth — see why bit.ly links get ecommerce texts blocked and the dedicated-domain fix. The short version: a branded, dedicated short domain both improves deliverability and gives your OG tags a fighting chance to be fetched from the real URL, because the carrier is less likely to wrap a domain it recognizes as yours.
But even a perfect branded domain doesn't guarantee the preview renders. It just removes one of the reasons it won't.
What actually survives the trip
Here's the honest inventory of what you can count on landing, versus what's a coin flip:
| Element | Reliability in A2P SMS | Notes |
|---|---|---|
| Plain-text body | Very high | This is the actual payload. Design here. |
| The raw URL (tappable) | High | Survives as long as it isn't filtered; branded domain helps. |
| OG link-preview card | Low / inconsistent | iPhone-leaning, breaks if link is rewritten, absent on most Android SMS. |
| An actual attached image (MMS) | Medium | Real payload, but has its own ceiling — see below. |
| Emoji in body | High, but costs you | Drops the segment limit from 160 to 70 chars. |
The takeaway: the two things that reliably carry a visual are (a) an MMS attachment, which is a real payload, not a rendered preview, or (b) nothing — just great copy and a clean link.
MMS is the way to guarantee an image — with tradeoffs
If the image genuinely matters — you're selling something visual and the product shot does the persuading — stop relying on the unfurl and send an actual MMS with the image attached. MMS embeds the image in the message itself, so it doesn't depend on a client fetching your OG tags. It shows up because it is the payload.
But MMS has its own carrier-enforced limits, and they'll bite you:
- Carriers silently compress or reject images over roughly a 600KB ceiling. Your crisp 2MB hero shot arrives as a blurry thumbnail. We broke this down in the 600KB MMS ceiling post.
- MMS costs more per message than SMS, and there's a length crossover where it actually gets cheaper than a long multi-segment SMS — worth knowing before you assume MMS is the expensive option. See the SMS-vs-MMS cost crossover.
- Not every device renders MMS identically either, though it's far more consistent than an OG unfurl.
So: MMS when the image is the pitch. Plain SMS with a clean link when the offer is the pitch. Don't split the difference by hoping the preview shows up.
Design a CTA that works with zero preview
Assume the worst case — a raw blue link, no card, on an Android phone — and write so that message still converts. If it works stripped, the preview is upside, not the plan.
Put the offer in the text, not the image. The headline "30% off, ends Sunday" belongs in the body, where it's guaranteed to land, not baked into an OG image that half your list won't see.
Front-load the value before the link. People decide whether to tap in the first line. "Fall drop is live — 30% off through Sunday: [link]" beats "[link] — check out our new stuff."
Use one clean, branded link. One CTA, one URL, on your own short domain. Multiple links look spammy to filters and dilute the tap.
Watch your segment math. A single SMS segment is 160 GSM-7 characters; add one emoji and the whole message drops to 70-char segments. A punchy 155-character promo is one segment; the same copy with a 🔥 becomes multipart. On Ready that's $0.02/segment plus the $0.0045 carrier pass-through — small per message, real across a 20,000-contact blast, and entirely avoidable if you know the rule. (Full pricing is on the Ready product page.)
Test on the channel you actually use. Test from your registered 10DLC number to a real Android phone and an iPhone, not iMessage-to-iMessage from your personal cell. That's the single change that stops the "but it looked great in testing" surprise.
The practical takeaway
The rich link preview is a nice-to-have that renders on a minority of your audience under ideal conditions, and it evaporates the moment a carrier rewrites your URL or downgrades your message. Building a campaign's persuasion around it is building on sand.
What survives is boring and dependable: your plain-text copy, one clean branded link, and — when the image genuinely carries the sale — an MMS attachment sized under the 600KB ceiling. Design for that, and the occasional preview card that does render becomes a bonus instead of a load-bearing wall.
If you want the deliverability side handled — registered 10DLC so your links aren't landing on filtered traffic, plus the carrier-route redundancy that keeps sends clean — that's the layer we build at Ready. You can start with 2,500 free credits, no card, and send yourself the ugly-worst-case test before you ever spend one.