Track Events (SDK) in Customer.io for Retention Marketing

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 you want Customer.io to drive real retention outcomes (not just send messages), your SDK event tracking has to be trustworthy—especially identity and timestamps. If you’re unsure whether your app events are clean enough to power cart recovery, replenishment, or reactivation, book a strategy call and we’ll pressure-test your tracking against the journeys you actually want to run.

In most retention programs, we’ve seen “Track Events” become the single point of failure: the marketing team builds a great flow, but the app fires inconsistent events, users aren’t identified at the right moment, and the campaign either under-sends (missed revenue) or over-sends (spam + unsubscribes).

How It Works

At a practical level, SDK tracking is about two things: (1) stitching activity to the right customer profile and (2) sending events with enough structure that you can segment and trigger journeys without guessing.

  • Identify first, then track. Your SDK needs to call an identify method when you know who the user is (login, account creation, email capture). That’s what ties future events to a single person in Customer.io instead of leaving them “anonymous.”
  • Track events from the app (not your backend) when timing matters. For retention, the app is often the source of truth for “intent” moments—product viewed, add to cart, checkout started, subscribe clicked—where minutes matter for recovery flows.
  • Send consistent event names + properties. Event names should be stable (e.g., product_viewed, added_to_cart, checkout_started, order_completed). Properties should be predictable across platforms (iOS/Android/web) so segments don’t fracture.
  • Customer.io stores event history and uses it for triggers + segmentation. Once events land, you can trigger Journeys (e.g., “Added to cart but no purchase in 2 hours”) and build segments (e.g., “Viewed category X 3+ times in 7 days”).
  • Identity stitching is the make-or-break detail. In practice, this tends to break when a user browses anonymously, then logs in later. If you don’t merge pre-login activity into the identified profile, your cart recovery flow won’t see the cart event on the real customer.

Real D2C scenario: A shopper browses on your mobile app, adds a bundle to cart, then creates an account at checkout. If your app tracks added_to_cart before you call identify, Customer.io may record the cart event on an anonymous profile. Result: your “cart abandonment” journey never triggers for the real customer—even though the intent was there.

Step-by-Step Setup

The cleanest implementations start with a tracking plan and then wire the SDK to match it. Don’t start in Customer.io building flows until you’ve validated that identify + key events are firing correctly in both dev and production.

  1. Define your retention-critical events.
    Start with the events that directly power revenue:
    • product_viewed (include product_id, category, price)
    • added_to_cart (include cart_id, items, value)
    • checkout_started (include cart_id, value)
    • order_completed (include order_id, value, items)
    • subscription_started / subscription_canceled (if relevant)
  2. Install the Customer.io SDK in your app.
    Use the appropriate SDK for your stack (iOS/Android/React Native/Flutter, etc.). Make sure you’re using the same workspace/environment your retention team will build against (dev vs prod).
  3. Implement identify at the right moments.
    Call identify when the user is known:
    • Account creation
    • Login
    • Email/phone capture (even before full signup, if you treat it as a known user)
    Also pass stable identifiers (email/phone/customer ID) and key attributes you’ll segment on (first purchase date, subscription status, preferred category).
  4. Track events with consistent naming and properties.
    Fire events immediately when the action happens in the UI. Keep property keys consistent across platforms (don’t use productId on iOS and product_id on Android).
  5. Handle anonymous-to-known merging.
    If your app supports anonymous browsing, ensure the SDK merges anonymous activity into the identified profile when identify occurs. This is where cart recovery and browse abandonment usually fall apart.
  6. Validate in Customer.io Activity Logs.
    Before you build any journey, confirm:
    • Events show up on the expected person profile
    • Event timestamps match reality (watch for timezone/device clock issues)
    • Properties are present and correctly typed (numbers as numbers, not strings)
  7. Create a “tracking QA” segment for ongoing checks.
    Keep an internal segment (e.g., employees/test accounts) and regularly verify that critical events still fire after app releases.

When Should You Use This Feature

SDK event tracking is the right move when retention depends on in-app behavior and you can’t rely on Shopify-only or backend-only signals. The moment you need intent-based messaging, you need app-side events that land fast and stitch correctly.

  • Cart recovery on mobile apps. Trigger flows off added_to_cart or checkout_started and suppress if order_completed arrives.
  • Browse abandonment and product discovery. If a customer views the same category multiple times, you can follow up with a curated set—only if product_viewed is consistent and includes category/product metadata.
  • Repeat purchase and replenishment. Track order_completed with item-level detail so you can time replenishment messages based on what they bought (not just that they bought).
  • Reactivation based on engagement drop. Events like app_opened, search_performed, or quiz_completed can define “active” vs “slipping,” but only if identity stitching is solid.

Operational Considerations

Once events are flowing, the operational work is keeping the data usable for segmentation and orchestration. Most teams don’t fail at “sending events”—they fail at keeping events consistent as the app evolves.

  • Segmentation depends on property hygiene. If your cart value property is sometimes value and sometimes cart_value, you’ll end up with brittle segments and journeys that quietly miss people.
  • Event volume and noise control. Don’t pipe every UI interaction. Focus on events that map to retention decisions (intent, purchase, churn risk). Too much noise makes it harder to build reliable triggers and increases the chance of accidental message spam.
  • Cross-platform parity. If iOS sends checkout_started but Android doesn’t, your cart recovery performance will look “random.” Align event specs across platforms.
  • Identity stitching and duplicate profiles. If users can log in with email on web and phone on app, decide your primary identifier strategy early. Otherwise you’ll split a single customer into multiple profiles and double-message them.
  • Orchestration with purchase sources. Many D2C brands have purchases coming from Shopify + in-app checkout. Make sure order_completed is deduped and normalized so your post-purchase and replenishment flows don’t fire twice.

Implementation Checklist

If you want this to hold up under real campaign pressure (cart recovery, replenishment, winback), treat this like a production system: spec it, test it, and monitor it after every release.

  • Key retention events defined with stable names and required properties
  • Customer.io SDK installed in all app surfaces (iOS/Android/web as applicable)
  • identify implemented at signup/login/email capture
  • Anonymous activity merges into identified profiles after identify
  • Event properties standardized across platforms (same keys, same types)
  • QA process: test accounts + release checklist to re-verify events
  • Suppression logic planned (e.g., don’t send cart recovery if order_completed arrives)
  • Deduping plan for purchases if multiple systems can emit “completed order”

Expert Implementation Tips

These are the details that make your retention journeys feel “smart” instead of spammy, and they usually come down to event shape and timing.

  • Make cart events journey-ready. Include an items array with product_id, name, quantity, and price. That gives you dynamic cart content in messages and better segmentation (“high intent” carts).
  • Use a single canonical customer ID across systems. Even if marketing segments by email, your stitching is more reliable when the app sends a stable internal ID and you map email/phone as attributes.
  • Track “checkout started” separately from “added to cart.” They indicate different intent. In practice, we’ll use shorter delays and stronger incentives for checkout starters, and gentler nudges for cart adders.
  • Instrument negative signals. Events like subscription_canceled or refund_requested help you suppress upsells and route customers into save flows instead.
  • Build a shadow dashboard segment. Keep a segment like “Tracked added_to_cart in last 24h” and watch its daily count. If it drops after an app release, you’ll catch it before revenue does.

Common Mistakes to Avoid

Most tracking issues don’t look like “it’s broken.” They look like performance slowly degrading because the data no longer matches your journey logic.

  • Tracking before identify without merging. Classic cause of missing cart/browse abandonment triggers.
  • Inconsistent event naming. Having Add To Cart, add_to_cart, and added_to_cart in production forces messy segments and unreliable triggers.
  • Property type drift. Sending value as a string sometimes breaks numeric comparisons (e.g., “cart value > $75”).
  • Over-instrumenting low-signal events. Flooding Customer.io with noisy events makes it harder to debug and increases the risk of accidental triggers.
  • No post-release QA. App teams ship changes that rename a field or remove an event, and marketing only notices when cart recovery revenue drops.
  • Duplicate purchase events. If both the app and Shopify emit “order completed” without dedupe, your post-purchase flows will double-send and annoy customers.

Summary

If you want Customer.io to reliably drive repeat purchase and recovery flows, SDK tracking needs clean identity stitching and consistent event schemas. Get identify right, keep event properties stable, and QA after every release. Once that’s in place, your journeys stop guessing and start converting.

Implement Track Events with Propel

If you’re already running Customer.io, the fastest path is usually: confirm identify/merge behavior, standardize your event schema across platforms, then rebuild your highest-leverage flows (cart recovery, replenishment, winback) on top of those events. If you want a second set of eyes on your current SDK implementation and how it maps to revenue journeys, book a strategy call—we’ll focus on what to instrument, what to ignore, and how to keep it stable as your app evolves.

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