Upgrade Customer.io SDK 3.x to 3.13.0

Customer.io partner logo

Table of Contents

Summarize this documentation using AI

This banner was added using fs-inject

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Overview

If you’re upgrading your app tracking, the goal isn’t “latest SDK” — it’s getting cleaner identity stitching and more reliable events feeding Customer.io so your retention automations stop leaking users. If you want a second set of eyes on your tracking plan before you ship, book a strategy call and we’ll pressure-test the upgrade against your cart recovery, repeat purchase, and reactivation flows.

In most retention programs, an SDK upgrade pays off when it eliminates duplicate profiles, fixes missing purchase events, and makes anonymous-to-known behavior usable (especially on mobile where logins happen late).

How It Works

Upgrading from 3.x to 3.13.0 is mostly about tightening the contract between your app and Customer.io: how you initialize the SDK, how you identify a user, and how you track events so Journeys can reliably segment and trigger.

  • Initialization: the SDK boots early in the app lifecycle so sessions, device info, and pre-login behavior can be captured consistently.
  • Identity stitching: you start anonymous (device-based) and then explicitly stitch activity to a known profile when the user logs in or provides an email/phone. This is the difference between “we sent an abandon cart push” and “we sent it to the right person.”
  • Event tracking: your app sends structured events (e.g., product_viewed, add_to_cart, checkout_started, order_completed) with properties Customer.io can use for segmentation, message personalization, and conversion reporting.
  • Attribute updates: you keep the person profile current (email, phone, marketing opt-in, last order date, LTV, preferred category) so your suppression and VIP logic works without hacks.

Step-by-Step Setup

Treat this like a tracking migration, not a “dev dependency bump.” The fastest way to break retention is to ship an upgrade that changes when identify fires or alters event names/properties your campaigns already depend on.

  1. Inventory what retention depends on today
    Pull a list of the events and attributes referenced in: cart abandonment, post-purchase, replenishment, winback, and paid media suppression segments. Write down exact event names and property keys (case-sensitive).
  2. Upgrade the SDK to 3.13.0 in your app
    Update your iOS/Android (or cross-platform) dependency to 3.13.0 and ship behind a feature flag if you can. The flag is less about UX and more about preventing data chaos if identity changes.
  3. Initialize early and consistently
    Ensure SDK initialization happens once, as early as practical (app launch / application class). In practice, this tends to break when teams initialize per-screen or after auth, which causes missing sessions and inconsistent device linkage.
  4. Standardize your identity rules
    Decide what counts as the canonical identifier (usually your internal customer_id). Then:
    • Call identify immediately after login/signup success.
    • If a user logs out, reset identity appropriately so the next user on the device doesn’t inherit the previous user’s events.
    • When you collect email/phone before account creation (common in D2C for “send my cart” or “text me my code”), stitch that to the same profile you’ll later identify with customer_id.
  5. Keep event names stable (or migrate intentionally)
    If your existing flows trigger on Added to Cart and you rename it to add_to_cart, your cart recovery dies silently. Either keep names identical or run a dual-track period where you send both old and new events until campaigns are migrated.
  6. Send commerce events with retention-grade properties
    For each key event, include properties that make segmentation and personalization possible:
    • product_viewed: sku, product_id, category, price
    • add_to_cart: cart_id, sku, quantity, cart_value
    • checkout_started: cart_id, cart_value, items_count
    • order_completed: order_id, revenue, discount, items (as JSON), shipping_country
    The point is to avoid “event happened” data that can’t drive targeting.
  7. Validate in Customer.io before full rollout
    Use Activity Logs and a known test device/account to confirm: anonymous events appear, identity merges correctly after login, and events land with the right properties.
  8. Backstop with a regression dashboard
    Track daily counts for the events your retention relies on (add_to_cart, checkout_started, order_completed) and the ratio of anonymous vs identified. If order_completed drops 20% after the release, you want to know today — not after revenue dips.

When Should You Use This Feature

An SDK upgrade is worth prioritizing when your retention performance is capped by tracking quality, not by creative or offer strategy. If you’re seeing “ghost” abandoners, duplicate profiles, or missing purchase events, 3.13.0 is usually a forcing function to clean it up.

  • Cart recovery that currently misfires: users add to cart on mobile, log in later, and your abandon flow targets the anonymous profile instead of the purchaser.
  • Repeat purchase and replenishment: you need reliable order_completed timestamps and SKU/category properties to time replenishment and cross-sell correctly.
  • Reactivation after app churn: you need accurate last activity and a consistent identity so “inactive 30 days” doesn’t include people who simply switched devices.
  • Omnichannel suppression: you want to stop sending “finish checkout” SMS to people who already purchased in-app, which requires low-latency purchase tracking.

Real D2C scenario: A skincare brand drives most mobile traffic from TikTok. Shoppers browse anonymously, add a bundle to cart, then create an account at checkout. If identify fires late or doesn’t merge anonymous activity, Customer.io sees two people: the anonymous abandoner and the known purchaser. Result: the purchaser still gets a 10% off abandon SMS, training discount behavior and burning margin. A clean 3.13.0 upgrade paired with strict identify/merge rules fixes that.

Operational Considerations

Most teams get the SDK “working” and still end up with messy orchestration because the data model isn’t designed for segmentation and Journey logic. Think through how the app emits events, how Customer.io resolves identity, and how campaigns consume those signals.

  • Segmentation stability: avoid building segments on fragile properties (like UI screen names). Prefer durable commerce fields (sku, category, cart_value, last_order_date).
  • Anonymous-to-known timing: decide the moment you consider someone “marketable.” If you collect email pre-checkout, you can start cart recovery earlier — but only if you stitch correctly to the eventual customer_id.
  • Data flow latency: if purchase events arrive late (offline mode, background restrictions), your suppression logic can fail. Build Journeys with short grace periods where needed (e.g., wait 15 minutes before sending the first abandon message, then re-check purchase).
  • Event orchestration realism: don’t trigger three flows off the same event without clear priorities. For example, order_completed should suppress abandon, start post-purchase, and update VIP status — but those should be coordinated so the customer doesn’t get conflicting messages.
  • Identity collisions: shared devices (tablets in retail, family phones) can create cross-account contamination if logout/reset isn’t handled. This shows up as “wrong name” personalization and is brutal for trust.

Implementation Checklist

Before you consider the upgrade “done,” you want proof that tracking supports retention execution — not just that the SDK compiles.

  • SDK updated to 3.13.0 and initialized once per app lifecycle
  • identify fires on login/signup success with canonical customer_id
  • Logout/reset behavior prevents cross-user event leakage on shared devices
  • Anonymous pre-login events successfully stitch to the identified profile
  • Core retention events tracked with consistent names and required properties
  • Purchase event arrives quickly enough to suppress abandon flows
  • Customer.io Activity Logs show correct event payloads for test users
  • Segments and Journeys updated (or dual-tracked) if any event names changed
  • Post-release monitoring in place for event volume + anonymous/identified ratio

Expert Implementation Tips

The upgrade goes smoothly when you treat identity and naming as a contract across app, data, and messaging. The teams that win here usually do a short dual-track period and migrate campaigns deliberately.

  • Run a “shadow” validation user: keep one internal test account that you run through browse → add to cart → login → purchase every release. It catches identity regressions fast.
  • Use a single naming convention: pick snake_case for events/properties and enforce it. Mixed casing is a silent segment killer.
  • Send item arrays as JSON consistently: if items is sometimes a string and sometimes an array, Liquid templates and segment rules become brittle.
  • Design for suppression first: in cart recovery, suppression accuracy matters more than the first message timing. Build the tracking so order_completed is the most reliable event in your system.
  • Don’t over-identify: avoid calling identify on every app open. Identify when you have a strong user signal (auth) and update attributes separately when needed.

Common Mistakes to Avoid

Most retention tracking failures aren’t dramatic — they’re small inconsistencies that compound into bad targeting and wasted spend.

  • Renaming events without migrating campaigns: your flows keep running, but nobody enters them.
  • Identifying too late: if identify happens after checkout, you lose the entire abandon window and your “viewed product” personalization won’t work.
  • Not resetting on logout: the next user inherits the previous user’s device identity and gets the wrong messages.
  • Tracking revenue inconsistently: sending revenue as a string sometimes and a number other times breaks reporting and VIP segmentation.
  • Missing cart identifiers: without cart_id, you can’t dedupe or reason about multi-cart behavior, and cart recovery becomes noisy.
  • Forgetting opt-in state: pushing SMS to people without valid consent because the app never updates subscription/consent attributes.

Summary

If your retention flows depend on app behavior, upgrading to 3.13.0 is really an identity + event quality project. Do it when you’re ready to lock down naming, stitch anonymous to known cleanly, and protect suppression logic. If you can’t validate those three things, the upgrade tends to create more noise than lift.

Implement 3.13.0 Upgrade with Propel

If you’re running retention seriously, the upgrade is a good moment to standardize your tracking contract and clean up the segments and Journeys that depend on it inside Customer.io. If you want help mapping your app events to the exact triggers, suppression rules, and identity stitching your program needs, book a strategy call and we’ll walk through your current instrumentation and the safest rollout plan.

Contact us

Get in touch

Our friendly team is always here to chat.

Here’s what we’ll dig into:

Where your lifecycle flows are underperforming and the revenue you’re missing

How AI-driven personalisation can move the needle on retention and LTV

Quick wins your team can action this quarter

Whether Propel AI is the right fit for your brand, stage, and stack