When OTPs fail to reach MTN, Airtel, Glo or T2 users in Nigeria, the cause is usually one of five things: the wrong route class, a sender ID not approved on that network, promotional wording in the OTP text, a number that has ported to another network, or your own resend logic. Delivery reports tell you which, if you read them correctly.

Last reviewed: 27 October 2026

Work through this checklist in order. Each step either rules a cause out or points you to the fix.

Step 1: Read the delivery status first

Before changing anything, look up the message. Every eSMS message has a status, available in the dashboard, by API and by delivery webhook:

curl https://sms.esmsafrica.io/api/messages/MESSAGE_ID \
  -H "Authorization: Bearer esms_live_your_api_key"
StatusMeaningWhat it tells you about an OTP problem
queuedAccepted and queued for sendingStuck here means a problem on your account (for example balance), not the network
scheduledWaiting for a scheduled send timeOTPs should never be scheduled; check your code is not passing a send time
submittedAccepted by the gatewayOn its way to the network
sentAccepted by the carrier, awaiting a handset receiptThe network has it. A long wait here often means the handset is off or out of coverage
deliveredDelivery confirmed by the handsetThe SMS arrived. If the user says it did not, check spam folders on the phone and the number they typed
retryingA failed attempt is being retriedA temporary failure; avoid triggering a second OTP on top
failedFailed or rejectedUnreachable number, gateway or network rejection, or insufficient balance. Read the reason

Set a delivery webhook rather than polling; our delivery reports guide shows how. Then group failures by network. If failures cluster on one network, the cause is almost always step 2 or 3.

Step 2: Check the route class and sender ID approval

Nigerian networks separate transactional traffic from promotional traffic. OTPs must go on the transactional (corporate) route with a sender ID approved for that class on each network. Common failure patterns:

  • Approved on three networks, not the fourth. Approvals are per network, so an ID cleared on MTN and Airtel may still be pending on Glo or T2. Failures will cluster on that network.
  • Promotional sender ID used for OTPs. Promotional traffic is filtered against DND, so OTPs sent on a promotional ID silently fail for every user on DND.
  • Unregistered or generic ID. Generic names such as "OTP", "INFO" or "VERIFY" are typically rejected.

eSMS Africa handles registration with each network; the Nigeria sender ID page lists the steps. With Verify, a 403 sender_not_approved error tells you immediately that the ID is not cleared for the destination country.

Step 3: Remove promotional wording from the OTP

Networks inspect content on the transactional route. An OTP that reads like an advert can be filtered or reclassified. Avoid:

  • Offers or prices: "Get 10% off your first transfer"
  • Calls to action unrelated to the code: "Download our new app"
  • Multiple links, or shortened links from public shorteners

A safe OTP looks like this: "Your PayNa code is 482913. It expires in 5 min. Never share it." Brand, code, expiry, warning. Nothing else.

Step 4: Rule out DND confusion

DND (STOP to 2442, or partial DND by category) only filters promotional traffic, so it should not block OTPs on a transactional ID. If you see OTP failures only for users who say they are "on DND", that is a strong sign your OTP sender ID is classed as promotional on at least one network. Our DND guide explains the categories.

Step 5: Handle ported numbers and number format

Nigerian numbers can be ported between networks, so a prefix such as 0803 no longer guarantees the subscriber is on MTN. If you route or price by prefix in your own code, a ported number can be sent down the wrong path. Send every number in international format (+234 followed by the number without the leading zero) and let the provider route it.

Also check input handling. Users often type 0803..., 803..., 234803... or include spaces. Normalise to +234 before you call the API, and reject numbers that are the wrong length.

Step 6: Review your resend logic

Impatient users tap "resend" quickly, and each tap sends a new code that invalidates the previous one. The user then types the first code, which no longer works, and reports "OTP not delivering". Good practice:

  1. Wait 30 to 60 seconds before enabling the resend button, and show a countdown.
  2. Resend the same verification rather than starting a new one, so limits and attempts stay attached to it.
  3. Cap total sends per number. eSMS Verify allows up to four sends per verification (the original plus three resends) and returns 429 too_many_requests after five starts for one number in an hour.
  4. Use an Idempotency-Key header so a retried HTTP request does not send a second code.
// Start a verification with eSMS Verify (Node 18+)
const res = await fetch("https://sms.esmsafrica.io/v1/verify/start", {
  method: "POST",
  headers: {
    "Authorization": "Bearer " + process.env.ESMS_API_KEY,
    "Content-Type": "application/json",
    "Idempotency-Key": "login-" + sessionId
  },
  body: JSON.stringify({ to: "+2348031234567", app_id: "vera_your_app_id" })
});
const v = await res.json();
if (res.status === 429) {
  // more than 5 starts for this number in the last hour
} else if (res.status === 403 && v.code === "sender_not_approved") {
  // sender ID not approved for Nigeria
}
// later: POST /v1/verify/check { verification_id: v.verification_id, code }

Verify generates the code, stores it hashed, expires it and checks it, so you do not build that logic yourself. The full flow is in the OTP sending guide.

Step 7: Check for abuse before blaming the network

A sudden spike in OTP requests to numbers that never complete verification often means SMS pumping: bots requesting codes to premium or unused ranges. Pumped traffic can exhaust your balance and push genuine users into rate limits. Look at conversion (verified divided by started) per hour; a sharp drop with a rise in sends is the warning sign. Add device and IP limits on your side in addition to Verify's per-number limits.

Quick triage table

SymptomMost likely causeFix
Failures on one network onlySender ID not approved there, or classed as promotionalCheck approval status per network
Failures only for some users on every networkWrong number format, ported number handling, or handset issueNormalise numbers; check DLR reasons
Status "delivered" but user says no codeUser typed a different number, or an older codeShow the masked number on screen; resend the same verification
Sudden surge of sends, few verificationsSMS pumpingRate-limit by device and IP; block suspicious ranges

What to send support if you are still stuck

If the checklist does not find the cause, contact support with enough detail to trace the messages quickly: three or four message IDs that failed, the networks involved, the sender ID, the exact OTP text and the time window. With message IDs, the support team can follow each message from your request to the network response instead of guessing from a description.

Frequently asked questions

Why do OTPs reach MTN users but not Glo users?

Most often the sender ID is approved on MTN but still pending, or approved for a different traffic class, on Glo. Approvals are per network. Check failures grouped by network in your delivery reports.

Does sending STOP to 2442 block OTPs?

It should not, because DND filters promotional traffic and OTPs belong on the transactional route. If OTPs fail only for DND users, your sender ID is probably being treated as promotional.

How long should an OTP be valid?

Five minutes is a common default and is Verify's default. Shorter windows frustrate users when the network is slow; much longer windows give attackers more time.

Am I charged for failed Verify sends?

If Verify returns 502 otp_send_failed, the code could not be sent and you are not charged. Check current prices on the pricing page.

Sources

Need OTPs that reach users on every Nigerian network? Read more on OTP SMS in Nigeria and our fintech guide, then sign up for eSMS Africa and test the flow with a free test key.