Summarize this documentation using AI
Overview
If your cart recovery or repeat-purchase journeys feel “random,” it’s usually not the copy or the offer—it’s tracking. This guide translates Customer.io troubleshooting into the checks that actually protect revenue, and what to fix app-side (web or mobile) when events don’t land, identities don’t stitch, or devices don’t map cleanly. If you want a second set of eyes on your implementation before you scale spend or promos, book a strategy call.
In most retention programs, the “bug” is a subtle mismatch: you tracked Checkout Started on web, checkout_started on iOS, and your Journey listens to only one. The result is a leaky funnel and under-triggered automations.
How It Works
Customer.io automations only behave as well as the identity and event stream you feed them. When you’re using SDKs (web/mobile), you’re responsible for three things: correctly identifying the person, sending consistent events with the right properties, and keeping device/user identity stitched over time.
- Identify drives the profile you message. Your SDK should call an
identify-style method as soon as you have a stable user identifier (login, account created, or email captured). If you delay this, events may attach to an anonymous profile and never qualify for your paid customer segments. - Events drive entry into Journeys and segmentation. If an event name or property differs from what your segment/journey expects, the customer never enters—no matter how many times they actually performed the action.
- Identity stitching is where retention tracking tends to break. A common D2C pattern: a shopper browses and adds to cart on mobile web, then completes purchase in-app after installing. If you don’t merge anonymous activity into the identified profile, your “abandoned cart” flow may still fire after purchase, or your post-purchase upsell never triggers because the purchase event landed on a different profile.
- Device mapping matters for push. Push delivery depends on clean device registration tied to the same person profile that your segments target. If the device token sits on an old/duplicate profile, your push looks “sent” but never reaches the device you care about.
Step-by-Step Setup
When something looks off, don’t start by rewriting the Journey. Start by proving the data path end-to-end: app emits → Customer.io receives → profile updates → segment qualifies → journey triggers → message sends.
- Pick one failing use case and define the expected trigger.
Example: “Cart abandonment push should trigger whencart_updatedhappens and there’s noorder_completedwithin 2 hours.” Write down the exact event names and properties your Journey expects. - Verify the SDK is initialized once, in the right place.
Initialization issues show up as intermittent missing events—especially on cold starts, deep links, and background/foreground transitions in mobile apps. - Confirm
identifyruns at the right moment.
Do it immediately after login/account creation (or after email capture if that’s your identity strategy). Make sure the identifier you send is stable and unique (not a session ID, not a device ID). - Check whether you’re sending events before identify.
If you must track pre-login behavior (product views, add-to-cart), you need a plan to merge anonymous activity into the identified profile. Otherwise, your “browse abandonment” and “cart abandonment” audiences fragment. - Inspect event names and property casing across platforms.
Align web/iOS/Android naming to one canonical schema. If your Journey listens forCheckout Startedbut the app sendscheckout_started, you’ll under-trigger forever. - Validate required properties used in segmentation.
If your segment checkscart_value > 50but the SDK sendscartValueor a string"50", the segment won’t match. This is the fastest way to “break” a high-intent flow without realizing it. - Confirm purchase events land on the same profile as cart events.
In practice, this is where D2C teams get burned: the purchase is tracked server-side or via a different client identity, so the cart profile never gets the purchase and keeps receiving recovery messages. - For push: verify device registration and profile association.
Make sure the device token updates on reinstall and that logout/login updates the device’s linked profile. Otherwise, “reactivation push” quietly misses your best customers. - Run a controlled test with a single known user.
Use one internal test account, perform: browse → add to cart → start checkout → purchase. Then confirm the activity timeline on the same profile shows all steps in order.
When Should You Use This Feature
Troubleshooting isn’t a one-off task—it’s the operating system for retention when your app and site evolve weekly. The right time to do this is whenever a revenue-critical automation depends on SDK events or identity stitching.
- Cart recovery that feels under-delivered. If your abandoned cart audience size looks too small relative to site/app analytics, you likely have event schema drift or anonymous/identified fragmentation.
- Post-purchase cross-sell that fires late or not at all. Often caused by purchase events landing on a different profile than the browsing/cart profile.
- Reactivation pushes with low “delivered” rates. Usually a device/profile mismatch, stale tokens, or users existing as duplicates.
- Multi-platform journeys (web → app). Any time a customer can start on one platform and finish on another, identity stitching becomes the difference between a clean experience and “why did I get this message?”
Operational Considerations
Most teams don’t fail because they can’t send events—they fail because the data becomes impossible to operate as the program scales. Treat your tracking like a product: version it, document it, and enforce consistency.
- Segmentation depends on stable event schemas. Lock canonical event names and property keys. If you change them, update every segment and Journey trigger that references them.
- Data flow ownership needs to be explicit. Decide whether purchases are tracked client-side, server-side, or both. Dual-tracking without deduplication creates double conversions and broken frequency controls.
- Identity strategy should match your business model. If you rely on guest checkout, you still need a stitching plan (email capture, hashed identifiers, or a merge process) so cart and purchase live together.
- Orchestration realities: delays and exits rely on accurate timestamps. If events arrive late (queueing, offline mobile), your “wait 2 hours then send” logic can misfire. Build exits based on purchase events and consider grace windows for late-arriving data.
- Duplicates are not a cosmetic issue. Duplicate profiles split LTV, suppressions, and device tokens. You’ll see it as: some customers get too many messages, others get none.
Implementation Checklist
Before you blame creative or offers, run this checklist. It’s the fastest way to turn “Journeys are buggy” into a concrete fix list for engineering.
- SDK initializes once per app/session and in the correct lifecycle location
identifyis called immediately after a stable identifier is available- Anonymous pre-login events have a defined merge/stitching approach
- Event names are identical across web/iOS/Android (including casing and spacing)
- Event properties used for segments are present, correctly typed, and consistently named
- Purchase and refund events land on the same profile as browse/cart events
- Device tokens update on reinstall and are associated with the active logged-in user
- At least one end-to-end test user shows a clean, single-profile timeline: view → cart → checkout → purchase
Expert Implementation Tips
These are the small operator moves that prevent weeks of “why is this segment tiny?” debugging later.
- Create a tracking contract. Maintain a single source of truth (sheet or README) listing canonical events/properties and which platform emits them. Engineering changes should update the contract first.
- Instrument a “debug mode” in non-prod builds. Log outgoing Customer.io calls locally (event name + payload) so QA can spot schema drift before it hits production.
- Use one “golden path” scenario for every release. For a D2C brand, that’s typically: product_viewed → added_to_cart → checkout_started → order_completed. If any step breaks, you’ll see it immediately in Customer.io activity.
- Design exits defensively. Cart recovery should always exit on purchase, even if the cart event is missing or delayed. This reduces the “I already bought” complaints that hurt deliverability and trust.
Common Mistakes to Avoid
Most tracking failures are boring and repeatable. Avoid these and your retention machine stays predictable.
- Calling identify with an unstable ID. Session IDs or device IDs create new people constantly, which shatters segments and frequency controls.
- Changing event names during a refactor without updating Journeys. The Journey doesn’t “guess” the new name; it just stops triggering.
- Relying on analytics event names. Teams often mirror GA/Mixpanel naming that isn’t retention-friendly. Keep Customer.io schemas optimized for messaging decisions.
- Tracking purchases in a separate system without stitching. If Shopify/Stripe events update one profile and app events update another, your post-purchase and suppression logic breaks.
- Ignoring duplicates until deliverability tanks. Duplicates lead to repeated sends, conflicting subscription states, and messy attribution.
- Assuming push problems are “creative.” Low push performance is frequently a token/profile association issue, not a headline issue.
Summary
If your retention flows aren’t firing reliably, start by proving identity and event integrity—not by tweaking the Journey. Get identify timing right, standardize event schemas across platforms, and make sure anonymous-to-known stitching matches how customers actually shop.
Implement Troubleshooting with Propel
When teams ask us to audit “why Customer.io is inconsistent,” it’s almost always an SDK identity or schema issue that’s fixable in a sprint—once you know where to look. If you want help pressure-testing your app-side tracking and stitching plan inside Customer.io, you can book a strategy call and we’ll map the exact failure points against your highest-value retention journeys.