Delivery Reports
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| Number | Network | Status | Time | Reason |
|---|---|---|---|---|
| +234 803 •• 5907 | MTN | Delivered | 09:04 | — |
| +234 812 •• 0176 | Airtel | Delivered | 09:04 | — |
| +234 809 •• 7234 | Glo | Delivered | 09:04 | — |
| +234 908 •• 1120 | 9mobile | Failed | 09:04 | DND blocked |
| +234 705 •• 8321 | MTN | Delivered | 09:05 | — |
| +234 818 •• 4442 | MTN | Failed | 09:05 | Unreachable |
Campaign summary
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
There are six outcomes a message can end up in. We don't hide any of them behind a single 'delivered' count.
The message was accepted by the carrier. Awaiting the handset confirmation.
The handset acknowledged receipt. This is the final, good state.
The carrier rejected the message. A failure reason is attached (see below).
Accepted by the carrier but never confirmed by the handset.
Waited too long for delivery (phone off, out of range). Not charged.
Destination is on the DND register and the message class wasn't compliant.
Failure reasons
Common failure codes we surface on the delivery row, with what each one actually means in practice.
| Failure code | What it means |
|---|---|
| Unreachable | Phone off or out of coverage for the retry window. |
| Invalid number | Number isn't a valid Nigerian mobile number. |
| DND blocked | Destination is DND-registered and the class isn't allowed there. |
| Carrier error | Temporary carrier-side issue. Auto-retried where possible. |
| Rejected | Content or sender was rejected by the carrier before dispatch. |
After the send
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.
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.
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.
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.
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.