Your sign-up works perfectly in your own country, and then support tickets start arriving from another one: "I never got the code." Most of the time the problem isn't your code. It's how SMS is delivered across borders. Here are the usual causes and how to check each one.
1. Sender ID rules differ per country
Many countries restrict alphanumeric sender IDs (like MyApp). Some require them to be pre-registered, some replace them with a random number, and some block unregistered traffic entirely. India, for example, requires A2P messages to be registered on its DLT platform with an approved template.
Check: ask your SMS provider which countries need sender ID or template registration, and register the ones that matter for you.
2. Carrier filtering of "OTP-looking" messages
Carriers filter traffic that looks like spam or grey-route traffic. Sending the same template at high volume through an unregistered route is a common trigger.
Check: use your provider's delivery reports (DLRs). "Delivered to carrier" is not the same as "delivered to handset".
3. Encoding and length
If your message contains a single non-GSM character (an emoji, a curly quote, many local scripts), the whole SMS switches to UCS-2 and the limit drops from 160 to 70 characters per part. Multipart messages are more likely to arrive late or out of order.
Check: keep the OTP message short, put the code first, and avoid characters that force UCS-2 unless you need the local language.
4. Number format
Users type numbers with a leading 0, spaces, or without the country code. If you don't normalise to E.164 (+44...), some messages go nowhere.
Check: normalise with a library like libphonenumber before sending.
5. Retry behaviour
Users who don't get a code in 20 seconds press "resend" several times. If every resend invalidates the previous code, the one that finally arrives may already be dead.
Check: keep the last 2-3 codes valid for a few minutes and show a countdown before allowing a resend.
How to test this without SIM cards
The only reliable test is a real SMS to a real number in that country. Online numbers make that cheap: request a number for a country, trigger your sign-up, and read what actually arrived (sender, text, delay). I run Receive SMS, which has an HTTP API for exactly this, and you only pay when the SMS arrives. Any provider with a similar API works.
A nightly job that checks your top countries and logs delivery time and sender ID will catch most of these problems before your users do.
Top comments (0)