Troubleshooting Customer.io SDK Tracking (Mobile/Web): What Breaks, How to Fix It, and How to Prevent It

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

If your retention automations feel “random” (some users enter, others don’t), it’s usually not a messaging problem—it’s a tracking and identity problem. This guide translates Customer.io troubleshooting into the checks that actually matter when you’re instrumenting mobile/web SDKs and relying on those events for cart recovery, replenishment, and reactivation.

If you want a second set of eyes on your data flow and identity stitching before you scale spend or offers, you can book a strategy call and we’ll pressure-test the implementation the way a retention operator would.

How It Works

In practice, Customer.io only sends the “right” messages when it can reliably do two things: (1) recognize who the user is (identity), and (2) receive the events/attributes your segments and journeys depend on (tracking). Most troubleshooting comes down to confirming the order and consistency of identify calls, the shape of your events, and whether your journeys are listening for the same names/properties you’re actually sending.

  • Identity stitching is the foundation. Anonymous browsing or app usage becomes useful only after you call identify() with a stable customer identifier (email, customer_id). If identify happens late—or not at all—you’ll see “missing” conversions and broken recovery flows.
  • Events drive orchestration. Journeys typically trigger off events like Product Viewed, Added to Cart, Checkout Started, Order Completed. If the SDK sends a different name (even a casing mismatch), the user never enters.
  • Attributes power segmentation and suppression. Things like last_order_at, lifetime_value, is_subscriber, push_enabled determine who gets what. If attributes don’t update, you’ll over-message, under-message, or fail to suppress buyers.
  • Device tokens matter for push. For mobile, even perfect events won’t help push if APNs/FCM tokens aren’t being registered and associated with the right identified profile.

Step-by-Step Setup

When troubleshooting, speed matters. Don’t start by editing journeys—start by proving the SDK is sending the right identity and event payloads, in the right order, in a single test session. Then work outward to segments and orchestration.

  1. Reproduce the issue with a clean test user.
    Create a brand-new account (or uninstall/reinstall the app) so you’re not fighting cached identities and old device tokens.
  2. Verify identify happens immediately after authentication.
    Call identify() right after login/signup and whenever your app regains an authenticated session. Use a stable identifier (ideally a numeric customer_id), and include email as an attribute if you also send email.
  3. Confirm anonymous-to-known behavior is intentional.
    If users can add to cart before login, make sure you’re either (a) tracking those events anonymously and merging later, or (b) forcing identify earlier (e.g., email capture). If you do neither, cart recovery will look “spotty.”
  4. Check event naming and casing against your journeys.
    Open the exact journey trigger and copy the event name. Then compare to what the SDK sends. added_to_cart vs Added to Cart is enough to break entry.
  5. Validate required event properties.
    If your journey filters on cart_value or sku, confirm those properties exist and are the correct type (number vs string). Filtering on a missing property silently reduces entry.
  6. Confirm timestamp behavior.
    If you send your own timestamps, ensure they’re in the expected format/timezone. Bad timestamps create “why didn’t they match within the past X minutes/hours?” headaches.
  7. Test attribute updates used for suppression.
    After purchase, update last_order_at and/or send an Order Completed event. Then confirm your cart recovery journey exits/suppresses as expected.
  8. For push: verify token registration and profile association.
    Make sure the device token is captured and tied to the identified profile. A common failure mode is token captured while anonymous, then never re-attached after identify.
  9. Inspect duplicates and merges.
    If you see two profiles per customer (one anonymous, one identified), confirm your merge strategy. Duplicates lead to double sends or “buyer still gets cart abandon.”

When Should You Use This Feature

Troubleshooting isn’t a one-off task; it’s part of keeping retention programs stable as your app changes, your checkout changes, and your team ships new analytics. The highest ROI is when a single broken event can quietly kill a whole revenue flow.

  • Cart recovery entry is inconsistent. Example: iOS users enter the abandon flow, Android users don’t—usually an event naming mismatch or identify timing difference between platforms.
  • Post-purchase suppression fails. People keep getting “complete your purchase” after buying—typically Order Completed isn’t firing, or it’s firing on a different user profile than the one who abandoned.
  • Reactivation segments look wrong. Your “90-day lapsed” audience is tiny or massive—often last_order_at isn’t updating, or orders are tracked as events without updating the attribute your segment uses.
  • Push delivery drops suddenly. Usually tied to token registration changes, permission prompts moving, or tokens not being re-associated after logout/login.

Operational Considerations

Most retention programs break at the seams: multiple data sources, inconsistent identifiers, and journeys built on assumptions that were true six months ago. Treat troubleshooting as an operating system: define what’s source-of-truth, then enforce it.

  • Segmentation depends on consistent identity keys. Pick one primary identifier (customer_id) and stick to it across web and app. If web uses email and app uses a UUID, you’ll fight duplicates forever.
  • Decide what’s event-driven vs attribute-driven. For cart recovery, events are usually best (Added to Cart, Checkout Started). For reactivation, attributes are often cleaner (last_order_at, order_count). Mixing both without a plan creates mismatched audiences.
  • Data flow latency changes orchestration. If purchase confirmation comes from a backend webhook later, your cart journey needs a buffer (delay + exit on purchase) or you’ll message buyers before the system learns they purchased.
  • Cross-device is where identity stitching gets real. A common D2C scenario: user adds to cart on mobile web, purchases in-app. If those identities don’t merge, you’ll send an abandon message after they’ve already bought.
  • Versioning matters. App releases can silently rename events or stop firing them. Maintain an event contract and treat changes like API changes, not “analytics tweaks.”

Implementation Checklist

If you run this checklist on every major app release and checkout change, you’ll prevent most “Customer.io is broken” moments before they hit revenue.

  • Identify is called after login/signup and on session restore
  • Anonymous pre-login behavior is defined (merge or capture email early)
  • Event names match journey triggers exactly (including casing/spaces)
  • Required event properties exist and have correct data types
  • Purchase sends an Order Completed event and updates last_order_at
  • Cart recovery journeys have exit conditions for purchase
  • Push tokens are registered and associated with the identified profile
  • Duplicate profiles are monitored and merge rules are enforced
  • One “source of truth” is defined for order history/LTV

Expert Implementation Tips

These are the operator moves that keep tracking clean at scale—especially once you’re running multiple recovery and upsell flows across email, SMS, and push.

  • Instrument a single “golden path” test. Keep a repeatable flow: install → browse → add to cart → start checkout → purchase → uninstall. Run it on every platform and confirm the same identity and events land in Customer.io.
  • Send an explicit “Logged Out” attribute/event. If your app supports logout, mark it. Otherwise, device tokens and identities can drift and you’ll message the wrong person on shared devices.
  • Normalize event payloads across platforms. iOS and Android teams often implement the “same” event differently. Create a shared schema for core commerce events (sku, price, quantity, cart_value, currency).
  • Build suppression off the most reliable signal. If backend order webhooks are more trustworthy than client-side purchase, use them to update last_order_at and drive suppression—even if the journey trigger is client-side.

Common Mistakes to Avoid

Most issues aren’t exotic—they’re small inconsistencies that compound until your retention program looks unpredictable.

  • Calling identify too late. If identify only happens after checkout, your entire pre-purchase funnel is effectively anonymous and hard to recover.
  • Using unstable identifiers. Device IDs and randomly generated UUIDs create duplicates when users reinstall or switch devices.
  • Renaming events without updating journeys. Teams refactor analytics and forget the automation layer is coupled to those names.
  • Filtering journeys on properties you don’t always send. “Only enter if cart_value > 50” fails if cart_value is missing for some platforms.
  • No purchase exit condition. Cart abandon without a purchase exit is how you end up discounting people who were already going to buy.
  • Assuming push is ‘set and forget.’ Permission prompts, token refresh, and logout/login flows all impact whether Customer.io can actually reach the device.

Summary

If journeys aren’t firing, start with identity and event reality—not the canvas. Prove identify timing, confirm event names/properties, then tighten suppression so buyers exit cleanly. Once those are stable, your recovery and repeat-purchase programs behave predictably and scale without surprises.

Implement Troubleshooting with Propel

When teams hit tracking weirdness, we usually find it’s one of three things: identify happening in the wrong place, duplicate profiles from inconsistent IDs, or events drifting from the schema your journeys expect. If you want help validating the SDK instrumentation and the orchestration assumptions behind it, we can review your Customer.io setup and map fixes directly to revenue flows—then you can book a strategy call to walk through it.

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