Delivery reports
SMS delivery reports for every text
Every text you send has a status and a timeline, from the moment it's queued to the network's final word on it. Filter the history, export it, or have each change posted to your own system.
What is an SMS delivery report?
An SMS delivery report is the network's confirmation of what happened to a text: delivered to the handset, or not. CaptiFi Connect records it on each message with a timeline of every status change, shows it in message history with filters and CSV export, and posts message.delivered or message.failed to your webhook as soon as it arrives.
How delivery reports work in CaptiFi Connect
Each outbound text goes through a set of statuses, and every change is written to its timeline with the time it happened. Open any message in history and you'll see the whole story: when it was queued, when it left, when the network confirmed delivery, or the reason it didn't get there.
A delivery report that turns up late, or turns up twice, can't move a text back to an earlier status, so what you see is the furthest point the text reached.
Delivered means the network reported that the text reached the phone. Sent on its own means we've handed it over and are waiting for the network's report.
Find and export what you need
Message history holds every text in and out of your account:
- Filter by direction and status, search by number or by words in the text, and open one campaign's texts from its View texts link on the Campaigns page.
- Open any message to see its timeline.
- Export what you have filtered as a CSV, for a spreadsheet or your records.
- See texts sent, the delivery rate and replies for the last 7, 30 or 90 days on the home page, with a daily chart.
- Follow a campaign's progress and delivery counts in its row on the Campaigns page.
Using the reports day to day
The texts that didn't arrive are the ones worth a look. Filter message history by undelivered once a campaign has finished and you have the numbers worth checking: a number that's no longer in use, a typo from the original sign-up form, that sort of thing. Fix them in your contacts or take them off the list, and the next send doesn't pay for texts that were never going to arrive.
For one-off texts, the timeline is the answer to 'did they get it?'. If a customer says a reminder never came, open the message and you'll see whether it was delivered and when, which is usually enough to settle it.
What's charged and what's refunded
One credit covers one SMS part. Numbers refused before sending (landlines, other countries and opted-out numbers) are never charged. A text that fails before it leaves us is refunded automatically, and so is a scheduled text you cancel.
A text the network tried to deliver and couldn't is marked undelivered and isn't refunded, because it went out and the network did the work. Your billing ledger lists every charge and refund line by line, so any balance can be traced back to the texts behind it.
For developers
Subscribe a webhook to message.sent, message.delivered and message.failed. The message.failed event covers both kinds of failure, a text that never left (status failed, refunded) and one the network could not deliver (status undelivered, not refunded), and the payload carries the status and an error code so you can tell them apart.
Put your own client_ref on POST /api/v1/messages and it comes back on every event, so you can match reports to orders or bookings without storing our IDs. GET /api/v1/messages/{id} returns one message with its timeline. GET /api/v1/messages lists them and takes direction, status, q (a search), campaign_id, batch_id, client_ref, since and until as filters; the date filters, since and until, are only in the API. GET /api/v1/messages/export gives you the CSV, filtered by direction, status, q, campaign_id, batch_id, since and until.
What each status means
| Status | What it means | Charged? |
|---|---|---|
| scheduled | Waiting for its send time | Taken when scheduled, refunded if you cancel |
| queued | Accepted and waiting to go out | Yes |
| sending | Being handed over for sending | Yes |
| sent | Has left CaptiFi Connect for the network | Yes |
| delivered | The network reported it reached the phone | Yes |
| undelivered | The network tried and couldn't deliver it | Yes, because it did go out |
| failed | It never left, for example after a sending error | No, refunded in full |
| cancelled | Cancelled before it went, by you or because the person opted out | No, refunded in full |
| received | A reply someone sent you | Free |
Questions people ask
What's the difference between sent and delivered?
Sent means the text has left us for the network. Delivered means the network has reported that it reached the phone. A text can sit at sent for a while if the phone is off; it moves on once the network reports back.
Why does a text show as undelivered?
The network tried to deliver it, couldn't, and told us so. We only know what the network reports, and the text's timeline shows whatever reason came back.
Are undelivered texts refunded?
No. An undelivered text did go out, so it is charged. Texts that never left us are refunded, and so are scheduled texts you cancel.
Can I export delivery reports?
Yes. Filter message history and export it as a CSV, or call GET /api/v1/messages/export, which can filter by direction, status, search text, campaign, batch and date.
Do I get delivery reports through the API?
Yes, as webhooks: message.sent, message.delivered and message.failed, each signed with HMAC SHA-256 and retried if your endpoint does not answer within 8 seconds.
Can I see delivery reports for one campaign?
Yes. The campaign's row on the Campaigns page shows progress and delivery counts, and its View texts link opens message history filtered to that campaign, if you want the text-by-text detail or a CSV of it.
Do test keys produce delivery reports?
Yes. A test send is marked sent, then delivered a few seconds later, and fires the message.sent and message.delivered webhooks, without texting anyone or using credits.
Send your first text this week
Set up your account and contacts now; we check every new account before it can send.