Implement Identify in Customer.io SDKs (Without Breaking Retention)

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 running retention in Customer.io, Identify is the difference between “we sent a cart recovery” and “we actually sent it to the right person.” When identity stitching is sloppy, you get duplicate profiles, missing events, and journeys that fire late (or not at all). If you want a second set of eyes on your tracking plan before you scale spend, you can book a strategy call.

In most D2C programs, Identify becomes urgent the moment you introduce logged-in experiences (accounts, subscriptions, loyalty, app-only offers) or you want to connect anonymous browsing to known purchases.

How It Works

At a practical level, Identify is the moment you tell Customer.io: “this device/session belongs to this person.” Everything you track before Identify is effectively anonymous; everything after Identify should roll up into a single person profile (as long as you’re consistent).

  • Anonymous activity first, then stitching: your SDK can track app/web events before login (product views, add to cart, checkout started). Once the user logs in or submits an email/phone, you call identify with a stable identifier so Customer.io can associate future activity with that person.
  • Stable identifier is the whole game: use a single canonical ID (typically your internal customer_id). Email/phone are great attributes, but they’re not always stable (people change them, typo them, or use Apple Private Relay).
  • Profile enrichment happens at identify time: Identify is also where you attach the attributes retention actually needs—timezone, marketing opt-in, loyalty tier, acquisition source, last order date—so segmentation and orchestration don’t depend on fragile event parsing.
  • Device linkage for messaging: on mobile, Identify is what ties the device token to the person so push/in-app targeting works reliably. If you only track events but don’t identify, you’ll see activity but won’t be able to message the user consistently.

Step-by-Step Setup

The goal is simple: track meaningful pre-login behavior, then call Identify exactly when you have a trustworthy ID, and keep that ID consistent across app and web. Most retention issues here come from calling Identify too early, too late, or with the wrong identifier.

  1. Pick your canonical identifier (do this first).
    Use your internal customer ID as the primary ID you pass into Identify. If you don’t have one, generate one server-side at account creation and persist it.
  2. Install the Customer.io SDK(s) on the surfaces you care about.
    Mobile app (iOS/Android/React Native/etc.) and/or web. Make sure both environments can access the same canonical ID after login.
  3. Track pre-login events with clean naming.
    Examples that matter for retention: Product Viewed, Added to Cart, Checkout Started, Search Performed. Keep properties consistent (SKU, price, category, cart_value).
  4. Call Identify at the moment identity becomes real.
    Good triggers: account created, login success, email/phone verified, subscription activated. Avoid identifying on “email field blur” or “started signup”—that’s where garbage data enters.
  5. Send core person attributes with Identify.
    At minimum: email (if you have it), phone (if opted-in), timezone, language, marketing_opt_in, and any retention-critical flags like is_subscriber or loyalty_tier.
  6. Continue tracking events post-identify.
    Now events should land on the known profile and drive journeys (browse abandon, cart recovery, replenishment, winback).
  7. Handle logout explicitly.
    When the user logs out, reset/clear the identified user in the SDK so the next person on that device doesn’t inherit the previous user’s identity.
  8. QA identity stitching in the Activity Log.
    Run a test: browse anonymously → add to cart → login → purchase. Confirm those events appear under one person profile and the anonymous activity is attributed correctly after Identify.

When Should You Use This Feature

Identify matters whenever you need Customer.io to treat multiple sessions/devices as one customer. If you’re serious about retention, you’ll use Identify early—before you build fancy journeys—because broken identity quietly destroys performance.

  • Cart recovery that starts anonymous and finishes logged-in: A shopper adds items on mobile web, then logs into the app to check out. Without Identify on both surfaces, your recovery flow hits the wrong profile (or never triggers).
  • Repeat purchase and replenishment: You need orders and product consumption behavior to roll up to one person so “reorder” nudges don’t spam duplicates.
  • App-only retention programs: Push and in-app need a reliable person↔device mapping. Identify is what makes “VIP early access” actually reach VIPs.
  • Reactivation based on last seen/last purchase: If events are split across profiles, “90-day lapsed” segments become noisy and your winback budget gets wasted.

Real D2C scenario: A skincare brand sees high “Added to Cart” volume in-app but low cart recovery conversion. The root cause is usually identity: guests add to cart, then create an account at checkout. If Identify only happens after purchase, the cart abandon journey never sees a known user to message—so you’re effectively blind during the highest-intent window.

Operational Considerations

Once Identify is live, the work shifts from “does it send?” to “does it segment cleanly and orchestrate predictably?” This is where retention programs tend to break when teams treat identity as a one-time integration instead of a data contract.

  • Segmentation depends on attribute hygiene: If you sometimes identify with email and sometimes with customer_id, you’ll create duplicates and your segments will undercount (or double count). Pick one primary ID and stick to it.
  • Data flow timing affects journey triggers: If Identify fires after the key event (e.g., Checkout Started), your cart recovery trigger might attach to an anonymous profile while Identify attaches later to a different profile. In practice, that shows up as “journey didn’t trigger” tickets.
  • Cross-platform stitching is a retention multiplier: If you have both web and app, ensure the same user ID is available in both and Identify is called on both. Otherwise your “multi-channel” orchestration is really just parallel single-channel programs.
  • Orchestration realities: Plan for edge cases—shared devices, users who reinstall the app, users who change email, and users who check out as guest then later create an account. Decide how you want those identities handled before you’re debugging a 20-step winback flow.

Implementation Checklist

If you want Identify to actually improve retention outcomes (not just “send data”), validate the basics below before you build or refactor journeys.

  • Canonical ID chosen (prefer internal customer_id) and documented
  • Identify called on login/account creation/verification—never on partial or unverified inputs
  • Core attributes included at identify time (email/phone/timezone/opt-in/status flags)
  • Pre-login events tracked with consistent names and properties
  • Logout clears identity in the SDK
  • QA path confirms anonymous → identified stitching in Customer.io Activity Log
  • Duplicate profile monitoring plan (spot-check weekly while rolling out)

Expert Implementation Tips

These are the small operator moves that keep identity clean as you scale spend, channels, and surfaces.

  • Identify once per session, not on every screen: Repeated identify calls aren’t usually fatal, but they add noise and can mask timing issues. Call it on a clear auth boundary.
  • Send “truth” attributes from your backend when possible: Subscription status, lifetime orders, and VIP tier are better sourced server-side than inferred from client events.
  • Version your event schema early: If you’re changing property names (e.g., skuproduct_id), you’ll break segments and journeys quietly. Keep a mapping doc and migrate deliberately.
  • Make identity stitching observable: Create an internal QA segment like “Identified in last 24h AND Added to Cart in last 24h” and spot-check profiles. It catches drift fast.

Common Mistakes to Avoid

Most “Customer.io isn’t working” problems in retention are really “identity isn’t consistent.” These are the patterns that cause the most damage.

  • Using email as the primary ID everywhere: It feels convenient until Apple Private Relay, typos, or email changes create duplicates and split purchase history.
  • Identifying on unverified inputs: If someone types an email on a popup but never confirms, you just created a person who will soak up anonymous events and pollute segments.
  • Calling Identify after the key funnel event: If Identify happens after Added to Cart or Checkout Started, your highest-intent triggers may never attach to the known profile.
  • Forgetting logout/reset on shared devices: This is how you end up sending “We miss you” to the wrong household member.
  • Letting web and app use different identifiers: You’ll think you have omnichannel coverage, but you’re messaging two partial profiles.

Summary

If your SDK Identify calls are consistent and timed correctly, Customer.io journeys behave like a retention system instead of a collection of disconnected triggers. If identity is messy, you’ll waste sends on duplicates and miss the moments that drive repeat purchase.

Implement Identify first, QA stitching second, and only then scale cart recovery, replenishment, and winback automation.

Implement Identify with Propel

If you’re rolling out Identify across app + web and want to avoid the usual duplicate-profile and “missing event” traps, it helps to treat identity like a retention-critical data contract—not a one-off SDK task. We’ve seen teams move faster by pressure-testing their identifier choice, identify timing, and event schema before they rebuild journeys in Customer.io.

If you want a practical review of your current implementation and the exact calls/events to prioritize for cart recovery and repeat purchase, book a strategy call.

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