smspostam

Delivery Reports

Know exactly what happened to every message.

Per-number outcome, timestamped, with the actual failure reason when things go wrong. No aggregated charts that smooth over a bad send.

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

Campaign summary

At a glance, and in detail.

Every campaign rolls up to a one-line summary alongside the per-number table. You can see the headline numbers and drill into any individual outcome.

April reminder · campaign_8412

Parent meeting notice

Dispatched 09:04 · completed 09:06

Sent

200

Delivered

198

Failed

2

Total cost

₦500.00

99% delivered · 2 failed (1 × DND blocked, 1 × unreachable)

Statuses

Every outcome, plainly named.

There are six outcomes a message can end up in. We don't hide any of them behind a single 'delivered' count.

Sent

The message was accepted by the carrier. Awaiting the handset confirmation.

Delivered

The handset acknowledged receipt. This is the final, good state.

Failed

The carrier rejected the message. A failure reason is attached (see below).

Undelivered

Accepted by the carrier but never confirmed by the handset.

Expired

Waited too long for delivery (phone off, out of range). Not charged.

DND blocked

Destination is on the DND register and the message class wasn't compliant.

Failure reasons

When a message doesn't arrive, you'll see why.

Common failure codes we surface on the delivery row, with what each one actually means in practice.

Failure codeWhat it means
UnreachablePhone off or out of coverage for the retry window.
Invalid numberNumber isn't a valid Nigerian mobile number.
DND blockedDestination is DND-registered and the class isn't allowed there.
Carrier errorTemporary carrier-side issue. Auto-retried where possible.
RejectedContent or sender was rejected by the carrier before dispatch.

After the send

What a real operator would do next.

A delivery report isn't the end of a campaign — it's the start of the next one. These are the four moves we see operators make routinely, each one supported in-product.

Remove invalid numbers

Any row marked 'invalid number' is a list-quality problem. Export them, clean them out of the source system, and they won't eat budget next time.

Review DND-blocked recipients

If DND-blocked rows show up in a marketing campaign, the class is wrong. Switch to a transactional class — if the content allows — or rebuild the audience on opted-in numbers.

Resend only to recoverable failures

Unreachable and temporary carrier errors are worth retrying. Expired rows usually aren't. The resend flow rebuilds a new campaign from just the recoverable subset — no recharging your whole list.

Export and share delivery proof

Finance wants a reconciled ledger. Legal may want audit evidence. Ops wants a retry list. One CSV export, downloadable from every campaign page, answers all three.

See every delivery for yourself.

Sign up and send a small test campaign. You'll see the per-number table, failure reasons and timestamps the same day.

  • Per-number delivery outcome
  • Real failure reasons attached
  • Downloadable for audit