Rich Push Notifications (SDK) for D2C Retention in Customer.io

Customer.io partner logo

Table of Contents

Summarize this documentation using AI

This banner was added using fs-inject

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Overview

Rich push is one of the few push upgrades that reliably lifts retention when it’s implemented cleanly—because it makes the message feel like a mini product page instead of a generic reminder. If you’re running push from Customer.io and want richer creative (images, GIF-like previews, deep links, buttons) without breaking attribution or identity, the work mostly happens in your SDK layer—device registration, payload handling, and consistent event tracking. If you want a second set of eyes on the tracking + orchestration so you don’t end up with “pretty pushes” that don’t convert, book a strategy call.

In most retention programs, rich push matters most in high-intent moments (cart, browse, back-in-stock) where a product image and a clean deep link reduces friction and increases tap-to-purchase.

How It Works

Rich push is still a push notification at its core—Customer.io sends a payload to APNs (iOS) or FCM (Android). The “rich” part only shows up if your app is configured to download and render media (and handle action buttons) when the notification arrives. That means the SDK and native notification handlers do the heavy lifting, while Customer.io provides the orchestration and template variables.

  • Device identity is the foundation: the Customer.io Mobile SDK needs a stable person identifier (your user_id/email) and a registered device token. If either is missing or inconsistent, you’ll see rich pushes sent to the wrong device, duplicated across profiles, or dropped entirely.
  • Rich media requires app-side handlers: iOS typically renders images via a Notification Service Extension; Android uses “big picture” style notifications. Customer.io can include the media URL in the push payload, but your app must fetch and display it.
  • Deep links are where conversion happens: the payload should include a deep link (or route + params) that lands the user on the exact PDP/cart state. If you send everyone to the home screen, you’ll burn intent.
  • Tracking accuracy depends on your event model: Customer.io can track delivery/open at the push layer, but revenue attribution usually needs app-side events (e.g., push_opened, product_viewed, add_to_cart, checkout_started, order_completed) stitched to the same person.

D2C scenario: Someone abandons a cart with a single hero SKU. A rich push 45 minutes later shows the product image, size/color, and a “Checkout” button that deep links into the cart with the item preselected. You’ll only see the lift if (1) the device token is tied to the right profile, and (2) the deep link + purchase events are tracked consistently so you can suppress after purchase and measure holdout impact.

Step-by-Step Setup

The fastest path is to treat rich push as an SDK project first and a campaign project second. Get identity, device registration, and payload rendering correct in a staging app, then wire it into Customer.io messages and journeys.

  1. Install the Customer.io Mobile SDK for your platform
    • Use the official iOS/Android (or React Native/Flutter/Expo) SDK from Customer.io.
    • Confirm you can send and receive a basic push before adding rich media.
  2. Implement identity stitching (don’t skip this)
    • On login (or when you have a known customer identifier), call the SDK identify method with your stable identifier (e.g., customer_id).
    • On logout, reset/clear the SDK identity so shared devices don’t inherit the previous user’s pushes.
    • If you support guest checkout, decide how you’ll merge anonymous activity into the known profile when the user authenticates.
  3. Register push tokens and keep them current
    • Request push permission at a moment that matches intent (post-purchase, post-wishlist) rather than on first app open.
    • Send the APNs/FCM token to Customer.io via the SDK so the device is associated with the identified person.
    • Handle token refresh events; stale tokens are a silent killer for reactivation pushes.
  4. Add rich push rendering in the app
    • iOS: implement a Notification Service Extension to download the image from a URL in the payload and attach it to the notification.
    • Android: implement BigPictureStyle (or equivalent) to render the image when present.
    • Set timeouts and fallbacks—if the image fails to load, the push should still show cleanly.
  5. Standardize your push payload keys
    • Use consistent keys for deep_link, image_url, campaign_id, message_id, and source (e.g., cart_recovery).
    • Make the app resilient: missing keys shouldn’t crash the handler.
  6. Track the events that make push “operational”
    • Track push_received (optional), push_opened, and push_action_clicked with the message/campaign identifiers included.
    • Track downstream commerce events (product_viewed, add_to_cart, checkout_started, order_completed) on the same profile so you can suppress intelligently and measure incrementality.
  7. Build the Customer.io message using those keys
    • In Customer.io, create a push template that includes the media URL and deep link fields your app expects.
    • Use Liquid to insert product image URLs, titles, and prices from event data (cart/browse payloads) or from your catalog/object model if you maintain one.
  8. QA like an operator
    • Test: cold start vs warm start, poor network, image 404, token refresh, logged-out state, and multiple devices for the same user.
    • Verify that a purchase exits the journey and suppresses further cart pushes within minutes, not hours.

When Should You Use This Feature

Rich push is worth the engineering time when the creative itself reduces friction or increases confidence—usually when the user needs to recognize a product fast and land in the right place. If your push program is still struggling with identity stitching or basic deep links, fix that first; rich media won’t save broken plumbing.

  • Cart recovery: show the exact SKU image + “Checkout” action. This is one of the highest ROI uses because it shortens the path back to purchase.
  • Back-in-stock / low inventory: the product image plus a direct PDP link tends to outperform text-only alerts, especially for apparel/beauty where visual matters.
  • Post-purchase replenishment: for consumables, a rich push with the previously purchased product image and a “Reorder” deep link can lift repeat rate—especially when timed off expected depletion.
  • Browse abandonment for hero categories: if someone viewed the same product twice, a rich push can act like a lightweight retargeting ad—without paying Meta for it.

Operational Considerations

Rich push tends to break in practice when teams treat it as “just creative.” The real operational work is segmentation, data flow integrity, and making sure journeys don’t keep firing after the user converts.

  • Segmentation depends on device + permission state: build segments that include push-enabled users (token present, not opted out) so you don’t create false negatives in campaign reporting.
  • Multi-device reality: decide whether you want to notify all devices or only the most recent. If you don’t manage this, you’ll annoy customers who get duplicated pushes on iPad + iPhone.
  • Event payload size and freshness: cart payloads can get large. Keep push payloads lean (image URL, deep link, product name/price). Store the heavy cart state server-side and fetch it in-app if needed.
  • Orchestration with email/SMS: coordinate suppression rules so a customer doesn’t get rich push + SMS + email for the same cart within the same hour unless that’s intentional.
  • Attribution and holdouts: delivery/open metrics aren’t enough. Use conversion events and holdout tests to measure incremental lift, otherwise rich push becomes “busy work that looks good.”

Implementation Checklist

Before you scale rich push across journeys, lock the fundamentals. This checklist is the minimum bar that keeps your retention program from drifting into inconsistent identity and noisy messaging.

  • Customer.io Mobile SDK installed and sending basic pushes successfully
  • Identify call implemented on login with stable customer_id (and reset on logout)
  • APNs/FCM token registration wired to Customer.io, including token refresh handling
  • Rich rendering implemented (iOS service extension / Android big picture)
  • Standard payload keys agreed between marketing + engineering (image_url, deep_link, message_id)
  • push_opened and push_action_clicked tracked with campaign/message identifiers
  • Commerce events tracked consistently (add_to_cart, order_completed) for suppression + measurement
  • Journey exit conditions verified (purchase, cart updated, opted out)

Expert Implementation Tips

Once the basics work, the gains come from tightening the loop between payload quality, landing experience, and suppression. This is where rich push starts behaving like a performance channel instead of a branding channel.

  • Use action buttons strategically: “Checkout” and “View item” are usually enough. Too many actions reduce taps and complicate tracking.
  • Deep link into a resolved state: if the cart changed, handle it gracefully (show updated cart, not an error). This reduces rage quits and improves conversion.
  • Send the smallest payload that can win: include a single hero image (primary SKU) rather than trying to represent the entire cart.
  • Build a push-specific dedupe key: for cart recovery, derive a cart_hash and store it as an attribute/event property so you don’t send the same rich push repeatedly when the cart hasn’t changed.
  • Instrument “time-to-value”: track time from push_opened to checkout_started. Rich push usually improves this if your deep link is correct.

Common Mistakes to Avoid

Most issues aren’t about Customer.io—they’re about identity and payload handling. Fix these early and your team won’t spend weeks arguing about why push “doesn’t work.”

  • Sending pushes before identify happens: devices get associated with anonymous or wrong profiles, and you’ll never fully trust segmentation.
  • Not resetting identity on logout: shared devices end up receiving someone else’s cart recovery push. That’s a trust breaker.
  • Home-screen deep links: you’ll see opens without revenue because the user has to re-navigate to the product.
  • Missing suppression on purchase: customers buy and still get “Complete your purchase” 20 minutes later because purchase events arrive late or aren’t wired to exits.
  • Ignoring token refresh: reactivation campaigns underperform because a chunk of your audience has stale tokens after reinstall/OS updates.
  • Overweighting open rate: rich push can inflate opens; measure downstream conversion and incremental lift instead.

Summary

Rich push pays off when your SDK layer reliably stitches identity, registers devices, and renders media without breaking deep links. Treat it like tracking infrastructure first, creative second. If cart recovery and replenishment are meaningful revenue levers for you, rich push is usually worth prioritizing.

Implement Rich Push with Propel

If you’re already sending push from Customer.io, the fastest wins usually come from tightening identity stitching, standardizing payload keys, and making suppression airtight across push/email/SMS. When you want help pressure-testing the SDK instrumentation and turning it into reliable retention journeys (cart recovery, back-in-stock, replenishment), book a strategy call and we’ll map the implementation to the revenue moments that matter.

Contact us

Get in touch

Our friendly team is always here to chat.

Here’s what we’ll dig into:

Where your lifecycle flows are underperforming and the revenue you’re missing

How AI-driven personalisation can move the needle on retention and LTV

Quick wins your team can action this quarter

Whether Propel AI is the right fit for your brand, stage, and stack