Delivery, DLR and Refunds¶
After a message is accepted, the platform sends it through Infozillion, records the route used for delivery and checks the delivery result. Eligible failed direct messages are refunded. Campaign delivery and refunds are handled through the campaign process.
How delivery works¶
flowchart TB
Accepted[Message accepted and queued]
Send[Send through Infozillion]
Final{Final result available?}
Check[Check delivery status up to nine times]
Record[Update the recipient's message status]
Refund[Refund an eligible failed direct message]
Accepted --> Send --> Final
Final -- Yes --> Record
Final -- Not yet --> Check --> Record
Record -->|Eligible failure| Refund
Sending happens after the initial request is accepted. Some provider responses give a final result immediately. Other messages require later delivery-status checks. The platform saves the result and refunds eligible failed direct messages.
Preventing duplicate messages¶
Before sending a group of messages, the platform marks it as being sent. If the same queued work is received again:
- work already sent is ignored;
- work already being sent is not sent again automatically;
- new work is marked as being sent before the provider is called.
This prevents normal queue retries from sending the same SMS twice. If sending is interrupted after the provider is called, an operator must check the provider record before resending or refunding the message.
How provider responses affect status and charges¶
| Provider response | What the platform does |
|---|---|
Code 9000 from an MNO when delivery reports are enabled |
Marks the message SUBMITTED and starts delivery-status checks |
Code 9000 from an IPTSP |
Marks the message DELIVERED immediately |
Code 9000 for a promotional message when delivery reports are disabled |
Marks the message DELIVERED |
Code 9000 for an OTP or transactional message without delivery reports, with MNO code 1000 |
Marks the message DELIVERED |
Any other send rejection except 9099 |
Marks the message FAILED and refunds eligible direct-message costs |
Code 9099 |
Marks the message DELIVERED, keeps it charged and does not check or refund it |
Checking delivery status¶
For MNO messages that require a delivery report (DLR), the platform checks the status up to nine times on this schedule:
| Attempt | Target elapsed time |
|---|---|
| 1 | 3 minutes |
| 2 | 10 minutes |
| 3 | 30 minutes |
| 4 | 1 hour |
| 5 | 2 hours |
| 6 | 6 hours |
| 7 | 12 hours |
| 8 | 18 hours |
| 9 | 23 hours |
How delivery results are classified¶
When the provider returns a delivery report, the platform checks the result in this order:
- A number on the Do Not Disturb (DND) list becomes
REJECTEDwith reasonDND. - An invalid phone number becomes
REJECTEDwith reasonINVALID_MSISDN. - A number in the delivered list becomes
DELIVERED. - A number in the undelivered list becomes
FAILEDwith the provider's reason. - A missing or unknown number remains
SUBMITTEDand is checked again later.
If there is still no final result after the ninth check, the message becomes NOT_AVAILABLE. This means delivery could not be confirmed, and the message is not automatically refunded.
Refunds for direct messages¶
These refund rules apply to direct messages. Campaign refunds are handled as part of the campaign process.
A complete group fails¶
If a group is rejected because of a routing, configuration or sending error, the complete cost of that group is refunded. An OTP or transactional group contains one recipient, while a promotional group can contain several recipients.
One recipient fails¶
Each direct message with a final FAILED or REJECTED result receives its own eligible refund. A temporary balance-service problem does not remove the saved delivery result.
See Aggregator process flows, Client balance management, and the client-service Balance Operations API.