DLRs apply to all message sending methods — the InteractSMS API v2, the legacy v1 APIs, and messages sent directly through the Phonovation web interface. If a message is sent, a DLR can be generated.
When a message is delivered (or fails), the Phonovation gateway sends an HTTP POST to a URL you provide. This lets you track delivery status in real time for every message you send.
Setup
Provide your DLR callback URL to support@phonovation.com. The endpoint must:
- Accept
HTTP POST requests
- Support up to TLS 1.2
- Return a
200 OK response
DLR parameters
The POST body contains the following fields:
| Parameter | Example | Description |
|---|
SMS-Type | Notification | Always Notification |
SMS-NotifyId | 321354 | The notifyId you assigned to the recipient |
SMS-Success | True | True if delivered, False if not |
SMS-To | 353871111111 | Destination number (GSM format) |
SMS-From | 353877777777 | Sender ID as it appeared on the recipient’s handset |
SMS-Verify | 9db038748b3088971d913616c13e769b | MD5 hash for payload verification — see below |
SMS-TotalToSend | 1 | Total number of messages in the send |
SMS-TotalSent | 1 | Number successfully sent |
SMS-TotalFailed | 0 | Number that failed |
SMS-TimeStamp | 2024-01-10 14:17:44 | Delivery time (yyyy-MM-dd HH:mm:ss, UTC) |
Success logic
SMS-Success is True only when all messages were delivered:
TotalSent == TotalToSend AND TotalFailed == 0 → True
Otherwise → False
| TotalToSend | TotalSent | TotalFailed | SMS-Success |
|---|
| 2 | 2 | 0 | True |
| 2 | 1 | 1 | False |
DLR timing
The vast majority of DLRs — 90%+ — arrive within seconds to a few minutes of sending. However, DLRs are ultimately dependent on the downstream mobile network and the recipient’s device.
In some cases a DLR may be delayed by up to 48 hours due to:
- Network congestion or outages
- High traffic volumes
- The recipient’s device being powered off or out of coverage
Design your integration to handle late DLRs. Do not assume a message has failed simply because a DLR has not arrived quickly. If you require a hard timeout, 48 hours is a safe threshold after which you can treat a missing DLR as unconfirmed.
Example DLR payload
SMS-Type=Notification
SMS-NotifyId=
SMS-Success=True
SMS-To=353896073106
SMS-From=353870934726
SMS-Verify=5fb4926bd7e461eddc6dc629f472bab4
SMS-TotalToSend=1
SMS-TotalSent=1
SMS-TotalFailed=0
SMS-TimeStamp=2026-04-09 16:03:16
URL-encode the POST body before sending. Some field values may contain characters that break unencoded requests.
Verifying the payload
The SMS-Verify field is an MD5 hash you can use to confirm the DLR genuinely came from Phonovation:
MD5(SMS-NotifyId + SMS-Success + YourPassword)
const crypto = require('crypto');
function verifyDlr({ notifyId, success, password, verify }) {
const expected = crypto
.createHash('md5')
.update(notifyId + success + password)
.digest('hex');
return expected === verify;
}
Tracking recipients with notifyId
Set a notifyId per recipient when sending and Phonovation will echo it back in every DLR for that recipient via SMS-NotifyId. The same identifier also appears in webhooks, making it the single thread that ties your outbound send, webhook confirmation, DLR, and inbound replies together.
See notifyId for full details, use cases, and end-to-end flow examples.