<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[SMSPing Blog]]></title><description><![CDATA[SMSPing Blog]]></description><link>https://smsping.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sat, 07 Nov 2026 11:21:40 GMT</lastBuildDate><atom:link href="https://smsping.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Why OTP SMS messages don't arrive: a debugging checklist]]></title><description><![CDATA[Few things frustrate users more than "we sent you a code" when nothing shows up. Here's the checklist I go through when verification SMS fail to deliver…]]></description><link>https://smsping.hashnode.dev/why-otp-sms-messages-don-t-arrive-a-debugging-checklist</link><guid isPermaLink="true">https://smsping.hashnode.dev/why-otp-sms-messages-don-t-arrive-a-debugging-checklist</guid><category><![CDATA[debugging]]></category><category><![CDATA[sms]]></category><category><![CDATA[webdev]]></category><category><![CDATA[Security]]></category><dc:creator><![CDATA[SMSPing]]></dc:creator><pubDate>Thu, 29 Oct 2026 14:13:54 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ae353a1289414ae0e800b85/ffb03196-a7d0-4811-8a82-47099215d3e3.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Few things frustrate users more than "we sent you a code" when nothing shows up. Here's the checklist I go through when verification SMS fail to deliver.</p>
<h2>1. Check the provider's delivery status first</h2>
<p>Every SMS API returns a status callback (queued, sent, delivered, undelivered, failed). "Sent" only means it left the provider. Look for carrier error codes before touching your app.</p>
<h2>2. Number formatting</h2>
<p>Always store and send numbers in E.164 (<code>+60123456789</code>). Leading zeros and missing country codes are the most common silent failure.</p>
<h2>3. Sender ID rules per country</h2>
<p>Some countries require pre-registered alphanumeric sender IDs, some block them entirely, and some rewrite them. A message that works in the US can be filtered in India or Indonesia.</p>
<h2>4. Content filtering</h2>
<p>Carriers filter messages with URL shorteners, certain keywords, or too many links. Keep OTP templates short: the code, the app name, and the expiry.</p>
<h2>5. Rate limits and duplicate suppression</h2>
<p>Rapid resends can be throttled by your provider or by the carrier. Add a resend cooldown and show it in the UI.</p>
<h2>6. Unicode length</h2>
<p>A template with emoji or non-Latin characters switches to UCS-2, cutting the limit to 70 characters per segment. Multipart messages fail more often.</p>
<h2>7. Test with real numbers in the target country</h2>
<p>Mock numbers won't reveal carrier filtering. Test on a real number in each country you launch in. A local SIM works, or an online virtual number service.</p>
<p>Disclosure: I run <a href="https://smsping.net">SMSPing</a>, an online SMS receiving service. You pick an app, country and carrier, get a virtual number, and read incoming SMS in the dashboard or via API. If no SMS arrives, the fee returns to your balance. That makes it a cheap way to check real delivery from abroad.</p>
<p>What's the weirdest SMS delivery bug you've hit?</p>
]]></content:encoded></item></channel></rss>