Why SMS Messages Fail to Deliver: A Developer's Guide
If you're trying to work out why SMS messages fail to deliver, start here: a success response from your SMS provider only means the message was accepted for sending. After that it passes through aggregators and the recipient's carrier, and it can fail at every step. The number may be invalid or unreachable, a carrier may filter it, the sender may not be registered for that country (10DLC in the US), or a long message may be split into segments that don't all arrive. Delivery receipts tell you which, if you collect them and know their limits.
The path a message takes
- Your app calls the provider's API.
- The provider validates the request, queues it and routes it, often through one or more aggregators.
- The recipient's carrier accepts it, may filter it, and tries to deliver it to the handset, retrying for a while if the phone is off or out of coverage.
- A delivery receipt (DLR) travels back along the same chain to your provider, which passes it to you.
The "sent" in your logs usually reflects step 2. Your users only care about step 3.
Delivery receipts: useful, not gospel
Most providers report each message's progress through a status webhook, with states such as queued, sent, delivered, undelivered or failed, often with an error code. Store every update keyed by the provider's message ID, not just the last one.
Know the limits:
- DLRs come from carriers, and their quality varies by country and route. Some never arrive, some arrive late.
- On some routes, "delivered" only confirms that the carrier accepted the message, not that it reached the phone.
- A missing DLR isn't proof of failure. Treat it as unknown.
For verification codes, the best proof of delivery is the user typing the code in. The share of sent codes that get verified, broken down by country and carrier, is often a more honest health metric than DLRs.
Why SMS messages fail to deliver: the usual causes
The number can't receive texts
- Invalid or unallocated numbers, often caused by formatting: a missing country code or a leftover national 0. Normalise to E.164 before sending.
- Landlines, which usually can't receive SMS.
- Disconnected or reassigned numbers, which may still be valid on paper but no longer reach the person who signed up.
- Some virtual and VoIP numbers, which don't receive certain traffic, short-code messages in particular.
The handset is unreachable
Phones that are switched off, out of coverage or roaming can't take delivery straight away. The carrier stores the message and retries, but only until the validity period runs out. Many APIs let you set that period per message. For a five-minute code, a short validity period makes sense: a code that turns up an hour later only confuses people.
Carrier filtering
Carriers filter business traffic to fight spam and fraud. Messages are more likely to be blocked or delayed when:
- the sender isn't registered where registration is required
- the content contains public link shorteners or looks like common phishing
- a new sender suddenly sends a large volume
- the content doesn't match the use case the sender registered
- the recipient has opted out, for example by replying STOP, in which case many providers refuse further messages to that number from you
Filtered messages may fail with a specific error code or simply never arrive.
US 10DLC registration
In the US, business texting from ordinary 10-digit numbers, known as 10DLC, requires registering your brand and each messaging use case (a "campaign") with The Campaign Registry, usually through your SMS provider. US carriers block or heavily filter unregistered 10DLC traffic, and your registration also affects how fast you may send. Toll-free numbers need their own toll-free verification, and short codes go through a separate approval. If US delivery collapses while other countries look fine, check registration status first.
Encoding and segments
| Encoding | Single message | Per segment when split |
|---|---|---|
| GSM-7 | 160 characters | 153 characters |
| UCS-2 | 70 characters | 67 characters |
One character outside the GSM-7 set, such as an emoji, a curly apostrophe or most non-Latin scripts, switches the whole message to UCS-2, unless your provider replaces it first. A 100-character message containing a single ’ becomes two segments. Every segment is billed, and the phone needs all of them to rebuild the message, so long messages have more ways to go wrong. A few GSM-7 characters, including € and square brackets, take two character slots each.
Keep code messages short, with the code near the start.
Sender and country rules
Countries differ on which sender types they accept and what must be registered, so a sender that works in the UK may be rewritten or blocked elsewhere.
A debugging checklist
- Log the provider message ID, country, sender, encoding and segment count for every send, plus every status callback with its error code.
- Group failures by country, carrier and error code. A spike in one group points to routing or registration; scattered failures are usually bad numbers.
- Check the number (E.164, valid range, line type), then the content (stray Unicode, links, length).
- Check sender and registration rules for the destination country.
- Reproduce on a real handset on the affected carrier when you can.
- Contact your provider with message IDs in hand. They can see the route.
To check by hand that a message arrives and reads correctly, free public numbers on Temp SMS, such as its US numbers, show incoming texts on a web page. Anyone can read them, so use them only for throwaway test accounts, never banking, a main email or two-factor authentication.
FAQ
Why does my SMS say sent but not delivered? "Sent" means the provider or carrier accepted the message. It may since have been filtered, be waiting for an unreachable phone, or have been delivered without a receipt coming back.
Do emojis affect SMS delivery? They switch the message to UCS-2, cutting the limit from 160 to 70 characters, so it splits into more segments that cost more and can go missing.
Do I need 10DLC registration to send OTPs in the US? If you send from your own standard 10-digit US numbers, yes. The alternatives are a verified toll-free number, a short code, or a provider's verification service that sends from its own registered senders.