SMS Delivery Reports: Track and Fix Failed Messages

SMS Delivery Reports: Track and Fix Failed Messages

SMS delivery report showing messages on a phone marked DELIVERED, SUBMITTED and NOT_DELIVERED

You sent 10,000 messages and your dashboard says they went out. How many reached a phone, which failures are worth sending again, and which numbers cost you money on every campaign?

An SMS delivery report answers the first question. To answer the other two, you need to read the statuses Arkesel returns, know what to do next for each one, understand how Nigeria’s Do-Not-Disturb service affects your costs, and, if you build on the API, pull statuses into your own systems.

What does an SMS delivery report tell you?

An SMS delivery report (often shortened to DLR) is the status record for a single message. It tells you what happened to that message on its way to one phone number, so you can see exactly which numbers worked and which did not.

A delivery report is about delivery, not attention. A delivered status tells you the message reached the recipient’s phone. It does not tell you they opened or read it, so never treat your delivery rate as a response rate.

SMS delivery report status codes are not universal

The SMPP v3.4 specification, the Short Message Peer-to-Peer protocol standard, describes a typical delivery receipt with example states DELIVRD, EXPIRED, DELETED, UNDELIV, ACCEPTD, UNKNOWN and REJECTD. Three details from that specification matter when you read your own reports:

  • The format is vendor specific. The specification presents its receipt as an example, so each provider can show its own labels on top of it.
  • There is no FAILED state in that table. UNKNOWN is described as a message in an invalid state, not a message that is still pending.
  • Error codes belong to the network. The receipt’s error field may hold a network-specific or SMSC error code, and the specification does not define those codes. An SMSC is the short message service centre that handles messages inside a network. A code means whatever that network or provider says it means.

So when you compare providers, compare what each status leads you to do, not only what it is called.

What do Arkesel’s delivery statuses mean, and what should you do with each?

Arkesel’s API documentation lists delivery status values such as DELIVERED, SUBMITTED, PROHIBITED, QUEUED, NOT_DELIVERED and EXPIRED. Treat these as examples, not a complete list, and build your handling so an unfamiliar value goes to a review queue instead of breaking your process.

The reference does not define each value, so ask Arkesel support for the exact reason behind any single message.

StatusWhat you can rely onYour next step
DELIVEREDDelivery confirmed for that numberCount it as delivered. Nothing to fix.
SUBMITTEDNo delivery confirmation yetWait, then look the message up again before you resend. Resending early can put the same message on a phone twice.
QUEUEDNo delivery confirmation yetTreat it like SUBMITTED: wait and check again.
EXPIREDNo delivery confirmation. In SMPP terms, an expired message was not delivered before its validity period ran outResend later only if the message is still useful. For a one-time code, send a fresh code when the customer asks for one.
NOT_DELIVEREDNo delivery confirmationCheck the number’s format. If the same number fails again on a later campaign, stop sending to it.
PROHIBITEDNo delivery confirmationHold the resend. Review the sender ID, route and wording, and ask Arkesel support for the reason before sending again.
Any other valueNothing you can act on yetLog it, leave it out of automatic retries, and raise it with support.
Table of Arkesel SMS delivery report statuses and the next step for each: DELIVERED, SUBMITTED, QUEUED, EXPIRED, NOT_DELIVERED, PROHIBITED and unknown values

Want to see these statuses on your own traffic? See how real-time delivery tracking and status reporting work across Ghana, Nigeria, South Africa and Tanzania on the Arkesel SMS Platform.

Should you resend an SMS that was not delivered?

Sometimes. The right call depends on two things: whether the message still has an open status, and whether it is still worth receiving. Start with the next step the status table gives for each status, then work through these checks after every campaign.

  1. Ask whether the message still matters. A reminder for an offer that has ended, or a delivery update for a parcel already collected, does more harm than good when it arrives late. Resend only what is still relevant.
  2. Look for a pattern before you retry a block. When many messages in one send come back PROHIBITED, check what they share: the sender ID, the route and the wording. Our guide to avoiding spam in SMS marketing covers the wording patterns worth reviewing.
  3. Give a single failure one later retry. One NOT_DELIVERED result on a number that has worked before earns one more attempt on a later send, not a loop of automatic resends. Every resend is a new message, and every message is charged.
  4. Honour opt-outs before the next send. Remove anyone who has asked, through your website, forms or customer service, to stop receiving messages. Our guide to bulk SMS strategies for Ghana SMEs covers list management practices that keep your lists clean.

If you run automated SMS campaigns, build these checks into the workflow so your own system flags a failing number before a customer complaint does.

Why are my SMS messages not delivered in Nigeria?

For Nigerian numbers, Do-Not-Disturb (DND) is one of the first things to check. According to the Nigerian Communications Commission’s consumer portal, a subscriber can text STOP to 2442 to activate full DND, which stops that line from receiving unsolicited messages.

DND is the subscriber’s choice about what reaches their phone. What it changes for you depends on the route your message takes.

  • Promotional messages: on Arkesel’s promotional route, sends to DND-blocked Nigerian numbers are still charged, even though they never reach the phone. A list full of DND numbers is a cost problem as well as a delivery problem. Check Arkesel’s pricing page for current rates.
  • Transactional and OTP messages: these use the DND route, which bypasses the restriction. That route exists for verification codes and transactional alerts. Never use it for promotions.

Arkesel’s API also has a use_case field that marks a message as promotional or transactional. According to the API documentation, it keeps a sender ID registered for promotional messages from sending transactional ones, and the other way round, and it applies only to Nigerian traffic. Our guide to the difference between transactional and promotional bulk SMS explains which messages belong on which route.

Before you build a suppression rule around a single status, ask Arkesel support how DND-blocked sends appear on your reports. Guessing wrong means deleting numbers that were never blocked.

What affects SMS delivery on Ghana’s networks?

In Ghana, your subscribers sit on MTN, Telecel and AirtelTigo. Arkesel maintains direct mobile network connections in Ghana to all three, and reaches its other markets through onward routing.

Route detail matters when you choose who sends for you. Ask every provider how it reaches each network on your list and which delivery statuses it returns. Our comparison of bulk SMS providers in Ghana and our guide to choosing an SMS gateway for Africa cover the other questions worth asking, and our guide to sending SMS with your company name walks through sender ID setup.

If PROHIBITED statuses pile up on a send to Ghanaian numbers, Arkesel support can tell you why before you resend.

How do you calculate your SMS delivery rate?

Your SMS delivery rate is the share of sent messages that reached a phone:

Delivery rate = (DELIVERED messages ÷ messages sent) × 100

Three habits make that number worth tracking:

  • Keep open statuses out of the failures. Until SUBMITTED and QUEUED messages settle, report them on their own line so an early read does not undercount the campaign.
  • Baseline by message type. Promotional campaigns and transactional alerts reach different people for different reasons, so keep a separate baseline for each and compare every campaign with its own type. Split by network too, where your list lets you.
  • Track cost per delivered message. Your bill can differ from your message count, because a long message is split into segments and each segment is charged. DND-blocked numbers on a promotional send in Nigeria still add to the cost.

A sudden drop between two campaigns of the same type is your signal to compare their status breakdowns. The status that grew tells you where to look.

How do you get SMS delivery status through an API?

You have two options: have statuses pushed to your system, or look them up when you need them.

Comparison of two ways to get SMS delivery status through the Arkesel API: a delivery webhook to a callback_url and an on-demand lookup by message UUID

Option 1: an SMS delivery webhook

When you send through Arkesel’s SMS API with a callback_url, Arkesel calls that URL with two query parameters, sms_id and status. Use this checklist to set it up:

  1. Map every message to its purpose. Make sure your system can match each sms_id to the customer, order or campaign it belongs to.
  2. Expose an HTTPS endpoint that reads sms_id and status from the query string.
  3. Exempt that endpoint from authentication. Arkesel’s API reference tells developers to exempt the callback URL from any pre-authorisation or authentication to avoid delivery notification failure.
  4. Check what arrives. Because the endpoint is open, match each incoming sms_id against your own send records and ignore any you did not send.
  5. Make the handler safe to repeat. Processing the same status twice does no harm, and an unrecognised status goes to a review queue instead of an error.
  6. Test with a small live send. Sandbox requests are not billed and are not forwarded to the mobile network providers, so a sandbox test checks your request code but cannot return a real delivery status.

Option 2: look up status on demand

Arkesel’s API also lets you look up delivery status on demand: one message by its UUID, or a batch of 1 to 1000 UUIDs per request through the message-reports endpoint. Lookups suit three jobs: rechecking SUBMITTED and QUEUED messages before a resend, reconciling a campaign before you report on it, and checking what you missed while your endpoint was unavailable.

Field names, request formats and code samples live in the SMS API reference. For an overview of the API and a walkthrough of your first request, see Arkesel’s SMS API, our tutorial on the Arkesel SMS API, and the Arkesel Developer APIs portal.

Frequently asked questions

What is an SMS delivery report?

It is the status record for one message sent to one number. It tells you whether that message was delivered, is still waiting for confirmation, or did not arrive, so you can act on each number individually.

What does EXPIRED mean on an SMS delivery report?

In the SMPP specification, EXPIRED describes a message whose validity period ran out before it was delivered. Resend it only if the message is still useful, and for a one-time code, send a fresh code instead.

Should I resend a message that was not delivered?

Wait out SUBMITTED and QUEUED first, then resend only messages that are still relevant. Give a single failure one later retry, and stop sending to numbers that fail across separate campaigns.

Do SMS delivery reports confirm the recipient read the message?

No. A delivered status tells you the message reached the phone. It says nothing about whether the recipient opened or read it.

How do I check if my SMS was delivered?

Check the delivery status for that message on your Arkesel dashboard, or, if you use the API, through your delivery webhook or a status lookup by the message’s UUID. A DELIVERED status confirms delivery. Any other status means you do not have that confirmation yet.

Start tracking every message

Your SMS delivery report tells you which messages arrived, which ones to resend and which numbers to stop paying for. For the wider picture, see our complete SMS marketing guide for Ghana.

Sign up for Arkesel and track every message from send to delivery.

Related Articles

Scroll to Top