Summarize this documentation using AI
Overview
If your retention program depends on clean cart, browse, and purchase signals, the 3.x → 3.13.0 upgrade is less about “new SDK version” and more about protecting identity stitching and event reliability in Customer.io. If you want a second set of eyes before you ship changes that affect attribution, suppression, and recovery flows, book a strategy call—most tracking regressions don’t show up until revenue dips.
In most D2C stacks, this upgrade touches the exact moments that drive money: anonymous browsing → login, add-to-cart → checkout start, and purchase confirmation. If any of those break, your cart recovery and post-purchase journeys quietly underperform.
How It Works
At a practical level, upgrading to 3.13.0 is about keeping three things consistent across app releases: who the user is (identity), what they did (events), and when it happened (timestamps/order). That’s what determines whether Customer.io can correctly trigger and suppress retention messages.
- Identity stitching: Your app typically tracks activity anonymously before a user logs in. The critical moment is the
identify()call—done correctly, it merges anonymous events (likeProduct ViewedandAdd to Cart) onto the known profile so cart recovery can fire with the right products and not double-message. - Event tracking: Your retention workflows usually trigger off a small set of canonical events (e.g.,
Product Viewed,Add to Cart,Checkout Started,Order Completed). The upgrade must preserve event names, required properties, and ordering so existing segments and campaigns don’t silently stop matching. - Device/channel continuity: SDK upgrades can impact device token registration (push) and app lifecycle tracking. If tokens don’t attach to the right person after identify, you’ll see “delivered” counts drop or pushes land on the wrong device profile.
Real D2C scenario: A shopper browses anonymously, adds a product to cart, then logs in at checkout. If your upgrade changes when identify() runs (or you accidentally call it with a different ID than before), Customer.io may treat them as two people. Result: the cart abandonment journey triggers off the anonymous profile, while the purchase event lands on the logged-in profile—so you send a “You left items behind” email to someone who already bought.
Step-by-Step Setup
Plan this upgrade like a revenue-sensitive release, not a routine dependency bump. The fastest path is: lock down your identity contract, verify event parity, then validate in a staging workspace (or at least with test profiles) before rolling out.
- Inventory your current tracking contract (before touching code).
- Export or document current event names and their required properties (cart items, product IDs, order IDs, revenue, currency, etc.).
- Document your person identifier strategy (customer ID vs email) and where
identify()is called today (app launch, login, checkout, etc.).
- Upgrade the SDK dependency to 3.13.0 in your app.
- Keep the upgrade isolated in a single PR so you can diff behavior cleanly.
- Don’t “clean up” event naming in the same release—parity first, refactors later.
- Re-confirm initialization happens once and early.
- Initialize the SDK at app start (not lazily on first event), otherwise early-session browse/cart events may never send.
- Avoid multiple initializations across app processes/screens; that’s a common source of duplicate events.
- Harden your
identify()flow (this is where retention breaks most often).- Call
identify(userId, attributes)immediately after login/signup success. - Use a stable, immutable ID (internal customer ID). Avoid using email as the primary identifier if it can change.
- If a user logs out, call the appropriate reset/clear method so the next user on the device doesn’t inherit the prior identity.
- Call
- Validate event parity with real user paths.
- Run through: anonymous browse → add to cart → login → checkout → purchase.
- Confirm events arrive under one person profile after login (not split across anonymous + known).
- Confirm event payloads still include the properties your templates/segments reference (SKU, variant, price, quantity, cart_id, order_id).
- Verify push token attachment after identify.
- Send a test push to a known profile and confirm it lands on the current device.
- If you support multiple devices per user, confirm you’re not overwriting tokens incorrectly.
- Roll out with a staged release.
- Start with internal QA → small percentage → full rollout.
- Watch for changes in: cart abandonment entry volume, purchase suppression accuracy, and duplicate event counts.
When Should You Use This Feature
SDK upgrades are worth prioritizing when the app is a primary revenue channel and your retention flows depend on real-time behavioral triggers. If you’re seeing gaps in cart recovery or post-purchase personalization, this is often where the leak starts.
- Cart recovery is under-firing: Add-to-cart events aren’t consistently arriving (or arrive anonymously and never merge), so fewer users enter abandonment journeys than expected.
- Repeat purchase journeys feel “generic”: Product/variant properties aren’t attached reliably, so you can’t drive replenishment or cross-sell based on what someone actually bought.
- Reactivation is noisy: Identity issues inflate your “inactive” segment because activity is being tracked on a different profile than the one you message.
- You’re adding new app surfaces: If you’re launching new PDP layouts, bundles, subscriptions, or a loyalty wallet, you want the latest stable tracking behavior before you scale triggers.
Operational Considerations
The SDK upgrade is only half the job. The other half is making sure the data that lands in Customer.io still supports segmentation and orchestration the way your program is built today.
- Segmentation depends on consistency: If you change event names/properties during the upgrade, your “Added to cart in last 2 hours” or “Viewed product but not purchased” segments can drop to zero without any obvious error.
- Data flow timing matters: Mobile SDK events can arrive out of order when users go offline. If your purchase event lands late, suppression logic (stop cart emails after purchase) can fail. In practice, this tends to break when you rely on tight delays (like 15–30 minutes) without a buffer.
- Anonymous → known merge is the revenue hinge: Treat the identify moment as a release gate. If you don’t see anonymous events stitched onto the known profile in testing, don’t ship.
- Orchestration reality: If you run email + push + SMS, identity mismatches create channel skew (e.g., push goes to one profile, email to another). That shows up as “random” performance drops by channel.
Implementation Checklist
Use this as a pre-flight before rollout. It’s the set of checks that tends to prevent the expensive failures: broken suppression, duplicated messages, and missing revenue attribution.
- SDK updated to 3.13.0 and initialized once at app start
identify()called immediately after login/signup with a stable customer ID- Logout/reset clears the prior identity on shared devices
- Event names match existing production names exactly (case/spacing included)
- Event properties required by templates/segments still present (SKU/variant/price/order_id/cart_id)
- Anonymous browse/cart events merge into the known profile after identify
- Push token attaches to the correct person after identify
- Cart abandonment journey entry volume matches expectation in a small rollout cohort
- Purchase suppression works (no cart emails after order completed)
Expert Implementation Tips
These are the operator moves that keep retention stable while you upgrade—and make it easier to debug if anything slips.
- Create a “tracking QA” test account: One internal user that runs through browse → cart → checkout every release. Keep the same ID forever so you can compare behavior over time.
- Add a version stamp to events: Include
app_version(and optionallysdk_version) as an event property during rollout. When performance changes, you can segment by version instead of guessing. - Guard against duplicate firing: Add-to-cart is notorious for double events (button tap + state update). Deduplicate client-side using a cart line item hash or a single “cart_updated” event with full cart state.
- Keep purchase canonical: Only fire
Order Completedonce you have a confirmed order ID and final totals. If you fire on “payment attempted,” you’ll inflate revenue and break suppression.
Common Mistakes to Avoid
Most issues aren’t “SDK bugs”—they’re identity and instrumentation drift introduced during the upgrade. Avoid these and your retention flows usually stay intact.
- Changing identifiers mid-upgrade: Switching from email → customer_id (or vice versa) without a migration plan creates duplicate people and wrecks deliverability/suppression logic.
- Calling
identify()too late: If you identify only after checkout, you lose the ability to stitch pre-login browse/cart behavior to the profile you message. - Renaming events “for cleanliness”: Even small changes (like
AddToCart→Add to Cart) break segments and triggers immediately. - Forgetting logout/reset: Shared devices (tablets in retail, family iPads) will leak one user’s behavior into another user’s profile if you don’t clear identity.
- No suppression validation: Teams test that cart emails send—but don’t test that they stop after purchase. That’s how you end up discounting customers who already converted.
Summary
Upgrading to 3.13.0 is worth it when you treat it like a retention infrastructure change: identity first, event parity second, rollout with QA signals. If your anonymous-to-known stitching stays intact, your cart recovery and post-purchase flows usually improve just from cleaner data.
Implement 3.13.0 Upgrade with Propel
If you’re running retention at scale, the fastest path is usually: we review your current SDK instrumentation, define the identity contract, and QA the upgrade against the journeys that make you money inside Customer.io. When you’re ready, book a strategy call and we’ll map the upgrade to your cart recovery, repeat purchase, and reactivation flows—so you don’t find out something broke after the next send.