SMS: metrics
We record metrics for every SMS/MMS message you send, so you can measure the success of your automations and segment your audience based on the messages you've sent them in the past.
SMS/MMS metrics
We record the same metrics for every SMS message, no matter which provider delivers it:
| Metric | Where it comes from |
|---|---|
sent | We sent the message to your provider. |
delivered | Your provider confirmed delivery to the recipient’s device. |
bounced | Your provider reported that the message couldn’t be delivered. The failure_message contains your provider’s error details. |
clicked | The recipient tapped a tracked link in your message. |
converted | The recipient performed your conversion goal. |
dropped | We didn’t send the message. This happens when the recipient opted out or when their number is flagged as unsendable. Dropped messages don’t reach your provider. |
SMS doesn’t support open tracking—there’s no opened metric.
These metrics flow to reporting webhooks and data warehouse exports: webhook events use the sms_ prefix and exports use the sms delivery type. Payloads don’t say which provider delivered the message.
Delivery outcomes and failure reasons come from your provider, so the failure_message on a bounced or failed delivery uses your provider’s error language. We receive these delivery reports automatically for every provider—we attach a delivery-report callback to each message we send, so there’s no delivery webhook to configure on your provider’s side.
SMS/MMS delivery logs
When you send an SMS or MMS message, you can view the delivery logs for that message in the automation’s sent messages page.
Here you can correct and retry failed messages. Message failures are sometimes related to problems with liquid in your message (missing attributes, etc).
In delivery logs, you’ll see:
- The recipient
- The name of the message
- The status of the message (sent or failed)
- Date and time sent
- Conversions after receiving the message
Create a segment based on SMS/MMS messages
As with an email, you can create a segment for SMS’s that have been sent, converted, etc. When you create a segment, select Message Data > SMS as the condition you want to match. You can then use the names of your messages to filter your audience by who has received, or not received, messages. You might do this to send follow-up messages to engage with people depending on how they responded to a previous message. One SMS condition covers your messages from every provider.
You can also create segments based on messages that bounced, failed to send, or were suppressed. See SMS error-code conditions.
SMS segments for error codes
When an SMS message bounces, fails to send, or is suppressed, your SMS provider usually reports an error code that explains why. You can narrow an SMS condition to specific codes. For example, you might create a segment of people whose numbers bounced multiple times with a temporary carrier error and exclude them from your SMS messages. Learn more about unsendable numbers.
- In your segment, add an SMS condition.
- Select the message you want to check for error codes; if you want to check any SMS message, select any SMS message.
- Set the behavior to has ever bounced, has ever failed to send, or has ever been suppressed.
- Choose how to match the error code:
- with any error code (the default): the condition matches every message with that behavior, whatever the code.
- with error code or without error code: the code is, or isn’t, one of the codes you enter. To match more than one code, separate them with commas, like
30003, 30006. You can enter up to 50 codes. - with error code containing or with error code not containing: the code includes, or doesn’t include, the text you enter.
- (Optional) To match people who got the error more than once, click Refine. Then set at least a number of times, and choose ever or within the last a number of days. For example, “at least 5 times within the last 30 days.”
Error codes come from your SMS provider, not from Customer.io, so their format depends on the provider that sent the message:
| Provider | Bounced | Failed to send |
|---|---|---|
| Twilio | A numeric error code, like 30003 | A numeric error code |
| Vonage | A numeric error code, like 1170 | Usually a numeric error code |
| Infobip | An error name, like EC_UNKNOWN_SUBSCRIBER | A status name, like REJECTED_DND |
| Sinch | A numeric delivery-report code | An API status, like INVALID_ARGUMENT |
| Bird | An error code, like invalid_destination | An API error name |
For numeric codes, use with error code rather than with error code containing. Containing matches any part of the code, so 300 matches 63003 as well as 30003.
Customer.io started recording SMS error codes on October 5, 2026. Messages that bounced, failed, or were suppressed before then don’t have an error code, so they don’t match a condition that names one. See conditions that only match activity after a certain date.