Push metrics and message statuses

How it works

While we track the status of each individual message as it goes through Customer.io, push notifications can be trickier to track than other message channels for two main reasons:

  1. A person can have multiple devices, and you can send a message to all of a person’s devices. When you send to All Devices, we aggregate metrics across all of a person’s devices because we (and you!) monitor engagement at a personal level, not a device level.
  2. Push notifications go through an intermediary—the push provider (APNS or FCM). We report statuses between us and your push provider; devices using our SDK report back delivered and opened metrics back to Customer.io—but there can be a slight delay in reporting these metrics. And Customers who have an earlier version of your app that doesn’t have our SDK installed may not report these statuses back at all.
flowchart LR a(trigger push
notification) a-->b{Is push finished
sending to all devices} b-.->|No|c(Push Attempted) b-->|Yes|i{Is at least one
send successful?} i-->|Yes|d(Push Sent) i-.->|No, liquid
failure|j(Push Failed) i-.->|No, bounced
tokens|k(Push Bounced) d-->e{Is device online?} e-->|Yes|z(Push Delivered) z-->g{Does person
tap push?}-->|yes|h(Push Opened) e-.->|No|x(Wait for device
to come online)-.->z

Do the All Devices and Last Used Device settings affect metrics?

When you send a message, you can determine whether you send it to all of a person’s devices, their last-used device, or a custom device token. This setting affects how we track metrics for your push notifications. In general, we recommend that you use Last Device when you send a message so you don’t overwhelm your audience with messages across all their possible devices.

Set your push audience to all devices or their last used device
Set your push audience to all devices or their last used device

The Last Device and Custom Device Token settings work like our traditional messages—each person gets a single message, so it’s easier to understand what each metric represents.

When you send to All Devices, we display an aggregate metric for the person rather than each device they own, because we (and you!) monitor engagement at a personal level, not a device level.

For example, when you use Last Device, a sent message is a single push notification sent to the push provider. When you use All Devices, we don’t count a message as being sent until we’ve sent a message to the push provider for each of a person’s devices.

Push notification statuses

Because you can send to all devices, there’s a slight difference as to when we count a metric. For some statuses, like Sent, we count a status when it has occurred for all of a person’s devices. For others, like Opened, we count it when it has occurred for any of a person’s devices.

Do we record a status when it's true for all of a person's devices or any of their devices?
StatusAll DevicesAny DeviceDescription
AttemptedWe're in the process of sending messages.
SentWe've sent messages to the push provider.
DeliveredYour app reported back that it received the message.
OpenedYour app reported back that the message was opened.
ConvertedThe person met your campaign conversion goal.
FailedWe were unable to send messages to the push provider. This is typically due to a liquidA syntax that supports variables, letting you personalize messages for your audience. For example, if you want to reference a person’s first name, you might use the variable {{customer.first_name}}. error. See Failed for more information.


We show messages as Attempted until we’ve either succeeded or failed to send messages for all of a person’s targeted devices.

This status means that your push notification has been created and we’ve tried to send it via the appropriate service—Apple’s Push Notification Service (APNS) or Firebase Cloud Messaging (FCM)—which then would send to your customer’s device. If there are errors with our attempt, we’ll try to send it again up to ten times.


We show a status of Sent when we’ve sent messages for all of a person’s devices to the delivery provider and filtered out suppressed devices.

This status does not indicate that a message has been successfully delivered. It only means that the push payload was valid and we were able to pass it to the push notification service for valid push tokens and filter out suppressed devices.

Note that the total number of “Sends” in your campaign metrics includes people who whose messages bounced and or were suppressed. We do this to help calculate your total audience size when you send a message: sends minus suppressed and bounced messages equals total recipients.


If you use our SDK, we report a message Delivered when the push provider delivers it to any of a person’s devices and our SDK reports back a delivered metric.


We report a message as Opened when a person taps on a push notification sent to any of their devices. This metric is reported back to Customer.io when a person opens your app (or already has the app open) and taps on a push notification.

 Opens and clicks are the same thing in push notifications

Unlike other channels, where people have to open a message before they can click a link, etc, people can read a notification right when it’s delivered—they don’t have to open it. So, in push notifications, we track Opened in the same way that most other messages track Clicks.


If none of the attempts to send a push notification to the end-user’s device(s) are successful, then we mark the message as Failed. You’ll be able to see the failure reasons on the Delivery page.

Here’s a list of failure reasons you might see, what they mean, and how to fix them.

Failure ReasonDescription
Liquid error: variable is missingThe recipient didn’t have a value for a variable you used in your message. For example, if your message used {{customer.email}} and the customer didn’t have an email attribute, the message will fail. Check that you’re using the correct variable name and either set a fallback or that the recipient has a value for that variable.
Customer doesn’t existA rare error indicating that the value you’ve used for the recipient doesn’t exist. Make sure you’re using the correct customer ID or email for a message.
Customer is unsubscribedThis error indicates that the customer has opted out of receiving messages. Verify the customer’s subscription status to make sure they can receive messages.
Credentials not foundYour push credentials failed or were otherwise empty. Check that you’ve provided your push certificate and that it hasn’t expired.


This is treated the same as emails; when a user meets your campaign conversion goal, the message nearest the conversion is marked as Converted.

Why are messages sent but not delivered?

We mark a message sent when we send it to the push provider (APNS or FCM). We consider a message delivered when the push provider delivers it to the device and our SDK reports back a delivered metric.

Because the SDK reports delivery, a message might show sent but not yet show delivered when

  • The recipient’s device is offline.
  • The recipient doesn’t have a version of your app containing the Customer.io SDK.

In the second case, the push notification very well have made it to your recipient’s device, but we won’t know about it because the app doesn’t report back delivered metrics.

flowchart LR a{Is unsubscribed true?} a-....->|yes|c(push not sent) a-->|no|b(push sent) b(push sent) b-->d{is person opted-into
notifications?} d-..->|no|h(push not delivered) d-->|yes|f{Does the app include
the Customer.io SDK?} f-.->|no|i(push delivered but delivery
not reported to Customer.io) f-->|yes|j(push delivered and marked
delivered in Customer.io)

If you migrated a push audience from another provider, your audience may have versions of your app that don’t include our SDK. These devices can still receive notifications (assuming you use the same certificates in Customer.io and your previous service provider), but they won’t report back delivered metrics unless you gather this data from a third party (like Segment or Rudderstack) and report it back to Customer.io.

Set campaign goals to measure engagement

Unlike email, recipients can read and react to your push notification without “opening” it.

While you can measure engagement with Opened metrics—where a person taps on a push notification to go to a link—you may find more success setting a campaign goal to measure whether or not a message helps you achieve a specific business goal.

Ideally, your messages have a call to action, a result you want your audience to achieve. You want your audience to finish setting up their profile in your app, complete a purchase, sign up for a class, and so on.

If you capture these actions as goals, you’ll be able to understand how many people engage with your message and achieve your goal—which is a much better metric of success than raw sent and delivered metrics.

We track metrics at the message and journeyA person or data object’s path through your campaign. level. Setting a campaign goal as an event that you want your audience to achieve—a completed purchase, visiting a specific page, etc—can help you understand how your push notifications contribute to your business goals, even when it’s difficult to track the status of individual push notifications.

Campaign Overview data

On the Overview page, you can see how your push notifications perform in your campaign.


You can track delivery using our SDKs, or by adding custom code to your app to report delivery metrics back to Customer.io when a customer receives a push.


To track opened metrics, you need to either integrate with our SDKs or add some code to your app to detect when opens occur and then send “open” events to Customer.io as documented in our Technical Integration Guide. Note, you need to include the CIO-Delivery-ID and CIO-Delivery-Token parameters from the push when sending open events to Customer.io.

Delivery Logs data


When filtering deliveries, you can choose to only see push notifications. In this view, you’ll be able to see:

  • The name of the push notification and a link to the message
  • Which customer triggered that message, and how many of their devices we attempted to send to
  • When the push notification was attempted
  • The push notification status (sent, failed, attempted, etc.)
  • Conversion information where applicable

You’ll also have the option to retry sending the push notification if its status is ‘failed’:

Copied to clipboard!
Is this page helpful?
Chat with AI