Summarize this documentation using AI
Overview
If you’re upgrading from 2.x to 2.2, treat it less like a “version bump” and more like a tracking reliability project—because your Customer.io journeys only work as well as your app-side identity and events. If you want a second set of eyes on the upgrade plan (especially around identity stitching and cart/revenue events), book a strategy call and we’ll pressure-test it the way we would for a live retention program.
In most retention programs, we’ve seen upgrades quietly break the stuff that matters: anonymous-to-known merges, “Added to Cart” firing twice, purchase events losing item-level payloads, or push tokens not attaching to the right profile. 2.2 is worth doing—but only if you validate the tracking contract end-to-end.
How It Works
At a high level, the 2.2 upgrade is about how your app initializes the SDK, identifies users, and sends events so Customer.io can consistently attach behavior to the right person profile. That’s the foundation for cart recovery, post-purchase cross-sell, replenishment, and winback—because those automations are triggered by app events and gated by identity.
- SDK initialization happens early (app start / first page load) so anonymous activity is captured before login.
- Anonymous activity is only useful if it merges when a user logs in or creates an account. That merge depends on a clean
identify()moment and a stable identifier strategy. - Events are your orchestration inputs. If 2.2 changes naming, payload shape, or timing, your segments and journeys can quietly stop qualifying people.
- Device/push tokens must attach to the same profile you’re emailing/SMSing. Otherwise you’ll see “push delivered” on the wrong person or not at all.
Concrete D2C scenario: a shopper browses on mobile, adds a product to cart while anonymous, then logs in at checkout. If your upgrade breaks anonymous merge, Customer.io sees two people: one with the cart event (anonymous) and one with the email/phone (known). Your cart recovery flow won’t fire for the real buyer—even though the event happened.
Step-by-Step Setup
Don’t start in Customer.io first. Start in the app: get 2.2 running, then validate identity + events in the Activity Log, then finally re-enable (or adjust) the journeys that depend on those events.
- Inventory your current tracking contract (2.x)
- List every
identify()call location (login, signup, checkout, post-purchase, app resume). - Export your event names and required properties (e.g.,
product_viewed,added_to_cart,checkout_started,order_completed). - Note which journeys/segments depend on each event.
- List every
- Upgrade the SDK to 2.2 in your app
- Update the dependency version (iOS/Android/Web) and rebuild.
- Confirm initialization runs exactly once per app lifecycle (double-init is a common source of duplicate events).
- Re-validate
identify()timing and identifiers- Call
identify()immediately after you have a stable customer ID (not just an email that might change). - If you support guest checkout, decide whether guest orders map to a persistent ID or remain anonymous—then be consistent.
- Confirm you’re not calling
identify()with different IDs for the same person across sessions (that creates duplicates you’ll later “fix” forever).
- Call
- Confirm anonymous → known merge behavior
- Run a test: browse anonymously → add to cart → log in → verify the cart event appears on the known profile in Customer.io.
- If it doesn’t, fix it now—before you touch campaign logic.
- Send a controlled set of retention-critical events
- Fire test events for: product view, add to cart, checkout start, purchase.
- Validate payload integrity (SKU, quantity, price, currency, order_id, item array). Missing payloads = weak segmentation and bad recommendations.
- Validate device registration (push) on the right profile
- Install app → allow push → log in → confirm the device token is attached to the identified profile.
- Log out → log in as a different user on the same device (common in households) → ensure token moves correctly or you’ll push the wrong person.
- Only then: update segments/journeys if needed
- If event names/properties changed, update segment filters and journey triggers.
- Run journeys in “QA mode” (internal seed list) before broad reactivation.
When Should You Use This Feature
You do the 2.2 upgrade when you care about accuracy and continuity of behavioral tracking—because that’s what makes retention automations dependable. If your current 2.x setup is already shaky (duplicates, missing merges, inconsistent IDs), upgrading is also your best excuse to clean it up.
- Cart recovery that actually matches the shopper: anonymous add-to-cart + later login needs to stitch cleanly or your abandon flows underperform.
- Repeat purchase and replenishment: purchase events need consistent item payloads so you can segment by SKU/category and time since last purchase.
- Reactivation based on real inactivity: if “last activity” is fragmented across duplicate profiles, you’ll spam active customers and miss lapsed ones.
- Cross-device journeys: web browse + mobile purchase (or vice versa) requires identity discipline so Customer.io sees one customer story.
Operational Considerations
Upgrades tend to break in the seams between teams: app engineers ship the SDK bump, but retention depends on the downstream segments, message logic, and attribution staying stable. Plan for data flow verification, not just “it compiles.”
- Segmentation dependencies: audit segments that reference event properties (like
items[0].skuorcart_value). Small schema shifts can zero out audiences. - Identity stitching rules: pick a single primary identifier (internal customer ID) and treat email/phone as attributes. In practice, using email as the ID breaks when customers change emails.
- Event volume and dedupe: if 2.2 changes how lifecycle events fire (app open/resume), you can accidentally inflate “active” signals and suppress winbacks.
- Orchestration realities: if you run cart recovery across email + SMS + push, ensure all channels tie to the same person. Otherwise frequency caps and suppression logic won’t work.
- Environment hygiene: keep dev/staging data out of production workspaces. One leaky build can pollute segments and make QA impossible.
Implementation Checklist
Use this like a release gate. If any item fails, pause the rollout—because the cost shows up later as “email performance dropped” and nobody knows why.
- SDK 2.2 initializes once per app start (no duplicate init)
identify()fires after login/signup with a stable internal customer ID- Anonymous browsing events merge onto the known profile after
identify() - Core retention events fire with correct names and required properties
- Purchase event includes
order_id, totals, currency, and item-level array - Push token/device attaches to the identified profile and behaves correctly on logout/login
- Customer.io Activity Log shows expected sequence (anonymous events → identify → merged history)
- Key segments still populate (cart abandoners, recent purchasers, lapsed customers)
- One cart recovery journey and one post-purchase journey tested end-to-end
Expert Implementation Tips
The difference between “tracking is installed” and “retention works” is usually a handful of operator details. These are the ones that move revenue.
- Standardize event naming before you upgrade: if you already have
AddToCart,added_to_cart, andcart_addin the wild, 2.2 migration is when you consolidate. Otherwise your segments stay brittle forever. - Make cart events idempotent: tie
added_to_cartto a cart line ID or a deterministic hash. This prevents double-fires from UI retries and makes cart recovery audiences cleaner. - Send “cart updated” not just “added”: for D2C, cart value and item mix changes matter. Your abandon message should reflect the latest cart state, not the first add.
- Use internal customer ID as the anchor: keep email/phone mutable. This keeps identity stitching stable across returns, exchanges, and email changes.
- QA with real edge cases: guest checkout, Apple Private Relay emails, household shared devices, and app reinstalls. These are where identity breaks first.
Common Mistakes to Avoid
Most teams don’t “mess up the SDK.” They mess up the operational contract around identity and event schema—then wonder why flows stop converting.
- Calling
identify()too late (after purchase): your cart and browse history stays anonymous, so recovery and discovery journeys miss the moment. - Using email as the primary ID: it creates duplicates when customers update emails or use relay addresses, and it breaks stitching across channels.
- Changing event names without updating segments: audiences silently drop to zero; you only notice after revenue dips.
- Dropping item arrays on purchase: you lose category/SKU repurchase targeting, which is where a lot of D2C LTV comes from.
- Not testing logout/login token behavior: pushes go to the wrong person on shared devices—this is more common than teams think.
- Letting staging builds send production data: it pollutes “lapsed” and “active” signals and makes reactivation targeting noisy.
Summary
Upgrading from 2.x to 2.2 is worth it when you treat it like a retention reliability upgrade: identity first, events second, journeys last. If anonymous merge, purchase payloads, and device identity are solid, your cart recovery and repeat purchase programs get more dependable fast.
Implement 2.2 Upgrade with Propel
If you want to implement 2.2 without risking a week of broken cart recovery or mis-targeted winbacks, we typically run the upgrade like a release: tracking contract audit → identity stitching validation → event/schema QA → journey re-enable. That approach maps cleanly to how Customer.io actually behaves in production, not how we hope it behaves.
If that’s useful, book a strategy call and bring your current event list + where identify() fires—we’ll tell you what will break before it breaks.