Upgrading Customer.io SDK Tracking: 2.x → 3.x (What to change so retention doesn’t break)

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’re moving from 2.x to 3.x, treat it like a retention infrastructure change—not a “dev upgrade.” Your Customer.io journeys only work as well as your app-side identity stitching and event payloads, and upgrades are where those quietly drift. If you want a second set of eyes before you ship, you can book a strategy call and we’ll sanity-check the tracking plan against your highest-revenue flows.

The goal is simple: keep the same behavioral triggers (viewed product, added to cart, started checkout, purchased), keep identity consistent across anonymous → logged-in, and avoid creating duplicate profiles that tank deliverability and attribution.

How It Works

In practice, the 2.x → 3.x jump usually impacts three things that matter for retention: how the SDK is initialized, how you identify users, and how events (and their properties) get recorded. If any of those shift, your segments drift and your cart/reorder automations stop catching the right people.

  • Initialization changes can alter when tracking starts. If the SDK initializes later in the app lifecycle than before, you’ll miss early-session events like Product Viewed or Added to Cart—which are the exact events your recovery flows depend on.
  • Identity stitching is the real risk. Retention programs fall apart when anonymous activity doesn’t merge into the logged-in profile. The upgrade is where teams accidentally change the identifier they pass (email vs internal customer ID), or they stop calling identify at the right time.
  • Event schema drift breaks orchestration. If you rename events, change property keys, or switch types (string → number), your existing Customer.io triggers, filters, and segment conditions won’t match. You won’t always see an “error”—you’ll just see revenue drop in recovery and reactivation.

A realistic D2C example: a shopper browses on mobile, adds a product to cart, then logs in at checkout. If your 3.x upgrade stops merging anonymous cart events into the known profile, your “Cart Abandonment (Push + Email)” journey won’t fire for them because Customer.io thinks the cart happened on a different person.

Step-by-Step Setup

Before you touch code, lock the tracking contract. You’re not just upgrading a dependency—you’re preserving the inputs that drive segmentation and message timing.

  1. Inventory your current retention-critical events. Pull a list of the events your top flows rely on (cart abandonment, browse abandonment, post-purchase cross-sell, replenishment, winback). Write down exact event names and required properties (SKU, product_id, price, currency, quantity, cart_id, order_id).
  2. Confirm your “primary identifier” strategy. Decide what id you’ll use for identify in 3.x (typically your internal customer ID). Then decide what goes into attributes (email, phone, loyalty tier). Don’t swap these casually—this is where duplicate profiles come from.
  3. Update SDK installation to 3.x per platform (iOS/Android/React Native/etc.). Make the dependency change and update initialization to the 3.x pattern. Keep initialization as early as possible (app start), especially if you use “session start” or “first open” style events to gate onboarding offers.
  4. Re-implement identify at the correct moment. Call identify immediately after authentication succeeds (and again on app launch if a session is still valid). Include stable attributes you use for segmentation (email, created_at, marketing_opt_in, last_purchase_at if you store it client-side).
  5. Re-implement anonymous-to-known merging behavior. If your 2.x setup relied on automatic merging, confirm the 3.x equivalent behavior. If it’s now explicit, you need to wire it up—otherwise browse/cart events won’t attach to the purchaser.
  6. Port event tracking with identical names and property keys. Keep event names the same unless you’re prepared to update every Customer.io trigger/segment. Validate types: numbers stay numbers, timestamps stay timestamps, IDs stay strings.
  7. QA in a staging workspace (or with a strict test segment). Run a full scenario: anonymous browse → add to cart → login → checkout → purchase. Then confirm in Customer.io that (a) it’s one profile, (b) events appear in order, (c) properties are present.
  8. Roll out with a controlled release. Ship behind a feature flag or phased rollout. Watch event volume deltas and duplicate-profile creation rate for 48–72 hours.

When Should You Use This Feature

You don’t upgrade SDK versions for fun. You do it when the current version is limiting tracking reliability, channel support, or identity accuracy—and those directly map to retention revenue.

  • Cart recovery is underperforming on app. If you suspect missed Added to Cart events or broken identity merge, upgrading (and tightening implementation) is often the fix.
  • You’re adding push/in-app as a serious revenue channel. 3.x upgrades are usually bundled with better device handling. Better device mapping = fewer “sent but never delivered” pushes.
  • You need cleaner identity stitching across app + web. If you’re unifying mobile app behavior with web sessions, you want a consistent identifier strategy and clean event schema.
  • You’re seeing duplicate profiles grow. Duplicates inflate audience counts, harm deliverability, and make holdouts/A-B tests meaningless.

Operational Considerations

The SDK upgrade is the easy part. The operational work is making sure your data still supports segmentation and orchestration the way your retention calendar expects.

  • Segmentation depends on stable event names. If your segment is “Added to Cart in last 4 hours AND not Purchased,” a single rename (or missing property) will quietly cut audience size.
  • Watch for schema drift between platforms. iOS sends product_id, Android sends productId—now your segment only matches half your users. Standardize keys across platforms.
  • Identity stitching should be measured, not assumed. Track a KPI like “% of purchases preceded by a cart event on the same profile within 24h.” If that drops after upgrade, your merge/identify timing is off.
  • Orchestration realities: delays and triggers amplify tracking gaps. A browse abandonment flow with a 30-minute delay will look “fine” in QA even if 20% of events are missing—until you scale and wonder why revenue is down.
  • Data flow order matters. If identify happens after events fire, those events may remain stuck on an anonymous profile. Ensure identify precedes high-value events whenever possible (or ensure merge behavior is configured correctly).

Implementation Checklist

If you only do one thing, do this checklist with both engineering and retention in the room. It prevents the classic “SDK shipped, journeys broke” week.

  • 3.x SDK installed and initialized early in app startup
  • identify called after login and on app launch for returning authenticated users
  • Anonymous → known merge behavior confirmed with a real test (not just “should work”)
  • Event names unchanged (or Customer.io triggers/segments updated intentionally)
  • Event property keys standardized across platforms (snake_case vs camelCase decided)
  • Required properties present for revenue flows (SKU, price, currency, quantity, cart_id, order_id)
  • Purchase event includes order_id and total to support dedupe + LTV reporting
  • Staging QA run: browse → cart → login → purchase on a single profile
  • Post-release monitoring: event volume, duplicate profiles, push token coverage

Expert Implementation Tips

Most retention programs don’t fail because the SDK “doesn’t work.” They fail because the tracking contract isn’t enforced, and the upgrade introduces tiny inconsistencies that compound across segments and journeys.

  • Use a stable internal user ID for identify. Emails change; IDs don’t. Store email as an attribute for messaging and matching, not as your core identity key.
  • Send cart events with a cart_id. This lets you dedupe and build smarter logic (e.g., only send one recovery per cart, suppress if cart updated).
  • Make purchase idempotent. Always include order_id and ensure your backend won’t double-send. Duplicate purchases will wreck post-purchase branching and any “VIP” segmentation.
  • Validate event types explicitly. Price as a number, not a string. Timestamp as ISO8601. These details decide whether filters like “price > 50” work.
  • Instrument a stitching audit event during QA. For testing, emit an event like Stitch Test right before login and right after login, then confirm both appear on the same profile in Customer.io.

Common Mistakes to Avoid

These are the mistakes that show up as “cart recovery is down 18%” two weeks later, when it’s already hard to roll back.

  • Changing event names during the upgrade. If you want a new taxonomy, do it as a separate project with a migration plan inside Customer.io.
  • Calling identify too late. If users can add to cart before login, you need either early identify (if you have a known user) or verified merge behavior post-login.
  • Using email as the primary ID in one place and customer_id in another. That’s how you create two “different” people for the same shopper.
  • Platform-specific payload differences. One platform sends currency, the other doesn’t—now your revenue reporting and currency-based branching are wrong.
  • No phased rollout or monitoring. You want to catch a 5% drop in event volume on day one, not after your next promo underperforms.

Summary

Upgrading from 2.x to 3.x is worth it when you treat it like a retention tracking migration: preserve identity, preserve event schema, and prove stitching with real scenarios. If cart recovery, repeat purchase, or winback flows are meaningful revenue levers for you, the QA plan matters as much as the code change.

Implement Update To 3x with Propel

If you’re upgrading anyway, it’s a good moment to tighten the parts that usually leak revenue: anonymous-to-known stitching, cart schema consistency, and purchase dedupe. We’ll map your highest-value journeys back to the exact app events they depend on in Customer.io, then pressure-test the 3.x implementation plan before you ship. If that’s helpful, book a strategy call and we’ll walk through your current tracking and the upgrade path.

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