Docs/Guides/SMS Delivery Report (DLR) Status Codes Explained
Reference6 min readUpdated 2025-12-10

SMS Delivery Report (DLR) Status Codes Explained

A complete reference guide for SMS delivery receipt status codes (DLR), error codes, and what each code means for your message delivery success rate.

What is a Delivery Report (DLR)?

A Delivery Report (DLR) is a notification sent from the carrier network back to the sender confirming the final delivery status of an SMS message. BulkSMSRates provides real-time DLRs via HTTP webhook (for REST API users) and SMPP deliver_sm PDUs (for SMPP users). DLRs tell you whether your message was delivered, failed, expired, or is still pending — at the individual message level.

DLR Status Codes — Primary

These are the top-level delivery status values returned in the DLR:
StatusMeaningAction Required
DELIVRDDelivered to handsetNone — success
UNDELIVUndeliverable (permanent failure)Check error code; number may be invalid
EXPIREDMessage expired before deliveryRetry with longer validity period
DELETEDMessage deleted from queueCheck account status / spam filters
UNKNOWNUnknown delivery statusWait; may resolve or try again
REJECTDRejected by network/SMSCCheck sender ID and content policy
ENROUTEMessage in transit (intermediate)Wait for final DLR
ACCEPTDAccepted but not yet deliveredWait for final DLR

DLR Error Codes (err field)

The err field in the DLR contains a network error code when delivery fails. These are GSM error codes defined by 3GPP.
Error CodeDescriptionLikely Cause
000No error (success)Message delivered successfully
001Unknown subscriberNumber not registered on network
007Unknown ErrorNetwork issue; retry later
011Teleservice not provisionedSMS not enabled on this number
021Facility not supportedNetwork does not support feature
027Absent subscriber (no signal)Phone off or out of coverage
028Absent subscriber (roaming)Phone not registered for roaming
029Unknown subscriber — MSRNRouting database issue
031Subscriber busy for MT SMSPhone cannot receive SMS (busy)
032SMS barredSMS service barred on this number
033Message waiting list fullToo many messages queued for this number
040System failureCarrier system error; retry later
099Content rejectedMessage blocked by spam filter
160Number not in DLT (India)India DLT non-compliant number/template
999TimeoutMessage expired; retry or check number

Webhook DLR Format (REST API)

When you register a webhook URL, we POST the following JSON to your endpoint within seconds of delivery:
POST https://your-server.com/dlr-webhook
Content-Type: application/json

{
  "message_id": "msg_550e8400e29b41d4",
  "to": "+447700900000",
  "status": "DELIVRD",
  "error_code": "000",
  "submitted_at": "2025-02-14T10:30:00Z",
  "delivered_at": "2025-02-14T10:30:02Z",
  "network": "EE UK",
  "segments": 1,
  "cost": 0.0300,
  "currency": "GBP"
}

// Your server must respond with HTTP 200
// We retry 3 times (1min, 5min, 15min) on failure

SMPP DLR Format

For SMPP connections, DLRs arrive as deliver_sm PDUs. The short_message body follows this format: id:MSGID sub:001 dlvrd:001 submit date:2502141030 done date:2502141030 stat:DELIVRD err:000 text:Hello World Parse using regex: /id:([\S]+).*stat:(\w+).*err:(\d+)/
// Node.js DLR parser example
function parseDlr(shortMessage) {
  const patterns = {
    id:       /id:([\S]+)/i,
    stat:     /stat:(\w+)/i,
    err:      /err:(\d+)/i,
    done:     /done date:(\d+)/i,
    dlvrd:    /dlvrd:(\d+)/i,
  };
  return Object.fromEntries(
    Object.entries(patterns).map(([k, r]) => [k, r.exec(shortMessage)?.[1]])
  );
}

Interpreting Delivery Rates

Understanding your delivery rate analytics: • > 95% DELIVRD: Excellent — healthy number list • 90–95% DELIVRD: Good — some invalid numbers; clean your list • 80–90% DELIVRD: Fair — significant invalid/inactive numbers; run HLR lookup • < 80% DELIVRD: Poor — likely sending to old or purchased lists; do not continue without data cleaning High UNDELIV rates typically indicate invalid numbers. High EXPIRED rates suggest the destination network has low coverage or the handset was off for an extended period.

Related Guides

Ready to get started?

Start sending SMS in minutes. No monthly fees. Free test credits.

Create Free Account →