Summarize this documentation using AI
Overview
If you’re upgrading from 2.x to 3.x, treat it less like a “version bump” and more like a tracking reliability project—because your automations are only as good as the identity + events feeding them. This guide translates the Customer.io 2.x → 3.x upgrade into the steps that actually protect revenue (cart recovery, repeat purchase, reactivation), and where teams usually lose attribution or break stitching. If you want a second set of eyes before you ship, book a strategy call and we’ll pressure-test your event map and identity plan.
In most retention programs, we’ve seen the upgrade go “fine” technically—but quietly degrade performance because identify timing changes, event names drift, or anonymous activity stops merging into known profiles. The result is classic: fewer cart abandoners qualify, browse-based recommendations thin out, and winback audiences get noisy.
How It Works
Customer.io’s 3.x SDKs are designed to standardize tracking and make identity handling more consistent across platforms. The practical retention impact is simple: you want a clean chain from anonymous session → identified customer → purchase, without losing events in between.
- Installation changes affect what data gets collected and when. When you swap SDK major versions, defaults and initialization patterns often change. If initialization happens late (after the first screen renders), you’ll miss the highest-intent events (product view, add to cart) that power recovery and retargeting segments.
- Identify calls are the “join key” for retention. Your app will generate anonymous activity before login/email capture. The moment you call
identify, you’re telling Customer.io: “attach this device/session history to this person.” If you call identify too late—or with inconsistent IDs—you’ll fragment profiles and your automations will under-trigger. - Event tracking drives entry into campaigns and Journeys. Events like
Viewed Product,Added to Cart,Started Checkout, andOrder Completedshould remain stable in name, casing, and payload shape. Even small changes break segments and triggers silently. - Identity stitching depends on consistency across app + backend. In practice, the best retention stacks use the app SDK for behavioral events and a server-side source (Shopify/Stripe/order service) as the source of truth for purchases. Your job during the upgrade is to ensure both sources resolve to the same person identifier.
Step-by-Step Setup
Plan the upgrade like you’re protecting three things: (1) identity continuity, (2) event continuity, and (3) message eligibility. Do it in a staging environment first, then ship behind a feature flag if your release process supports it.
- Inventory your current 2.x implementation before touching code.
Pull a list of:- Where the SDK initializes (app start, first screen, after consent, etc.)
- All
identifycalls (login, signup, checkout, email capture modals) - All tracked events + payload keys (exact spelling/casing)
- Any device token handling (push) tied to Customer.io
- Upgrade the SDK to 3.x in your app(s).
Follow Customer.io’s platform-specific install steps for iOS/Android/React Native/etc. The operator note: align versions across platforms if you run cross-channel journeys (push + email + in-app). Mixed SDK behavior can create inconsistent event payloads. - Re-implement initialization as early as possible.
If consent gating is required, initialize in a “limited” mode (where supported) and only start tracking after consent—otherwise you’ll miss pre-consent screens and create false drop-offs. If you must fully block, document that your first-trackable event happens later and adjust segments accordingly. - Standardize your identity strategy (this is where upgrades usually break).
Pick one primary identifier and stick to it:- Best practice: use an internal customer ID as
idand store email/phone as attributes. - If you use email as the ID: enforce normalization (lowercase, trimmed) everywhere, including backend purchase events.
- Best practice: use an internal customer ID as
- Place
identifyat the earliest “reliable” moment.
Common D2C pattern:- User browses anonymously → tracks
Viewed ProductandAdded to Cart - User enters email at checkout or via a “save your cart” modal → call
identifyimmediately - Now the abandoned cart journey can fire with full browse/cart context
- User browses anonymously → tracks
- Recreate event tracking in 3.x with the exact same contract.
Keep event names and payload keys identical unless you’re intentionally migrating. If you must change names, run both old + new in parallel for a short window and update segments/triggers before cutting over. - Validate identity stitching with real flows, not unit tests.
Run these end-to-end in staging:- Anonymous browse → email capture → abandon → confirm the profile shows prior events
- Login on a second device → confirm events attach to the same person
- Purchase server-side → confirm it lands on the same person ID as app-side behavior
- Monitor live logs during rollout.
During the first release, watch Customer.io activity for:- Duplicate profiles (same email on multiple IDs)
- Event volume dips for key events (ATC, checkout, purchase)
- Unexpected payload shape changes (missing
product_id,cart_value, etc.)
When Should You Use This Feature
Major SDK upgrades are worth doing when you’re actively investing in retention automation and need tracking you can trust. If your retention program depends on behavioral triggers, stale SDKs tend to become the invisible bottleneck.
- Cart recovery that depends on app-side behavior. If your “Added to Cart” and “Started Checkout” events come from the app, the upgrade is the moment to ensure those events fire before the user bounces and that they stitch after email capture.
- Repeat purchase orchestration based on product affinity. For example, a skincare brand triggering replenishment based on
Purchased+Viewed Product(next product in routine). If view events drop or payloads change, recommendations and timing fall apart. - Reactivation using last-seen behavioral signals. If you’re building winbacks like “hasn’t opened the app in 45 days but viewed category X,” you need consistent app events and accurate device association for push.
Operational Considerations
The SDK upgrade touches more than engineering. It changes what your segments see, what your journeys trigger on, and whether your orchestration logic stays true.
- Segmentation stability: lock an event naming convention and payload schema. If your segment is “Added to Cart at least once in 2 hours,” a casing change (
added_to_cartvsAdded to Cart) will drop qualification to zero with no obvious error. - Data flow ownership: decide which source owns purchases (server) vs behavior (SDK). In practice, this reduces fraud/latency issues and prevents “purchase didn’t track” gaps that break post-purchase upsells and replenishment.
- Orchestration realities: if you send push from the SDK but email from backend identities, you must ensure the same person ID is used—or you’ll message the wrong profile (or suppress the right one).
- Identity conflict handling: upgrades often surface old debt: multiple IDs per person, shared devices, guest checkout. Plan rules now (e.g., prefer internal customer ID; merge duplicates; normalize email).
Implementation Checklist
Use this list to keep the upgrade from turning into a retention regression. The goal is not “SDK compiles,” it’s “Journeys still qualify the same people with the same timing.”
- All platforms upgraded to 3.x (iOS/Android/RN/etc.) with consistent configuration
- SDK initializes early enough to capture first-session intent events
identifyfires on the earliest reliable identifier capture (login/signup/email capture)- Primary person identifier is consistent across app SDK and backend purchase events
- Event names and payload keys match the 2.x contract (or dual-tracked during migration)
- Cart, checkout, and purchase flows validated end-to-end in staging
- Live rollout monitoring plan in place (event volume, duplicates, missing payload keys)
- Segments and journey triggers reviewed for any dependency on renamed events/attributes
Expert Implementation Tips
This is where teams usually save (or lose) weeks. The upgrade itself is straightforward; the retention-grade instrumentation is what makes it pay off.
- Track the “email captured” moment as its own event. In D2C checkout flows, that’s the moment you can legally and operationally start recovery. Pair it with
identifyso your abandon series has context. - Send cart state as event payload, not as scattered attributes. For example: item IDs, quantities, cart value, currency. It makes template personalization and conditional logic in Customer.io far more reliable.
- Keep purchase as server-truth, but mirror an app confirmation event. The server event should drive revenue/attribution; the app event helps debug and can drive immediate in-app confirmations without waiting on backend latency.
- Build a “tracking QA” segment. Maintain an internal segment of test devices/users (your team) and watch their event stream after releases. It catches breaks before customers do.
Common Mistakes to Avoid
Most issues don’t show up as crashes—they show up as quieter automations and worse conversion rates. These are the repeat offenders.
- Calling
identifyonly after account creation. If you capture email at checkout first, you just threw away your best recovery audience. - Changing event names “to be cleaner” during the upgrade. Clean later. First, keep continuity. If you want a new taxonomy, dual-track and migrate segments intentionally.
- Letting iOS and Android drift in payload schema. Your segments become platform-biased and you’ll misread performance (“push works better on iOS”) when it’s actually tracking.
- Using email as ID without normalization.
Test@Email.comandtest@email.combecome two customers. That breaks suppression, frequency caps, and LTV reporting. - Not validating anonymous-to-known merge. If browse/cart events don’t attach after identify, your abandon and product discovery journeys lose personalization and trigger accuracy.
Summary
Upgrading Customer.io SDK 2.x → 3.x is only “done” when identity stitching and event contracts are stable in production. If cart recovery, repeat purchase, and winback triggers rely on app behavior, prioritize early initialization, consistent IDs, and end-to-end flow validation.
Implement 3.x Upgrade with Propel
If you’re mid-upgrade (or planning it) and want to avoid the usual retention pitfalls—broken stitching, silent event drift, duplicate profiles—we can help you map the event contract, validate identity rules, and QA the rollout against your highest-value journeys inside Customer.io. If that’s useful, book a strategy call and bring your current 2.x tracking plan + your top 3 revenue workflows (cart, post-purchase, winback).