Identify people with the Customer.io SDK (so your retention actually targets the right customer)

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 want retention to work in Customer.io, you need clean identity. “Identify” is the moment you stop treating someone like a random device/session and start treating them like a customer you can segment, suppress, and message across channels. If you want a second set of eyes on your tracking plan before it becomes a permanent mess, book a strategy call and we’ll pressure-test it like an operator would.

In most D2C programs, the biggest hidden leak is mis-stitched users: one person shows up as three profiles (web guest, iOS app user, email clicker). That breaks cart recovery, post-purchase flows, and winbacks because you’re messaging the wrong “person” or suppressing the wrong profile.

How It Works

At a mechanical level, the SDK starts by tracking activity anonymously (device/app instance). Once the shopper logs in, creates an account, or you otherwise know who they are, you call identify to attach a stable customer identifier to that activity. From that point on, events and attributes roll up to the identified person, which is what Customer.io uses for segmentation and orchestration.

  • Anonymous first, identified later: Most apps see a bunch of browsing and add-to-cart events before login. The SDK can capture that anonymously, then you stitch it to the customer when you identify.
  • Identity stitching is the goal: The “win” is that the same person is recognized across sessions/devices so your cart abandon, replenishment, and reactivation flows don’t fork into duplicates.
  • Attributes live on the person: Email, phone, loyalty tier, last order date, LTV, push permission status—these become the fields you actually segment on. Identify is typically when you set/update the critical ones.
  • Events power timing: Your SDK events (Viewed Product, Added to Cart, Started Checkout, Purchased) become triggers and filters. If Identify is wrong, those events land on the wrong profile and your triggers misfire.

Real D2C scenario: A shopper adds a product to cart on mobile web, then installs your app and logs in to check shipping. If you don’t stitch identity correctly, you’ll send them a cart abandon email from the web profile while also sending a “welcome” push from the app profile—two disjointed experiences, one annoyed customer.

Step-by-Step Setup

Don’t start by wiring SDK calls randomly. Start by deciding what your “source of truth” customer ID is (Shopify customer ID, internal user ID, etc.) and where in the app lifecycle you can reliably call identify. Then implement in this order so you don’t create duplicate profiles you’ll spend months cleaning up.

  1. Install the appropriate Customer.io SDK
    • Pick your platform SDK (iOS/Android/React Native/Flutter/Web) and complete the base initialization.
    • Verify the SDK is sending at least one baseline event/session so you know data is flowing before you add identity.
  2. Define your identity key (don’t wing this)
    • Choose a stable customer identifier you control (e.g., internal user_id). Avoid email as the primary ID if emails can change.
    • Decide how you’ll handle guest checkout (often: create an account behind the scenes, or identify only once email is confirmed).
  3. Call identify at the right moment
    • Trigger identify on login, account creation, or verified email capture—where you’re confident the person is real and consistent.
    • Include the key attributes you’ll segment on immediately (email, phone, timezone/country if you use send-time windows, marketing opt-in flags).
  4. Track your retention-critical events after identify
    • Implement events that map to money: Product Viewed, Added to Cart, Checkout Started, Order Completed.
    • Send event properties you’ll actually use in flows: SKU, product name, category, cart value, currency, quantity, discount code, etc.
  5. Validate stitching and duplication before scaling
    • Test a full journey: browse anonymously → add to cart → login → purchase.
    • Confirm events appear on a single person profile after identify (not split across an anonymous profile and an identified profile).
  6. Set rules for logout and user switching
    • Plan for shared devices: if user A logs out and user B logs in, your SDK must not keep attributing events to user A.
    • Implement the SDK’s reset/clear identity behavior on logout (platform-specific) so you don’t cross-contaminate profiles.

When Should You Use This Feature

Identify isn’t “nice to have.” If you’re running any retention program beyond basic newsletters, you need it to keep your messaging coherent across sessions and devices.

  • Cart recovery across devices: When add-to-cart happens anonymously but the conversion happens after login (or in-app), identify is what prevents duplicate or mistimed abandon messages.
  • Post-purchase upsell/cross-sell: You can’t reliably suppress buyers or target category purchasers if purchase events land on a different profile than the email address you’re messaging.
  • Reactivation and winback: If a “lapsed” segment is built on last purchase date, identity splitting makes active customers look lapsed (and you’ll send discounts to people who just bought).
  • Multi-channel orchestration (email + push + SMS): Identity is the backbone for frequency control and channel fallback (e.g., push first, then email if unopened).

Operational Considerations

In practice, the technical part is easy; the operational part is where teams get burned. If your identity rules aren’t consistent, segmentation becomes unreliable and journeys become noisy.

  • Segmentation depends on consistent IDs: Pick one canonical ID and stick to it everywhere (SDK, backend, any server-side events). Mixing IDs (email sometimes, user_id other times) is how duplicates happen.
  • Data flow timing matters: If you trigger a cart abandon journey on “Added to Cart,” but identify only happens later, your journey may start on an anonymous profile. Decide whether to (a) delay entry until identify, or (b) ensure anonymous activity merges cleanly on identify.
  • Attribute governance: Decide which system owns which fields. Example: backend owns LTV/last_order_date; app owns push permission/device tokens. If both write the same attribute, you’ll see flickering values and broken segment membership.
  • Orchestration realities: Frequency caps and suppression logic only work when purchases and identities are unified. Otherwise you’ll “suppress” one profile and keep sending on the duplicate.
  • QA like a retention operator: Don’t just check that events fire—check that your high-value segments (VIP, recent purchasers, cart abandoners) populate correctly after real user behavior.

Implementation Checklist

Before you call this “done,” you want confidence that identity is stable, events land on the right profile, and your core retention segments won’t drift.

  • SDK installed and sending baseline activity
  • Canonical customer ID chosen (not email unless you’ve accepted the tradeoffs)
  • Identify called on login/account creation/verified email capture
  • Critical attributes set on identify (email, phone, opt-in flags, locale/timezone if needed)
  • Retention events implemented with usable properties (SKU, value, category, etc.)
  • Anonymous-to-known stitching verified with a real test journey
  • Logout/reset behavior implemented to prevent cross-user contamination
  • Core segments validated (recent purchasers, cart abandoners, lapsed customers)

Expert Implementation Tips

These are the small decisions that keep your retention program from getting brittle six months from now.

  • Identify earlier than you think—but only when it’s trustworthy: Capturing email in an app modal can be enough for identify if you validate it (double opt-in or verification). If it’s low-quality, you’ll stitch the wrong person and poison your data.
  • Standardize event names and properties: “added_to_cart” vs “AddToCart” becomes a silent segmentation bug. Lock a naming convention and document the required properties per event.
  • Send purchase from the backend when possible: App-side purchase events can be dropped on flaky connections. For revenue-critical triggers (purchase, refund), server-side is usually more reliable—then the SDK focuses on behavioral intent (views, add-to-cart).
  • Use identify to keep channel permissions current: When a customer changes phone number or toggles SMS opt-in, update the person immediately so you don’t keep blasting a stale channel.

Common Mistakes to Avoid

Most “Customer.io isn’t working” complaints are actually identity problems showing up downstream as bad performance.

  • Using email as the ID and then changing it: You’ll create a new person instead of updating the existing one, which breaks purchase history and suppressions.
  • Calling identify with different IDs on different platforms: iOS uses user_id, web uses email → you’ve just created two customers.
  • Triggering journeys before identity is set: Cart abandon starts on an anonymous profile, then never connects to the known customer you want to email/SMS.
  • Not resetting identity on logout: Shared devices (or even just account switching) will leak events and attributes across people, wrecking segmentation.
  • Tracking events without the properties you need: “Added to Cart” with no SKU/category/cart value means you can’t personalize recovery or filter out low-intent carts.

Summary

If you want reliable cart recovery, repeat purchase, and winback flows, identity has to be boringly consistent. Implement identify around a stable customer ID, stitch anonymous behavior cleanly, and validate that events land on one profile. Once that’s true, everything else in Customer.io gets easier—and performs better.

Implement Identify with Propel

If you’re rolling this out across app + web and you care about not creating duplicates you’ll fight forever, it helps to treat identity like a retention system—not just an SDK task. We’ll map your canonical ID, decide where identify should fire, and QA stitching against the segments and journeys you actually run in Customer.io. When you’re ready, book a strategy call and we’ll walk through your tracking and orchestration plan end-to-end.

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