smspostam

Guide · Delivery

How to read a delivery report.

11 min readUpdated April 2026

In short

  • A delivery report (DLR) is the carrier's confirmation of what happened to each message — per recipient, not aggregated.
  • Every message resolves to one of six outcomes: Sent, Delivered, Failed, DND-blocked, Expired, Rejected.
  • Most reports arrive within seconds of dispatch. Some take longer depending on the recipient's phone state.
  • Low delivery rates usually trace to one of four causes — our guide walks through each.

What is a delivery report

When you dispatch an SMS, the carrier makes several attempts to deliver it to the recipient's handset. The outcome of those attempts — delivered, failed, never-arrived — is reported back to us by the carrier as a delivery report, or DLR. We surface the outcome per recipient in your dashboard.

This is different from most SMS dashboards, which aggregate delivery into a percentage without showing you which specific numbers received the message and which didn't. Aggregated charts hide bad sends; per-recipient reports let you investigate.

Every possible status

A message can end up in one of six terminal states. Most land in the first two.

What this looks like in the dashboard

Delivery · April reminder

198 delivered · 2 failed
NumberNetworkStatusTimeReason
+234 803 •• 5907MTNDelivered09:04
+234 812 •• 0176AirtelDelivered09:04
+234 809 •• 7234GloDelivered09:04
+234 908 •• 11209mobileFailed09:04DND blocked
+234 705 •• 8321MTNDelivered09:05
+234 818 •• 4442MTNFailed09:05Unreachable

The delivery table shows one row per recipient — phone number, network, status, timestamp, and a failure reason if applicable. You can filter by status, by network, or by reason when something goes wrong at scale.

Common failure reasons

When a message fails, the carrier tells us why. We surface the reason on the delivery row. The common ones:

When reports arrive

Most delivery reports arrive within 5–15 seconds of dispatch. The carriers generate the DLR the moment the handset acknowledges receipt. If a handset is off or out of range, the carrier retries for a window — usually 24 hours — before marking the message as Expired.

In the dashboard, a recipient's status may sit in Sent for a few minutes before transitioning to Delivered. This is normal. If a status is still Sent 30 minutes later, it's likely on its way to Undelivered or Expired — we reconcile these automatically as the final state arrives.

Interpreting the report

A healthy delivery report for a well-maintained contact list looks like this:

If your numbers deviate meaningfully from this, something is wrong — either with the list, the routing, or the send itself. The next section walks through what to check.

What to do if delivery drops

Low delivery rates usually trace to one of four causes. Check them in order:

  1. Wrong route for the class. If you sent a marketing campaign to a list that's heavily DND-registered, a large chunk will show DND-blocked — that's the carrier enforcing, not a platform bug. Filter by status to confirm the failure reason.
  2. Stale contact data. Lists more than 18 months old tend to accumulate expired numbers (ported, disconnected, re-allocated). The Invalid number and Unreachable rates creep up. Export the failed rows, filter, and re-validate.
  3. Sender ID reputation. If your sender has been reported repeatedly for non-compliant traffic, carriers apply softer filtering — which shows up as Undelivered or Expired. This is rare on our platform because preflight blocks non-compliant sends before they reach the carrier.
  4. Transient carrier issue. Specific networks occasionally have brief outages. Filter by network in the delivery table — if all the failures are on one network and the others are fine, wait a few hours and try again.

After a failed send batch — a practical walkthrough

The most useful moment for a delivery report isn't after a clean send. It's after a batch where something obviously went wrong. Here's what we recommend, in order:

  1. Filter the table by the worst status first. If DND-blocked is high, your class is wrong. If Invalid is high, your list needs cleaning. If Undelivered is high and concentrated on one network, a carrier-side issue is more likely than a list issue.
  2. Export the failed rows. CSV export is per-campaign; you get a list of the affected numbers with their failure reasons attached. Keep it as an audit artifact.
  3. Fix at the source. Invalid numbers go back to the team that collected them. DND-blocked rows mean the class was wrong — adjust and resend. Don't keep blasting the same list with the same config.
  4. Resend only the recoverable subset. Build a new campaign from just the Undelivered and Carrier-error rows. Skip Expired (too late) and DND-blocked (they won't receive it at that class). You keep cost low and reach clean.
  5. Share the numbers internally. Finance needs the reconciled ledger, support needs the retry list, ops wants the raw outcomes. One export answers all three — send it rather than describing it.

Using reports for audit

Delivery reports are more than a deliverability signal — they're an audit artifact. If a customer claims they never received their order alert, you can look up their phone number in the report and see: delivered at 14:07, or failed with "DND blocked" at 14:06. That answer is often the difference between a refund and a resolved ticket.

For compliance reviews, the full per-recipient report is downloadable as CSV (feature in build) or visible directly in the dashboard. We retain delivery reports for at least 12 months from dispatch.

Delivery FAQ

Questions about reports.

See every delivery for yourself.

Create a workspace and send a small test campaign. Per-recipient outcomes land the same day.

  • Sender IDs approved in 24–72 hours
  • Fund from ₦1,000
  • No monthly minimums