Summarize this documentation using AI
Overview
If you’re moving from 3.x to 3.4, treat it less like a “library bump” and more like a retention data integrity project. Most revenue-impacting automations in Customer.io depend on clean identity stitching and consistent event payloads—and SDK upgrades are where that quietly breaks. If you want a second set of eyes on your tracking plan before you ship, book a strategy call and we’ll pressure-test it like an operator would.
The goal of this update is simple: keep your app-side identify calls, device registration, and event schema stable so your cart recovery, replenishment, and winback campaigns don’t lose triggers or mis-attribute users.
How It Works
At runtime, the Customer.io SDK does three retention-critical jobs: (1) it ties a device/session to a person via identify, (2) it sends behavioral events via track that power segments and journey triggers, and (3) it helps Customer.io stitch anonymous pre-login activity to a known customer once they log in.
- Installation/initialization sets up the SDK and any required modules (push/in-app) so device tokens and app lifecycle signals can be captured reliably.
- Identity stitching happens when you move a user from anonymous → known. In practice, this is where teams lose revenue: if you
identifytoo late (or inconsistently), your “Viewed Product → Added to Cart → Checkout Started” chain won’t belong to the right profile. - Event tracking is your retention engine. Your campaigns don’t run on “the app exists”—they run on specific events like
product_viewed,add_to_cart,checkout_started,purchase, and “soft” intent likesearchorcategory_viewed.
A realistic D2C scenario: a shopper browses products while logged out, adds an item to cart, then logs in at checkout. If you don’t stitch anonymous activity correctly during the upgrade, your cart abandonment flow will either (a) never trigger, or (b) trigger on an anonymous profile that can’t be messaged—both look like “email underperformed” when it’s really tracking.
Step-by-Step Setup
Plan the upgrade like a release: lock your event schema first, then update the SDK, then validate identity + events in a staging build before you touch any live journeys. The exact code differs by platform (iOS/Android/React Native/etc.), but the operator workflow is consistent.
- Inventory your current tracking contract.
Export or document your currentidentifyfields (customer ID, email/phone if used, loyalty tier, last purchase date) and your top revenue events (cart, checkout, purchase). This is your “do not break” list. - Update the SDK dependency to 3.4 in your app.
Bump the version in your package manager (SPM/CocoaPods/Gradle/npm depending on your stack) and rebuild. Keep this change isolated in a PR so you can roll back quickly if needed. - Re-confirm SDK initialization happens exactly once.
Initialize on app start (not per screen). Multiple initializations are a common cause of duplicate events and flaky device registration—both poison segmentation. - Verify
identifyruns at the right time.
Callidentifyimmediately after authentication (and also on app launch if you persist a logged-in session). Use a stable customer identifier (your internal user ID) as the primary key. Don’t rotate identifiers. - Re-validate anonymous → known stitching.
In most retention programs, we’ve seen this break when teams refactor login flows during an SDK upgrade. Test: browse logged out, fireproduct_viewedandadd_to_cart, then log in and ensure subsequent events and the cart state sit on the same person in Customer.io. - Confirm event names and payloads didn’t drift.
If you changeadd_to_carttoadded_to_cart“for consistency,” your existing campaigns won’t magically follow. Keep names stable or update every downstream trigger/segment. - Test push/in-app device registration if you use them.
If your retention stack includes push for cart recovery or replenishment reminders, verify device tokens are still being captured after the upgrade and tied to the identified user. - Run a staging-to-prod validation pass.
Send test events from a QA build, then check Customer.io Activity Logs for: correct person, correct event name, correct timestamp, and expected attributes.
When Should You Use This Feature
SDK updates are worth prioritizing when your retention performance depends on app behavior—especially when email alone isn’t carrying the program. If the app is your main shopping surface, your SDK is effectively your “retention sensor.”
- Cart recovery in mobile-first shopping. You need reliable
add_to_cartandcheckout_startedevents plus identity stitching when customers log in late. - Repeat purchase and replenishment. Accurate
purchaseevents (with items, categories, and timestamps) let you build “bought X, hasn’t bought again in Y days” segments without guesswork. - Reactivation based on real inactivity. If your “inactive 30 days” segment is built on app events, an SDK regression can accidentally mark active users as inactive and spam them with winbacks.
- Product discovery automations. Browse and search events (category viewed, search query, product viewed) power the kind of personalized follow-up that lifts AOV and repeat rate.
Operational Considerations
The upgrade itself is straightforward; the operational risk is downstream. Retention systems are brittle because segments, journeys, frequency rules, and attribution all assume your tracking is consistent.
- Segmentation dependencies: Audit which segments reference app events/attributes. If a segment uses “did
add_to_cartin last 4 hours,” even a small timestamp or naming change will drop users out. - Data flow timing: Mobile networks are messy. If events queue and flush later, your “send within 30 minutes” cart recovery logic may miss the window. Validate event delivery latency post-upgrade.
- Identity resolution rules: Decide what is authoritative: internal user ID vs email vs phone. In practice, this tends to break when apps identify by email in one place and by user ID in another—creating duplicates and splitting LTV across profiles.
- Orchestration realities: If you run multi-channel (email + push + SMS), your suppression logic depends on unified profiles. Any duplicate-person spike after the upgrade will increase over-messaging and hurt deliverability.
Implementation Checklist
Use this as your release gate. If you can’t check these off, you’re not “done”—you’re just hoping nothing breaks in revenue-critical flows.
- SDK updated to 3.4 and initialization confirmed to run once per app lifecycle
identifycalled on login and on app start for persisted sessions- Stable identifier chosen (prefer internal user ID) and used consistently
- Anonymous browsing → login flow tested and verified in Customer.io person activity
- Top retention events validated:
product_viewed,add_to_cart,checkout_started,purchase - Event payloads validated (sku, product_id, price, quantity, currency, cart_id/order_id)
- Push/in-app device registration verified (if applicable)
- Key segments and journeys smoke-tested against real test profiles
Expert Implementation Tips
This is the stuff that keeps your retention program from quietly bleeding after an SDK change—even when “everything compiles.”
- Version your event schema internally. Keep a simple tracking spec doc and treat it like an API. When marketing asks for a new attribute, add it without renaming existing keys.
- Send a cart identifier early. For cart recovery, include
cart_id(or a stable cart token) onadd_to_cartandcheckout_started. It makes deduping and “latest cart wins” logic much easier. - Track value on purchase in a consistent format. Pick one: integer cents or decimal dollars—then stick to it. Inconsistent revenue formats break LTV segments and post-purchase branching.
- Use a QA journey as a canary. Create a private internal journey that triggers on your key events and pings Slack/email. After the upgrade, you’ll see immediately if events stopped or duplicated.
Common Mistakes to Avoid
Most “SDK upgrade issues” show up as retention performance drops a week later. These are the usual culprits.
- Renaming events during the upgrade. Even “small cleanup” changes force you to update every trigger, segment, and report that references the old name.
- Calling
identifywith different identifiers across platforms. iOS identifies by user ID, Android identifies by email—now you have two people and half the events on each. - Identifying too late in the funnel. If you only identify on purchase, your cart recovery and browse follow-ups won’t have a messageable profile at the time it matters.
- Not testing offline/poor network behavior. Events can batch and arrive late; if your journeys depend on tight windows, validate delivery timing.
- Ignoring duplicates after release. A spike in duplicate profiles is a red alert for over-messaging, broken suppression, and messy attribution.
Summary
Update to 3.4 when you can validate identity stitching and event consistency end-to-end—not just that the app builds. If your key retention journeys depend on app events, treat this as a revenue release with a tracking QA plan.
Implement Update To 3.4 with Propel
If you’re coordinating an SDK bump alongside new journeys (cart recovery refresh, replenishment, winback), it’s worth running the upgrade with a tight tracking spec and a staging validation pass. We’ll map your app-side events to the segments and triggers you actually use in Customer.io, then help you QA identity stitching so you don’t ship silent breakage. If that would help, book a strategy call and we’ll walk through your current 3.x setup and the safest path to 3.4.