Summarize this documentation using AI
Overview
If you’re running push through Customer.io, the real work isn’t the message—it’s the SDK plumbing that makes sure the right device is tied to the right shopper at the right moment. If you want a second set of eyes on your tracking plan (especially identity stitching and event naming), book a strategy call and we’ll pressure-test it like we would for a live retention program.
In most D2C retention programs, push wins when it’s event-driven and precise: cart recovery within minutes, back-in-stock nudges, replenishment reminders, and winback to people who’ve gone quiet. That precision comes from clean device registration, consistent identify behavior, and a tight event schema coming from your app.
How It Works
Push in Customer.io is basically a chain: the app registers a device token, Customer.io associates that token to a person profile, and your campaigns target people based on attributes/events while Customer.io routes the message to the correct device(s). When this chain breaks, you get the classic symptoms: pushes firing to the wrong user after logout/login, duplicates across devices, or “sent” metrics that never translate into sessions.
- Device registration: Your mobile app SDK captures the APNs (iOS) or FCM (Android) token and sends it to Customer.io so the platform knows where to deliver pushes.
- Identity stitching via
identify: When a shopper logs in (or when you can confidently map them), the SDK shouldidentifythem with your stable customer identifier (not an email that can change). That’s what ties the device token to the correct person profile. - Event tracking: Your app sends behavioral events (e.g.,
product_viewed,add_to_cart,checkout_started,order_completed) with useful properties. Customer.io uses these events to trigger campaigns and segment audiences. - Campaign orchestration: Journeys evaluate entry criteria and filters, then send push to the devices on the profile. If you support multiple devices per person, Customer.io can send to all eligible devices—so your frequency and suppression logic matters.
Real D2C scenario: A shopper adds a moisturizer to cart in your iOS app, gets distracted, and closes the app. If your SDK fires add_to_cart with cart_value and items, and the device is correctly identified, you can trigger a push 30 minutes later that deep-links back to checkout. If they purchase on desktop later, you can suppress the push by tracking order_completed (server-side or app-side) and using it as an exit condition.
Step-by-Step Setup
Before you touch campaigns, get the SDK and identity layer right. Push is unforgiving: one bad logout flow or one sloppy identifier choice and you’ll spend weeks debugging “random” attribution and complaints.
- Pick your canonical customer identifier.
Use a stable internal ID (e.g.,customer_id). Avoid using email as the primary key if it can change or if you support guest checkout that later converts to an account. - Install the Customer.io mobile SDK (iOS/Android or your framework).
Implement the base SDK first (init/config), then add push support for your platform. Do this in a feature branch so you can test token registration without shipping campaigns. - Request push permission at the right moment.
In practice, asking on first app open underperforms. Tie it to intent: after they favorite an item, after first purchase, or when they opt into “shipping updates.” Your SDK setup should handle the permission prompt and token refresh flow. - Register device tokens with Customer.io.
Ensure your app forwards APNs/FCM tokens to Customer.io and handles token rotation. Token rotation is a common silent failure—everything works in QA, then quietly degrades over weeks. - Implement
identifyon login (and on app start when a session exists).
Callidentifyas soon as you have a verified user session. If a user is already logged in when the app opens, identify immediately so events and tokens land on the correct profile. - Handle logout explicitly.
On logout, clear/reset identity in the SDK (per your implementation pattern) so the next user on the device doesn’t inherit the previous user’s device token association. This is where most “wrong recipient” push incidents come from. - Track a retention-grade event schema from the app.
At minimum:product_viewed,add_to_cart,checkout_started,order_completed,search_performed,category_viewed. Include properties likesku,variant_id,price,quantity,cart_value,currency, anddeep_link. - Validate in Customer.io before building journeys.
Confirm: device tokens appear on the person profile, events arrive with expected properties, and anonymous-to-known behavior merges the way you expect (especially if you allow browsing before login).
When Should You Use This Feature
Push is best when speed and context matter—cases where email is too slow, SMS is too expensive, and you want to drive an immediate app session. If your app is a meaningful revenue channel, push becomes one of your highest-leverage retention tools once tracking is clean.
- Cart recovery (app-native): Trigger from
add_to_cartorcheckout_started, suppress onorder_completed, and deep-link back to the exact cart state. - Browse abandonment: If someone views 3+ PDPs in a category but doesn’t add to cart, send a push featuring the last viewed product or a best-seller in that category.
- Replenishment / repeat purchase: Use
order_completedplus SKU-level consumption windows to remind at day 21/30/45 depending on product type. - Back-in-stock / price drop: Trigger when inventory changes (often server-side), but only works if the app-side identity and device tokens are reliably tied to the right person.
- Winback for app lapsed users: Target people who haven’t opened the app in 30+ days but have purchased in the last 180 days—push can bring them back without burning email deliverability.
Operational Considerations
Once push is “working,” the operational reality is segmentation and data flow. The teams that get strong results treat push like a real channel with its own hygiene: device eligibility, recency, frequency caps, and cross-channel suppression.
- Segment on device eligibility, not just people.
Build audiences that require a valid push token (and ideally a recent app open). Otherwise you’ll keep “sending” to dead tokens and misread performance. - Decide how you’ll treat multi-device users.
If Customer.io sends to all devices, you need guardrails: send-time optimization, frequency limits, and logic to avoid duplicate nudges across phone + tablet. - Identity stitching is the retention linchpin.
If you support guest sessions, decide whether you track anonymous events and later merge, or you only start tracking after login. In practice, anonymous merging tends to break when logout/login flows aren’t disciplined. - Event source of truth matters.
For purchases, app-side events can miss edge cases (web checkout, payment failures). Many brands trackorder_completedserver-side and use app events for intent signals. Your suppression logic should follow the most reliable source. - Orchestration across channels.
If push fires first for cart recovery, suppress email/SMS when push converts (or at least when the cart resolves). Customer.io Journeys can do this cleanly if your conversion events are consistent.
Implementation Checklist
Use this as your “go/no-go” before you ship push journeys. It’s faster to slow down here than to debug mis-targeted pushes after you’ve scaled volume.
- Customer.io SDK installed and initialized in production builds
- Push permission prompt implemented with an intentional ask moment
- APNs/FCM token registration confirmed; token refresh handled
identifycalled on login and on app open when session exists- Logout clears/resets identity to prevent cross-user token leakage
- Core retention events tracked with consistent naming and properties
- Deep links tested from push to PDP/cart/checkout
- Segments exist for: “push eligible,” “recent app open,” “recent purchaser,” “cart active”
- Suppression/exit conditions defined using your most reliable purchase signal
- Frequency limits set (global + campaign-specific)
Expert Implementation Tips
These are the small choices that usually separate “push that annoys people” from “push that prints incremental revenue.” Most of them are SDK and data-model decisions, not copy tweaks.
- Track an explicit
app_opened(or equivalent) event.
It gives you a clean recency filter for “send push only to people active in last 14/30 days,” which protects opt-out rates. - Send SKU-level context in events.
For cart and browse flows, includesku/variant_idand adeep_link. Without it, your push becomes generic and your journey logic turns into spaghetti. - Use a two-step identity approach if you have guests.
Track anonymously first, then callidentifyat account creation/login and merge. But only do this if your logout/reset behavior is bulletproof. - Design push with channel sequencing in mind.
For cart abandonment: push at 30–60 minutes, email at 4–6 hours, SMS only for high-intent/high-AOV segments. The SDK events are what make that sequencing accurate.
Common Mistakes to Avoid
Most push “problems” look like creative issues, but they’re usually identity and event integrity issues. Fix the foundation and your campaigns get easier overnight.
- Using email as the primary identifier.
It works until someone changes their email, checks out as a guest, or you introduce multi-account edge cases. Use a stable internal ID and store email as an attribute. - Not clearing identity on logout.
This leads to the worst-case scenario: pushes meant for one person landing on another person’s phone. - Tracking
order_completedonly in-app.
If customers often buy on web, your suppression logic will fail and you’ll keep nudging people who already purchased. - No “push eligible” segmentation.
Sending to everyone inflates send counts, hides deliverability/token issues, and makes performance look worse than it is. - Over-triggering from noisy events.
Ifproduct_viewedfires too often or without dedupe rules, you’ll spam engaged shoppers. Add thresholds (e.g., 3 views, category depth) and cooldowns.
Summary
If your SDK identity and events are clean, push becomes a high-speed retention lever for cart recovery, repeat purchase, and winback. If they’re not, you’ll fight mis-targeting and noisy triggers no matter how good your copy is. Get device registration, identify, and suppression events right first—then scale journeys.
Implement Push with Propel
If you already run messaging in Customer.io, the fastest path is usually tightening the SDK tracking plan (identity, token lifecycle, and event schema) and then building 2–3 push journeys that share the same suppression rules across email/SMS. If you want us to review your current implementation and map it to revenue-driving retention flows, book a strategy call—we’ll focus on what will actually move repeat rate and recovery, not just “getting push working.”