Summarize this documentation using AI
Overview
If you’re running Customer.io push alongside another provider (Braze, OneSignal, Firebase-only flows, a legacy vendor, etc.), the hard part isn’t sending—it’s making sure the right device stays attached to the right person across app installs, logins, and token refreshes. If you want a second set of eyes on your tracking and identity plan before you scale push, book a strategy call and we’ll pressure-test it like we would for a real retention program.
In most D2C retention programs, teams add a second push provider during a migration or because different product areas “own” different messaging. That’s fine—until cart recovery push hits the wrong device, opt-outs don’t propagate, or duplicate tokens inflate sends and ruin your holdouts.
How It Works
When you use multiple push providers, you’re really managing two things in parallel: (1) device-level identifiers (push tokens) and (2) person-level identity (who this device belongs to right now). Customer.io’s SDKs sit on the app side, so the quality of your push orchestration depends on how consistently you identify users and register/unregister devices.
- Each provider has its own device token lifecycle. APNs/FCM tokens rotate. App reinstalls create new device records. If you don’t update tokens promptly, you’ll see silent failures and “ghost devices” that keep receiving.
- Identity stitching is the real source of truth. The moment a shopper logs in (or you otherwise know who they are), you need to attach the device to the correct Customer.io person. If you delay identification, you’ll end up with anonymous devices that never qualify for your cart recovery or winback segments.
- Multi-provider means you need a routing rule. Decide which provider sends which class of message (e.g., transactional vs. marketing, iOS vs. Android, high-priority vs. low-priority) and enforce it with attributes/events so Customer.io campaigns don’t compete with the other vendor.
- Opt-out and permission state must be explicit. OS-level push permission, in-app marketing preference, and vendor-level subscription state are different. If you don’t track them separately, you’ll either over-send or under-send.
Real D2C scenario: You run abandoned cart push via Customer.io but keep shipping updates in a legacy provider. A shopper adds items to cart on mobile web, then opens the app and logs in. If your app doesn’t call identify quickly and doesn’t register the latest token to Customer.io, the cart recovery push either won’t send (no device on file) or sends to an old anonymous profile that never converts.
Step-by-Step Setup
The cleanest multi-provider setup starts with a decision: Customer.io needs to know (a) who the user is and (b) which device token is active. Once that’s stable, you can layer routing rules so you don’t double-message across providers.
- Pick a canonical person identifier and stick to it.
Use your internal customer ID (not email) as the primary identifier in the SDK. Email changes; IDs don’t. - Implement
identifyimmediately after authentication.
Call the Customer.io SDKidentify(userId)as soon as the app knows the logged-in user. Don’t wait for profile screens or post-checkout. - Track push permission state as an attribute.
On iOS, capture authorization status (authorized/denied/provisional) and update a person attribute likepush_permission_status. On Android, track whether notifications are enabled at the OS/app level where possible. - Register the Customer.io push token/device as soon as it’s available.
When APNs/FCM returns a token (and any time it refreshes), pass it to the Customer.io SDK so the device record stays current. - Decide your multi-provider routing and encode it in data.
Add a person/device attribute likeprimary_push_provider(e.g.,ciovslegacy) or a boolean likecio_push_enabled. Your campaigns should filter on this so Customer.io only sends where it’s supposed to. - Handle logout explicitly.
On logout, reset the Customer.io identity (SDK reset/clear) so the next user on a shared device doesn’t inherit the previous user’s push eligibility. - Send retention-critical events from the app with stable naming.
At minimum:Product Viewed,Added to Cart,Checkout Started,Order Completed. Include identifiers likecart_id,sku,value, andcurrencyso you can segment and personalize without guessing. - Validate device counts and token freshness before scaling.
Spot-check a handful of real users: confirm they have exactly one active device per platform (unless they truly have multiple), and that the latest token timestamp updates after reinstall/token refresh.
When Should You Use This Feature
Multiple push providers is rarely a “nice-to-have.” It’s usually a migration reality or a workaround for product constraints. The key is to use it intentionally—so retention flows stay reliable and measurement doesn’t turn into a blame game.
- Provider migration without downtime. Keep legacy push running while you ramp Customer.io campaigns, then progressively route more segments to Customer.io.
- Separate transactional vs. marketing push. For example: order/shipping pushes remain in a transactional system, while cart recovery and replenishment live in Customer.io.
- Different app surfaces or brands. If you operate multiple storefront apps under one umbrella, you may need different providers temporarily while you unify infrastructure.
- Experimentation and holdouts. If you’re running incrementality tests, you may route control groups through “no-send” logic in one provider while the other handles baseline comms.
Operational Considerations
In practice, multi-provider push tends to break at the seams: identity, segmentation, and orchestration. If you treat push tokens like a set-and-forget integration, your cart recovery and winback performance will look “random” because the audience definition is unstable.
- Segmentation needs provider-aware filters. Build segments that explicitly include/exclude devices based on
primary_push_provider, permission state, platform, and “last seen” recency. Otherwise you’ll overcount reachable users and under-deliver. - Data flow must be deterministic. If web events create anonymous profiles and app events identify later, make sure your identity stitching rules merge activity correctly. Cart abandonment is especially sensitive because it’s time-based.
- Orchestration requires a single source of truth for send eligibility. Decide where “marketing push opted in” lives. If the legacy provider is the source but Customer.io is sending, sync that preference into Customer.io as an attribute and gate sends on it.
- Frequency capping across providers is not automatic. If both systems can send marketing push, you need an external rule (attribute-based gating, shared event logging, or a suppression service) or you’ll double-tap customers during promos.
- Measurement gets noisy fast. If one provider logs deliveries differently, align on what “sent,” “delivered,” and “opened” mean before you compare performance or run holdouts.
Implementation Checklist
Before you turn on high-volume retention pushes (cart recovery, replenishment, winback), lock down the basics below so you don’t spend the next month debugging “missing” conversions that are really identity/device issues.
- Canonical user ID defined and used consistently in SDK
identify identifyfires immediately after login and after account creation- Logout/reset behavior implemented to prevent cross-user device leakage
- Push permission status tracked as a person attribute and kept up to date
- APNs/FCM token registration updates on first install and token refresh
- Provider routing attribute(s) implemented (e.g.,
primary_push_provider) - Core retention events tracked from app with consistent naming and payloads
- Segments in Customer.io include provider + permission gating
- QA flow validates: one real user, reinstall, token refresh, login/logout, and a test push
Expert Implementation Tips
The difference between “it works” and “it performs” is usually a handful of operational decisions that keep your reachable audience clean and your sends predictable.
- Stamp a “device_last_registered_at” timestamp. Use it to suppress stale devices (e.g., older than 60–90 days) so you don’t waste sends and skew deliverability metrics.
- Gate cart recovery on both intent and reachability. For example:
Added to Cartwithin 2 hours andpush_permission_status = authorizedandprimary_push_provider = cio. This avoids “phantom” entrants who can’t actually receive. - Use a single event to log “push_sent” across providers. Even if provider B sends the message, emit a shared analytics event so you can frequency cap and attribute outcomes consistently.
- Plan for multi-device customers. High-LTV shoppers often have both iPhone + iPad. Decide whether you want to send to all devices or only the most recent, then enforce it with a “most_recent_device” attribute or last-seen logic.
Common Mistakes to Avoid
Most issues aren’t SDK bugs—they’re small inconsistencies that compound once you’re sending at scale.
- Identifying by email. This creates messy merges when emails change or when guest checkout later becomes an account.
- Delaying
identifyuntil after checkout. Your highest-intent moments (cart/checkout) happen before you’ve stitched the device, so your recovery flows miss. - Not resetting on logout. Shared devices (or even just account switching) will cause cross-user targeting and support tickets.
- Assuming OS permission equals marketing opt-in. Customers may allow notifications for shipping updates but not promos—track both.
- No routing rule between providers. Two systems sending “abandoned cart” is the fastest way to train customers to ignore push.
- Ignoring token refresh/reinstall behavior. This quietly kills deliverability over time and makes your reachable audience look bigger than it is.
Summary
If you’re running multiple push providers, treat it like an identity and device-governance project—not a messaging project. Get identify, token registration, and permission tracking airtight, then enforce provider routing in segmentation so retention campaigns stay predictable.
Implement Multiple Push Providers with Propel
If you’re juggling multiple push providers while building retention in Customer.io, the fastest path is usually a clean routing spec + a tracking QA plan that catches identity and device drift early. If you want help pressure-testing your SDK instrumentation and segmentation gates before you scale cart recovery or winback, book a strategy call and we’ll map the exact events/attributes you need and the failure modes to monitor.
In most retention programs, this is the difference between “push is a channel we have” and “push reliably drives incremental repeat purchase.”