Your shipping notification lands every time. "Your order #1042 has shipped" goes out, the customer taps the tracking link, and nobody thinks about it. Then you send the weekend sale from the same registered number to the same customers, and the click-through collapses. The dashboard still says "delivered." Nothing changed about the number, the registration or the list. The content changed, and carrier filters read content.
The filter is not judging your number in the abstract. It is judging each message against what your number registered to send and against patterns that look like spam. An order update matches both checks. A promo written like a 2009 email subject line fails both. This post covers the four content signals that most often separate the two: drift from your registered use case, aggressive casing and punctuation, link patterns, and missing opt-out language. Then it walks through annotated before/after rewrites and shows how we use Ready's AI message writer and spam-filter check to catch these before a campaign goes out.
Why the same number gets two different outcomes
Carrier filtering in the US works on several layers at once. Registration (10DLC) tells carriers who you are and what you said you'd send. Content filtering then looks at what you actually send. Passing the first doesn't exempt you from the second. We covered that gap in detail in why approved campaigns still get filtered.
Transactional and promotional texts look very different to a filter:
- An order update is triggered by the customer. It goes to one person, at the moment they expect it, with wording that barely varies between sends.
- A promo goes out as a campaign. Thousands of identical messages hit carrier networks in a short window, often with urgency words, a link and a discount. That is the same shape spam has.
The volume pattern alone makes promos more visible to filters. Content then decides whether that visibility hurts you.
The "delivered" status won't tell you which outcome you got. A delivery receipt confirms a handoff, and a filtered message can still report as delivered. See what your delivered rate actually confirms before you trust that number.
Signal 1: content that drifts from your registered use case
When you register a 10DLC campaign, you pick a use case and submit sample messages. Carriers compare live traffic to that declaration. If you registered for account notifications or customer care, with samples like "Your order has shipped," and you then send "50% off everything this weekend," your traffic no longer matches what you declared.
This is the most common reason the split shows up in ecommerce. The store registers once for order updates, because those were the first texts it sent. Marketing gets added later from the same campaign registration.
The fix is registration, not wording. Register a campaign whose use case and sample messages actually include promotions. That means a marketing or mixed use case with real promo samples. Our guide on matching use case to what you send walks through the choice.
On Ready, registration happens in-app. Each campaign costs about $20/mo on top of the $10/mo brand fee, plus $2 per number, and most approvals take 2 to 7 days. Splitting order updates and promos onto separately registered campaigns costs one more campaign fee a month. That is usually cheap insurance for your shipping notifications.
Signal 2: aggressive casing, punctuation and emoji
Filters weigh how a message looks, not only what it says. The usual triggers:
- All caps. "HUGE SALE" reads as shouting, and spam leans on it heavily.
- Stacked punctuation. Patterns like "!!!", "???" or "$$$".
- Urgency piled on urgency. "Today only," "last chance," "don't miss out" and "act now" all in one message.
- Text-speak. "U," "ur," "txt," which also appears in a lot of scam traffic.
- Emoji clusters. One emoji won't sink a message on its own. Three fire emoji in front of a discount look like a pattern.
Emoji also cost you money. One emoji switches the whole message to unicode, which drops the segment limit from 160 characters to 70 (67 per part when it splits). A 140-character promo with one emoji is 3 segments instead of 1. We do the math on that below.
Signal 3: link patterns
Links are where promos and order updates differ most. A tracking link from a known carrier domain, sent to someone waiting for a package, is unremarkable. A public shortener in a discount message to 10,000 people is one of the strongest filter signals there is.
The patterns to avoid:
- Public shorteners (bit.ly, tinyurl and similar). Spammers share the same domains, so the domain's reputation follows every message that uses it. On Ready, the terms do not allow public shorteners: a link on one sends the text to a content review, and a text that review blocks is billed at 5 times its cost (terms of service 6B), so put the link on your own domain. The dedicated-domain fix and what it costs is worth reading if your promos rely on them.
- Multiple links in one message. One destination is enough.
- Links with no context. "Click here: [link]" with nothing explaining what's behind it.
- Mismatched domains. The message says your brand name and the link goes somewhere unrelated.
The safest pattern is a short path on your own store domain, such as yourstore.com/spring.
Signal 4: missing brand name and opt-out language
Order updates usually name the store, because the template was written that way. Promos often skip it to save characters. A message that doesn't identify the sender looks anonymous, and anonymous plus discount plus link is the profile filters are built to catch.
Opt-out language is the other gap. "Reply STOP to opt out" belongs in the first message to a new subscriber. It is also good practice in recurring promos, because it signals to filters and recipients that this is consented, managed traffic. It costs 22 characters.
On Ready, inbound STOP and UNSUBSCRIBE are honored automatically. The opt-out applies across every campaign, and later sends to that number are refused up front and not charged. The language in the message is still on you.
Annotated rewrites
These examples use a fictional store, Northfield Goods. Character counts are approximate.
Rewrite 1: the flash sale
Before:
🔥🔥 HUGE FLASH SALE!!! 50% OFF EVERYTHING TODAY ONLY!!! Don't miss out, shop now >> bit.ly/3xYz9 🛒
What's wrong with it:
- No brand name, so the sender is anonymous.
- All-caps phrases and two "!!!" clusters.
- Three urgency phrases stacked together.
- A public shortener link.
- No opt-out language.
- Three emoji, which make it unicode at about 95 characters, so 2 segments.
After:
Northfield Goods: our spring sale is on, 50% off sitewide through Sunday. Shop: northfield.example/spring Reply STOP to opt out.
What changed:
- The brand name comes first.
- The case is normal and there is one period's worth of excitement.
- There is a real deadline ("through Sunday") instead of manufactured panic.
- The link is on the store's own domain.
- Opt-out language is included.
- It is about 121 GSM characters, so 1 segment.
Rewrite 2: the abandoned cart
Before:
Hey! U left something in ur cart... claim ur FREE gift $$$ before it's gone: tinyurl.com/x8k2
What's wrong with it:
- Text-speak ("U," "ur").
- "FREE" in caps next to "$$$".
- A vague "something."
- A public shortener link.
- No sender.
After:
Northfield Goods: the linen throw you picked is still in your cart. Free shipping on it through Friday: northfield.example/cart Reply STOP to opt out.
What changed:
- It names the specific product, which reads like a service message because it is one.
- The offer is concrete.
- The link is on the store's own domain.
- It is about 143 characters, so 1 segment.
Cart texts still need SMS consent from that shopper. A checkout email address is not a phone opt-in.
Rewrite 3: the use-case drift
Before: "Your order #1042 has shipped! Plus take 20% off your next order with code SHIP20," sent from a campaign registered only for order notifications.
After: Send the shipping notice alone from the notification campaign. Send the 20% offer separately, from a campaign registered for marketing, with the brand name and opt-out language.
The copy was fine. The problem was the route it went out on.
Catching it before send: the AI message writer and spam-filter check
The rewrites above follow a repeatable process, and that's how we'd run it in Ready:
- Draft the promo in the AI message writer. Give it the offer, the deadline and the link. Ask for a plain-spoken version that leads with the brand name and includes opt-out language.
- Run the spam-filter check on the draft. Fix what it flags. Caps, stacked punctuation, shorteners and missing sender identity are the usual offenders, and they're the ones covered in this post.
- Confirm the campaign registration matches the content. A clean promo sent from a notification-only campaign still drifts from its use case.
- Send to a few internal phones on different carriers before the full campaign. Then read the message on the handset rather than relying on the dashboard status.
The check reduces risk. It doesn't guarantee delivery, because carriers don't publish their filter rules and they change them. Platforms sending through the API apply the same content rules. The POST /v1/messages/bulk request carries consent_attested: true, which is your promise that every recipient agreed to texts. See the bulk messages docs.
Switching providers won't fix any of this. Filtering happens at the carrier, so the same promo gets the same treatment on any provider. Content and registration are the levers you control.
The cost side of cleaner copy
Clean copy also costs less. Here is a worked example on Ready Standard, at $0.0075/segment plus a $0.0045 carrier fee per segment, sent to 10,000 opted-in contacts.
| Before (emoji flash sale) | After (plain rewrite) | |
|---|---|---|
| Encoding | Unicode | GSM-7 |
| Segments per text | 2 | 1 |
| Total segments | 20,000 | 10,000 |
| Rate cost (× $0.0075) | $150 | $75 |
| Carrier fee | 20,000 × $0.0045 | 10,000 × $0.0045 |
The rewrite saves $75 in rate plus 10,000 carrier fees on every send. That is before you count the extra clicks from messages that actually reach a screen.
Those all-in figures don't include screening. Scrubbing and landline validation are $0.003 extra per segment each if you switch them on for the account. Both are off by default.
On Ready, curly quotes, long dashes and ellipses are swapped for plain ones before sending, so those characters don't change your count. Emoji still do. Every price is on our pricing page.
The practical takeaway
When order updates land and promos don't, start with two questions:
- Is this promo going out on a campaign registered for promos?
- Would this message look normal coming from a person?
Name the brand, drop the caps and stacked punctuation, put links on your own domain, include opt-out language, and keep each promo to one segment where you can.
If you want to try the writer and spam-filter check on your own promo copy, you can sign up. The first 20 texts are free one-to-one sends, so use them to test on your own phones before you register. Campaigns are paid from the first text.
Frequently asked questions
Can a text show as delivered and still be filtered?
Yes, a text can show as delivered and still be filtered. A delivery receipt only confirms a handoff, so a filtered message can still report as delivered. That's why a promo's click-through can collapse while the dashboard looks fine. A better test is to send to a few internal phones on different carriers before the full campaign, then read the message on the handset instead of trusting the status.
Do emoji make SMS messages cost more?
Yes, one emoji can triple the cost of a text. An emoji switches the whole message to unicode, which drops the segment limit from 160 characters to 70, or 67 per part when it splits. A 140-character promo with one emoji is 3 segments instead of 1, and each segment is billed. On Ready, curly quotes, long dashes and ellipses are swapped for plain ones before sending, so they don't change the count. Emoji still do.
Should promo texts and order updates use separate 10DLC campaigns?
Yes, if you send both, separate campaigns are usually worth it. Carriers compare live traffic to the use case and sample messages you registered, so promos sent from a notification-only campaign drift from what you declared. On Ready, registration happens in-app. Each campaign costs about $20/mo on top of the $10/mo brand fee, plus $2 per number, and most approvals take 2 to 7 days. One extra campaign fee a month is cheap insurance for your shipping notifications.
Will switching SMS providers stop my promo texts from being filtered?
No, switching providers won't stop promo texts from being filtered. Filtering happens at the carrier, so the same promo gets the same treatment on any provider. The levers you control are content and registration: name the brand, drop the all caps and stacked punctuation, put links on your own domain instead of a public shortener, include opt-out language, and send promos from a campaign registered for marketing.