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

  1. Your app calls the provider's API.
  2. The provider validates the request, queues it and routes it, often through one or more aggregators.
  3. 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.
  4. 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:

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

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:

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

  1. Log the provider message ID, country, sender, encoding and segment count for every send, plus every status callback with its error code.
  2. Group failures by country, carrier and error code. A spike in one group points to routing or registration; scattered failures are usually bad numbers.
  3. Check the number (E.164, valid range, line type), then the content (stray Unicode, links, length).
  4. Check sender and registration rules for the destination country.
  5. Reproduce on a real handset on the affected carrier when you can.
  6. 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.