1. Home
  2. SMS Delivery Reports
Developers

SMS Delivery Reports

A delivery report (DLR) is the mobile network's answer to the question 'did this message arrive?'. Every message sent through Ontech BulkSMS gets one. This page explains what the statuses mean, why a report can lag the send, and the four ways to collect them.

Published 2026-09-13 · Updated 2026-09-13 · By Ontech Solutions Limited

Definition.

A delivery report (DLR, delivery receipt) is the mobile network's status for one specific message: whether it was delivered to the handset, failed, or was rejected. It is matched to the message by the message ID the gateway returned when you sent it. Every message through Ontech BulkSMS gets one.

Why delivery reports matter

Without a report, "sent" only means "handed to the network". With one, you know per recipient whether the OTP arrived, whether the fee reminder reached the parent, whether a campaign's list is full of dead numbers. Reports are how you answer a customer who says they never got the message, and how you spot a network problem before your customers do.

The delivery states

StateMeaningWhat to do
deliveredThe network confirmed delivery to the handset.Done.
failedThe network could not deliver within its retry period — handset off, out of coverage, number inactive.Retry later, or use another channel; clean inactive numbers from your list.
rejectedThe network refused the message — for example an invalid or barred number, or content the network blocks.Check the number and the message; contact support if it recurs.
queuedAccepted by the platform and waiting in the outbox to be submitted to the carrier.Normal for a few seconds; longer during a large send.
submittedThe carrier accepted the message; no final report yet.Wait. Handsets that are off can take minutes to hours to resolve.
unknownNo record for that message ID (status endpoint only).Check the ID; it must belong to your account.

Over SMPP the same states arrive in the receipt's stat field using the protocol's codes — DELIVRD, UNDELIV, REJECTD, EXPIRED and so on.

Why reports lag the send

The report comes from the network, not from the gateway. The network tries to deliver; if the handset is off or unreachable it retries for a validity period before giving up and reporting failed. Some networks forward receipts promptly; others batch them. So a report can arrive seconds after the send or, for an unreachable phone, much later. Design integrations to treat submitted as "in progress", not as an error.

Four ways to get delivery reports

1. In the dashboard

Reports and Outbox show the state of every message with the recipient, sender ID, time and cost; usage reports summarise sent, delivered and failed counts and can be exported to CSV or Excel. Campaigns show delivered counts per variant.

2. Poll the status endpoint

curl "https://bulksms.ontech.co.zm/smsservice/status?api_key=YOUR_ACCESS_ID&message_id=MESSAGE_ID"
# → {"status":100,"message":"Success","message_id":"…","delivery_status":"delivered"}

Use the message_id from the HTTP API send response. Polling counts against the 60-requests-per-minute limit, so poll the messages that matter rather than everything.

3. Register a callback URL

Under Webhooks, give the platform an HTTPS address on your server. Delivery updates are posted to it as JSON and retried on failure (three attempts, with increasing delays), so your system stays in sync without polling. Store the state against the message ID you saved at send time.

4. On your SMPP bind

Receiver and transceiver sessions receive each receipt as a deliver_sm PDU with the message ID and state, as it happens. Transmitter-only binds do not; use a transceiver if you want receipts on the same session. See SMPP.

Using reports well

Reports on Ontech BulkSMS

Ontech BulkSMS has direct connections to MTN, Airtel and Zamtel and stores every receipt against the message; a large share of receipts arrive within seconds of delivery, though final states for unreachable handsets depend on each network's retry behaviour. The SMS API and SMS gateway guides explain where reports fit in the send path.

Frequently asked questions

What is a delivery report?

A delivery report, or DLR, is a status record returned by the mobile network for a specific message: whether it was delivered to the handset, failed, or was rejected. It is matched to the message by the message ID the gateway returned when you sent it.

What do the delivery statuses mean?

Delivered means the network confirmed handset delivery. Failed means the network could not deliver (for example the phone was unreachable for the retry period). Rejected means the network refused the message. Queued means it is still waiting to be submitted, and submitted means the carrier accepted it and a final report has not yet arrived.

Why is my delivery report delayed?

Reports come from the mobile network, not the gateway. If the handset is off or out of coverage the network retries for a period before reporting, so a final status can take minutes or, in rare cases, hours.

How do I receive delivery reports automatically?

Register a callback URL in your dashboard; the platform posts delivery updates to it with retries on failure. Over SMPP, receipts arrive on your receiver or transceiver bind as deliver_sm PDUs.

Ready to start sending?

Create a free account with trial credits, or talk to us about enterprise and reseller arrangements.