An SMS delivery report (DLR) tells you the final state of a message: DELIVRD (reached the handset), UNDELIV (failed), EXPIRED (validity period ran out), REJECTD (refused by the network), DELETED, UNKNOWN, or ACCEPTD and ENROUTE as intermediate states. The status comes with an error code that explains failures, but error codes are specific to each operator or platform.
How a DLR reaches you
Over SMPP, you request a receipt by setting the registered_delivery field in submit_sm (value 1 asks for a receipt on success and failure, value 2 only on failure). The supplier answers with submit_sm_resp and a message ID, which only means the message was accepted, not delivered. Later the receipt arrives as a deliver_sm with the esm_class marking it as a delivery receipt. Over HTTP APIs, the same information is pushed to your webhook. The two interfaces are compared in SMPP vs HTTP API for A2P SMS.
The SMPP 3.4 specification suggests a text format for the receipt, which most platforms follow:
id:1234567890 sub:001 dlvrd:001 submit date:2610201015 done date:2610201015 stat:DELIVRD err:000 text:Your code is
The id matches the message ID from submit_sm_resp. Dates are usually YYMMDDhhmm. Many platforms also send the same data in the receipted_message_id and message_state optional parameters.
Status values
| Status | Meaning | Final? |
|---|---|---|
| DELIVRD | Delivered to the handset | Yes |
| UNDELIV | Could not be delivered (invalid number, absent subscriber, barred, blocked) | Yes |
| EXPIRED | Validity period ended before delivery, often because the phone was off or out of coverage | Yes |
| REJECTD | Rejected by the network or an SMS firewall, often for sender ID or content reasons | Yes |
| DELETED | Deleted from the SMSC before delivery | Yes |
| UNKNOWN | Final state not known or not reported | Treat as failed until proven otherwise |
| ACCEPTD | Accepted by the SMSC on behalf of the subscriber, no handset confirmation | Intermediate |
| ENROUTE | In transit, delivery still being attempted | Intermediate |
Some platforms send intermediate receipts and then a final one. Your system should update the message state each time and treat only the final state as the result.
Error codes
The err field carries a three-digit code, usually 000 on success. On failures, its meaning depends on the operator and on each platform in the chain, so there is no universal list. Common categories behind the codes are: unknown or unallocated subscriber, absent subscriber, handset memory full, call barred, network failure, and blocked by spam filter or firewall. Ask each supplier for its error code table and map it to your own categories. Do not confuse DLR error codes with SMPP command_status codes returned at submission: those are covered in common SMPP error codes.
Reading DLRs correctly
- Missing DLRs are not failures by default. Some destinations or routes do not return receipts. Know which ones before you build alerts.
- Timing matters. An EXPIRED status can arrive hours or days later, depending on the validity period you set. A short validity period suits OTP, where a late code is useless.
- Concatenated messages may produce one receipt per part. Count a long message as delivered only when all parts are. See long concatenated SMS.
- Too good to be true is a signal. A route with 100% DELIVRD and instant receipts may be sending fake DLRs.
Using DLRs to manage routes
Aggregate statuses per country, per network and per route each hour. A rise in UNDELIV or REJECTD on one network often means a firewall change or a sender ID problem; a rise in EXPIRED can mean congestion. This is the base of delivery monitoring, explained in SMS delivery rate and latency. When a route degrades, a backup route lets you move traffic quickly.
VoIPMatcher sources A2P SMS routes with delivery reports from its carriers. Request an SMS route and tell us which destinations need full DLR support.
Frequently asked questions
What does DLR mean in SMS?
DLR stands for delivery report, also called delivery receipt. It is the status message sent back after a network tries to deliver an SMS, telling the sender whether the message reached the handset, failed, expired or was rejected. A2P platforms pass it back to the sender over SMPP or to a webhook.
How do I turn on SMS delivery reports on my phone?
On most Android messaging apps, delivery reports are an option in the app's SMS settings, often under advanced settings. iPhone does not offer delivery reports for regular SMS. Phone delivery reports are separate from the A2P DLRs that businesses receive from their SMS provider, which are requested when each message is submitted.
What is an SMSC DLR?
An SMSC DLR is the delivery receipt generated by the operator's Short Message Service Centre after it tries to deliver the message. It is the only report that reflects what happened on the network. Receipts created by intermediate platforms without operator confirmation are not real SMSC DLRs and can hide undelivered traffic.
Why do I get no delivery report for some SMS?
Some destinations, networks and routes do not return receipts at all, and some only return them for failures. A missing DLR is therefore not proof that a message failed. Find out from your supplier which destinations have full DLR support, report missing receipts separately from failures, and confirm with handset tests.
How long does a delivery report take?
On good routes a DELIVRD report usually follows within seconds of delivery. Failure statuses can take much longer: an EXPIRED report only arrives when the validity period ends, which can be hours or days later. Reports that always arrive within a second of submission, even for failures, suggest they are generated rather than real.
Need a route?
Send the destination, route type and target rate. We reply with what we can deliver.