- Public link shorteners (bit.ly-class) are the single most common silent filter trigger on consumer routes.
- US carriers filter SHAFT-C content classes and unregistered 10DLC traffic aggressively; India requires DLT template matching.
- One curly quote or emoji silently converts GSM-7 (160/153 chars) to UCS-2 (70/67) - more segments, more cost, more spam-shape.
- Run the free pre-flight linter before sending; it encodes this checklist as versioned rules.
Why do SMS messages get filtered at all?
Carriers run content and reputation filters on every SMS after it leaves the SMSC and before it hits the handset, dropping anything that looks like spam or violates route rules.
A positive handoff to the carrier does not equal delivery to the phone. Filters score the message body, the sender ID, the traffic pattern, and registration status for that destination. Messages that fail simply vanish or return delivered=false. Delivery receipts remain the sole ground truth of what the handset actually received. The live carrier-filtering explainer at https://smsroute.cc/blog/sms-firewall-how-carriers-filter walks through exactly how those firewalls operate without repeating the theory here.
Checklist part 1: what's in the message body?
The message body is the first thing carriers score for spam, so public shorteners, ALL-CAPS, SHAFT-C terms, urgency-plus-currency shapes, and missing STOP language get dropped before the handset.
Carriers treat the body as a pure signal. The catch is they match the exact strings and shapes your users will see. Swap public shortener domains for your full branded domain, keep mixed case under the ALL-CAPS threshold, strip sex, hate, alcohol, firearms, tobacco, cannabis wording on US routes, kill currency symbols next to urgency phrases, and put clear STOP opt-out on any marketing tone. Validate the rewrite at https://smsroute.cc/tools/sms-deliverability-linter.html. Scoring detail lives at https://smsroute.cc/blog/sms-firewall-how-carriers-filter.
| Symptom | Check | Fix |
|---|---|---|
| Silently dropped on consumer routes | Public shortener domain in body? | Use your full branded HTTPS domain |
| US route filtered | SHAFT-C content class present? | Rework copy or use a registered path |
| Flagged as spam-shaped | ALL-CAPS ratio, $$$ + urgency | Rewrite in plain sentence case |
| Marketing tone, no opt-out | STOP/opt-out line missing? | Append the opt-out line before sending |
Checklist part 2: encoding and segmentation
Smart quotes, dashes and emojis silently upgrade GSM-7 messages to UCS-2, which multiplies segments and makes marketing blasts look like spam to carrier filters.
One non-GSM character flips the entire payload to UCS-2. That turns a clean single-segment blast into multiple short parts that carriers score as spammy bulk traffic, especially on US routes. The decision rule is simple: if your draft contains anything outside basic GSM-7, normalize punctuation to straight quotes and hyphens, remove emojis, then recount segments pre-send with the deliverability linter at https://smsroute.cc/tools/sms-deliverability-linter.html. Full filter mechanics sit at https://smsroute.cc/blog/sms-firewall-how-carriers-filter.
- GSM-7 limits
- 160 chars single / 153 per part multi
- UCS-2 limits
- 70 chars single / 67 per part multi
- Common upgrade triggers
- curly quotes, em dash, ellipsis, emoji
- Cost effect
- one stray character can double or triple segments
Checklist part 3: sender identity and registration
Unregistered sender identity and missing route registrations are a top reason SMS show delivered=false or vanish on US and Indian carriers. Alphanumeric IDs succeed only where the destination permits them. US carriers terminate numeric traffic alone, Japan overrides any foreign alphanumeric, and unregistered 10DLC or Indian non-DLT blasts get filtered or surcharged hard.
Check the live matrix at https://smsroute.cc/tools/sender-id-rules-by-country.html for every destination you hit. Symptom of a bad sender is a clean handoff that never reaches the handset. Fix by moving to a registered 10DLC campaign in the US, DLT-approved headers in India, or a numeric sender everywhere else that demands it. Shared pools handle the defaults, custom alphanumerics come on request where routes allow.
How do I verify instead of guessing?
Pull the per-message delivery receipt in the dashboard or via webhook, A/B a clean body variant to the same handset, and run the same payload across two or three destination carriers before any real campaign volume.
Receipts tell you whether the carrier accepted or rejected the message; the clean A/B isolates body scoring from route noise. The catch is a single green DLR on one network proves nothing about the next. Decision rule: if the clean variant lands and the original does not, fix the body first. Failed messages are automatically credited back, so the tests cost nothing permanent.
- Lint before sendingrun the free pre-flight linter on body + destinations
- Test sendone message per destination carrier
- Read the receipthandset-level delivery status, not carrier acceptance
- A/B the suspectclean variant vs original to isolate the trigger
[ ] no public shortener domains
[ ] CAPS ratio sane, no $$$-urgency shape
[ ] US route: SHAFT-C clean + registered path or non-US origin
[ ] marketing tone -> opt-out line present
[ ] segments counted in the right encoding
[ ] sender ID legal for the destination
[ ] test send + delivery receipt checkedFrequently asked questions
Why does my SMS say delivered but never arrives?
Delivered in the API or dashboard means the carrier SMSC accepted the message. Filters still drop it before the handset with no further status update. Only true handset delivery receipts count as arrival. Real-time DLR webhooks and the dashboard log expose the intermediate acceptance codes that look green but never reach the phone.
Do links get SMS blocked?
Public shortener domains are heavily filtered by carriers. Messages with bit.ly or tinyurl links return delivered=false or disappear without a DLR. A full branded HTTPS domain usually passes. Exception: if the link uses an IP address instead of a hostname, US routes still reject it as suspicious.
Why did my 160-character message bill as 3 segments?
One character outside the GSM-7 set forced UCS-2 on the full message. That encoding packs fewer characters into each segment than GSM-7, splitting your text into three parts for billing. The common edge case is a single smart quote or non-breaking space copied from a document editor that leaves no other clue in the visible body.
Does SMSRoute guarantee delivery?
No one honestly can guarantee delivery. Carriers decide whether a message reaches the handset. SMSRoute shows per-message receipts and credits failed messages back. This credit applies even if the failure reason is a silent carrier filter with no detailed error code returned.
Browser open, number typed, price shown before you send — from $0.004 per message, US $0.0125, paid in crypto.
Try it with test creditsemail-only signup · BTC, ETH, USDT, XMR, LTC, SOL