Summarize this documentation using AI
Overview
If your retention program depends on app events (viewed product, added to cart, started checkout, purchased), the 2.x → 3.x SDK upgrade is less about “new version” and more about protecting data continuity in Customer.io. If you want a second set of eyes on identity stitching and event parity before you ship, book a strategy call—this is one of those changes that’s cheap to do right and expensive to debug later.
In most D2C apps, the upgrade only “works” when your anonymous-to-known journey stays intact. That’s the difference between a cart recovery flow firing once vs. spamming the same person across multiple profiles.
How It Works
At a practical level, the 3.x SDK changes how you initialize the SDK, identify users, and record events—so Customer.io can reliably tie behavior to a single customer profile across sessions and devices.
- SDK initialization happens earlier and more consistently. In 3.x you’ll generally initialize once (app start) with your workspace/site credentials so all downstream tracking is attributed correctly.
- Identity stitching becomes the centerpiece. You’ll still track anonymous behavior (browse, PDP views, cart adds) before login, but you need a clean
identifymoment (login/account creation/checkout email capture) so Customer.io merges that pre-login activity into the known profile. - Event tracking is the contract with your automations. Your campaigns don’t care about SDK versions—they care that
Added to Cartstill fires with the same properties and timing. The upgrade is successful only when event names + properties remain stable or you intentionally migrate them. - Device tokens and channel permissions still matter. If you use push, you need to confirm 3.x still registers device tokens and permission states the way your segments expect (e.g., “Push Enabled = true”).
Real D2C scenario: A shopper adds a serum to cart while browsing anonymously, then creates an account at checkout. If your 3.x implementation identifies too late (or identifies with a different ID than your backend), Customer.io can split them into two people. Result: the cart abandonment journey targets the anonymous profile (no email), while the known profile never gets the recovery message.
Step-by-Step Setup
The cleanest upgrades start by treating tracking like a migration: lock your current event taxonomy, then implement 3.x in a way that preserves it. Don’t start by “upgrading the SDK” in isolation—start by protecting your retention triggers.
- Inventory your current tracking contract.
- List the exact event names used in Customer.io triggers/segments (e.g.,
Product Viewed,Added to Cart,Checkout Started,Order Completed). - Document required properties (e.g.,
sku,product_id,price,currency,cart_value). - Pull 7–14 days of sample events from Customer.io to see what’s actually arriving (not what engineering thinks is arriving).
- List the exact event names used in Customer.io triggers/segments (e.g.,
- Upgrade the SDK dependency to 3.x in your app.
- Update your iOS/Android/React Native/Flutter dependency per your platform setup.
- Plan for a phased release if your app has high volume—tracking regressions show up fast.
- Re-implement SDK initialization at app start.
- Initialize once, as early as reasonable (app launch) so background/foreground events don’t get dropped.
- Confirm you’re using the correct workspace/site credentials for the environment (prod vs staging).
- Implement a single, deterministic
identifymoment.- Choose your canonical identifier (usually your internal customer ID). If you only have email at first, use email—then migrate to internal ID once available, but do it intentionally.
- Call
identifyat login, account creation, and when you capture email at checkout (if you allow guest checkout). - Attach stable customer attributes at identify time (email, phone, timezone, acquisition source if you have it).
- Recreate event tracking with parity.
- Re-emit the same events with the same names/properties your automations rely on.
- Be strict about types (numbers as numbers, timestamps as timestamps). Segments break quietly when types change.
- Validate anonymous → known merge behavior.
- Run a test flow: install app → browse → add to cart → then login/enter email → confirm all events land on one profile.
- Check Customer.io for duplicate profiles created during the test and resolve before rollout.
- QA your retention automations against real events.
- Trigger cart abandonment, browse abandonment, and post-purchase flows using test accounts.
- Confirm delays, filters, and exit conditions still behave (e.g., “Exit if Purchased”).
When Should You Use This Feature
In practice, teams upgrade to 3.x when they’re feeling pain in tracking reliability—missed triggers, duplicate profiles, or push token weirdness. The upgrade is most valuable when app behavior is a core input to your retention engine.
- Cart recovery in an app-led funnel. If a meaningful share of carts happen in-app, you need clean anonymous tracking + a reliable identify moment so recovery messages reach the right person.
- Repeat purchase programs driven by product interaction. Replenishment and cross-sell flows work better when you track category views, PDP views, and “subscribe & save” interactions accurately.
- Reactivation based on “silent churn” signals. If you re-engage customers who haven’t opened the app or viewed products in X days, you need session/activity events to be consistent after the upgrade.
- Push-heavy retention. If push is a top channel, upgrading is often necessary to keep device registration and permission state clean—otherwise segments like “pushable users” drift.
Operational Considerations
The SDK upgrade touches more than engineering. It impacts segmentation logic, how profiles merge, and whether your journeys stay coherent. This is where most retention programs accidentally create data debt.
- Segmentation stability:
- If you change event names/properties, update every segment and trigger that references them.
- Watch for property type changes (string vs number). A segment like “cart_value > 75” fails silently if
cart_valuebecomes a string.
- Data flow and timing:
- Mobile event delivery can be delayed (background, poor connectivity). Build cart recovery with a buffer (e.g., wait 30–60 minutes) so you don’t message people who already purchased.
- Make sure purchase events are server-confirmed when possible; app-only purchase tracking can overcount during retries.
- Orchestration realities:
- If you orchestrate across email + push + SMS, identity mismatches become channel mismatches (push goes to device A, email goes to profile B).
- Decide your “source of truth” for customer ID and enforce it everywhere (app, backend, Customer.io).
- Duplicate profile risk:
- During rollout, you can temporarily create duplicates if some users are on 2.x and others on 3.x and identification logic differs. Plan a short overlap window and monitor merges.
Implementation Checklist
If you run this like an operator, you’ll treat the upgrade as a tracking migration with acceptance criteria. This checklist is the minimum bar before you call it “done.”
- Event taxonomy documented (names + required properties) for cart, browse, checkout, purchase, and session activity
- 3.x SDK initialized at app launch in all environments (staging + prod)
- Canonical identifier chosen and implemented consistently in
identify - Anonymous browsing events verified and successfully merged after identify
- Push token registration verified (if using push) and “push enabled” attributes still populate correctly
- Cart abandonment and post-purchase journeys QA’d end-to-end with test accounts
- Monitoring plan in place: duplicate profile checks, event volume deltas, and trigger entry counts
Expert Implementation Tips
The difference between a clean upgrade and a messy one usually comes down to identity discipline and event parity. These are the moves that keep retention performance stable while you ship.
- Identify earlier than you think—but not sloppily. Guest checkout email capture is often the best identify point for D2C. If you wait until “account created,” you lose the recovery window for a big chunk of shoppers.
- Keep event names stable; version properties instead. If you need to change payloads, add a property like
schema_versionor introduce new properties while keeping the trigger event name the same. It saves you from rebuilding every journey. - Use server-side purchase confirmation where possible. Let the app track intent (checkout started), but confirm “order completed” from your backend so you don’t misfire winback or post-purchase flows.
- Build a “tracking QA” segment. Create a segment for internal testers and route them through journeys with a debug header/property so you can see exactly why someone entered/exited.
Common Mistakes to Avoid
Most failures don’t look like crashes—they look like revenue leakage: fewer recoveries, more duplicates, and journeys that stop exiting correctly.
- Changing identifiers midstream. Switching from email-based IDs to internal IDs without a plan is a classic way to split profiles and lose historical behavior.
- Breaking event/property parity. Renaming
Added to Carttoadd_to_cart(or changingproduct_idtoid) will quietly break triggers and segments. - Calling identify too late. If you identify only after purchase, you’ll never recover carts tied to anonymous profiles.
- Not validating merges. Teams often test “events are arriving” but don’t confirm they’re arriving on the same person profile after login.
- No rollout monitoring. You need to watch event counts and campaign entry rates for the first few days—otherwise you find out a week later when revenue dips.
Summary
Upgrading Customer.io SDK 2.x to 3.x is worth it when app behavior drives your retention engine—but only if you preserve identity stitching and event parity. Treat it like a migration, QA the anonymous-to-known journey, and monitor campaign entry rates after rollout.
Implement 3.x Upgrade with Propel
If you want to ship the 3.x upgrade without risking duplicate profiles or broken cart recovery triggers, it helps to run it with an operator’s QA plan and clear acceptance criteria inside Customer.io. If that would be useful, book a strategy call and we’ll pressure-test your identify strategy, event taxonomy, and rollout monitoring before it hits production.