Why SMS is best-effort
There is no guaranteed delivery in SMS. Between your API call and a handset sit aggregators, international gateways, and the destination carrier β any of which can delay, filter, or silently drop a message. Verification traffic is scrutinized especially hard because carriers fight fraud and spam on exactly these routes.
The practical consequence: you must design for partial failure (resend, fallback) and actively monitor delivery, rather than assuming a sent message is a delivered message.
- Delivery depends on the destination carrier's filtering policy.
- International routes add gateways, each a possible failure point.
- Application (A2P) traffic is filtered harder than person-to-person.
Sender IDs and why they matter
The sender ID is what the recipient sees as the "from" β a long code, a short code, or an alphanumeric name. Countries differ sharply: some require pre-registered alphanumeric sender IDs, some mandate short codes for A2P, and some rewrite or block unregistered senders. Using the right, registered sender ID for each country is one of the biggest delivery levers.
- Alphanumeric sender IDs: branded text as the sender; pre-registration required in many countries.
- Short codes: highest throughput and trust for A2P, but need carrier approval.
- Long codes: fine for many markets, but need 10DLC registration in the US.
- Using an unregistered sender in a strict country is a common silent-failure cause.
Carrier filtering and message content
Carriers score message content. URLs, especially shortened links, public URL shorteners, and unusual formatting are classic triggers for filtering. OTP messages should be minimal and consistent: your app name, the code, and nothing else. Consistency also helps because some carriers build reputation on a sender+template pairing over time.
- Avoid links in OTP messages; shortened links are a strong filter trigger.
- Keep templates consistent β erratic content looks like spam.
- Do not include marketing in a transactional OTP message.
- Register message templates where the country requires it.
If delivery suddenly drops in one country, suspect a content or sender-ID rule change there before anything in your code.
Per-country routing
A route is the path your message takes to a destination carrier, and route quality varies by provider and country. Cheap grey routes can look fine in testing and then silently degrade. For verification, prefer direct or high-quality routes to your important countries, even at higher cost, and let your provider know the traffic is OTP so they route it appropriately.
- Prefer direct/premium routes for verification in key markets.
- Beware grey routes: low price, unstable delivery, poor DLRs.
- Some providers let you tag traffic as OTP for better routing.
- Test each important country separately β averages hide country-level failure.
Monitor delivery and act on it
You cannot fix what you do not measure. Collect delivery receipts (DLRs) and track delivery rate and latency per country and per carrier, then alert on regressions. Combine that with fallback logic so a delivery dip degrades gracefully instead of blocking signups.
- 1
Collect DLRs
Enable delivery receipts and store them against each send so you know delivered vs failed, not just sent.
- 2
Segment by country and carrier
Track delivery rate and latency per destination β the average will hide a single failing market.
- 3
Alert on regressions
Trigger an alert when a country's delivery rate or latency degrades beyond a threshold.
- 4
Fail over
Route around a degraded provider or escalate to a fallback channel automatically.