Summarize this documentation using AI
Overview
If you’re running retention in Customer.io, Identify is the moment your data stops being “a device did something” and starts being “this customer did something.” When Identify is implemented cleanly, cart recovery and post-purchase flows stop leaking because events, devices, and profiles finally line up. If you want a second set of eyes on your identity plan before you scale spend and messaging, book a strategy call.
In most D2C programs, the biggest win isn’t “more events”—it’s fewer mismatched users. Identify is how you stitch app sessions, web sessions, and logged-in behavior into one profile so segmentation and orchestration don’t break the moment someone logs in or checks out.
How It Works
At a practical level, the SDK starts by tracking activity anonymously (device/app instance). Once you know who the person is (login, account creation, email capture, checkout), you call Identify with a stable identifier and optional attributes. From that point forward, events should attach to the known profile, and any earlier anonymous activity can be associated depending on your implementation pattern.
- Anonymous first: the SDK can collect events before you know the user (product views, add-to-cart, browse depth).
- Identify call: you send a unique person identifier (usually your internal user ID) and optionally set traits like
email,phone,first_name,accepts_marketing,lifetime_value, etc. - Identity stitching: the key operational outcome is that future events, device tokens (push), and message eligibility roll up to one person—so “Viewed Product → Abandoned Cart → Purchased” is one timeline, not three half-timelines.
- Downstream impact: your segments (e.g., “Added to cart in last 4 hours AND not purchased”) become reliable because the “not purchased” check is happening on the same profile that fired the cart event.
Real scenario: A shopper browses on mobile, adds a product to cart, then logs in at checkout. Without a timely Identify, the “added_to_cart” event sits on an anonymous profile while “order_completed” lands on the logged-in profile—so they still get cart abandonment messages after buying. Identify is what prevents that.
Step-by-Step Setup
The goal here is simple: Identify early enough to stitch intent signals to the eventual purchaser, but not so early that you create duplicates or overwrite profiles with low-quality identifiers. Treat this like infrastructure—small mistakes show up as inflated abandonment, broken suppression, and messy attribution.
- Install the Customer.io SDK in your app
- Initialize the SDK as early as possible in app startup so you don’t miss pre-login behavior (browse, view, add-to-cart).
- Confirm environment separation (dev/stage/prod) so test identifies don’t pollute production segments.
- Decide your canonical identifier (don’t wing this)
- Use a stable internal
customer_id/user_idas the primary identifier. - Store email/phone as attributes, not as the primary ID, unless your system truly guarantees uniqueness and immutability.
- Use a stable internal
- Call Identify at the right moments
- Trigger Identify on account creation, login, and checkout/email capture (if you support guest checkout with email).
- If your app supports “continue as guest,” Identify as soon as you have a trustworthy email/phone—not after the order confirmation screen.
- Send high-signal attributes with Identify
- Include attributes that power retention logic:
email,phone,country,language,timezone,accepts_marketing,first_order_date,last_order_date. - Avoid sending noisy or frequently changing fields unless you actually use them for segmentation (otherwise you’ll create hard-to-debug segment churn).
- Include attributes that power retention logic:
- Track events after Identify (and verify they attach correctly)
- Immediately after Identify, fire one event you can easily validate (e.g.,
logged_inorcheckout_started) and confirm it lands on the identified profile in Customer.io. - Make sure purchase events include order IDs so you can dedupe and suppress correctly.
- Immediately after Identify, fire one event you can easily validate (e.g.,
- Handle logout explicitly
- When the user logs out, reset/clear the identified user in the SDK so the next person using the device doesn’t inherit the previous customer’s identity.
When Should You Use This Feature
Identify matters any time you’re relying on behavior to drive messaging—and that’s basically all retention. The difference is whether you need it for “nice personalization” or for “preventing expensive mistakes.” In practice, D2C brands feel the pain the most around checkout, suppression, and cross-device behavior.
- Cart recovery that doesn’t embarrass you: suppress abandonment the moment someone purchases, even if the purchase happens after login/guest email capture.
- Post-purchase cross-sell that’s actually relevant: tie product-view history to the buyer so you can recommend accessories they considered before buying.
- Reactivation based on real inactivity: “No sessions in 30 days” only works if sessions are stitched to the same person across devices.
- Push notification accuracy: device tokens must attach to the right profile, or your push sends drift to the wrong customer after device handoffs/logouts.
Operational Considerations
Most teams don’t fail on the first Identify call—they fail a month later when segments look inflated, suppression doesn’t hold, and nobody trusts the data. The fix is to treat identity as a retention dependency: consistent identifiers, predictable data flow, and clear orchestration rules.
- Segmentation hygiene:
- Build segments off stable fields (internal user ID presence, last purchase timestamp, consent flags), not volatile app-state attributes.
- Keep an “Identified Users” segment (e.g., user_id exists) and monitor it; sudden drops usually mean Identify stopped firing.
- Data flow timing:
- Identify needs to happen before critical events like
checkout_startedandorder_completedif you want clean funnel stitching. - Watch for offline/queued events on mobile—events can arrive out of order. Use timestamps and order IDs to keep logic sane.
- Identify needs to happen before critical events like
- Orchestration realities:
- If your cart recovery journey keys off
added_to_cart, make sure the purchase suppression checks the same person profile (this is where broken identity shows up fastest). - Decide how you’ll handle guest checkout: either create a user record at email capture or accept that some pre-checkout intent won’t stitch cleanly.
- If your cart recovery journey keys off
- Duplicate prevention:
- Pick one canonical ID and stick to it. Mixing email-as-ID and user_id-as-ID is the fastest path to duplicate people and split histories.
Implementation Checklist
If you want Identify to hold up under real-world edge cases (guest checkout, device sharing, intermittent connectivity), run through this before you scale campaigns. It’s much cheaper than debugging why your “abandonment” revenue looks great but your customer experience is deteriorating.
- SDK initialized on app start, with prod vs non-prod environments separated
- Canonical identifier chosen (prefer internal user ID) and documented
- Identify fires on login, account creation, and guest email/phone capture
- Logout clears/reset identity in the SDK
- Core retention events tracked with consistent naming (viewed_product, added_to_cart, checkout_started, order_completed)
- Purchase events include order_id and timestamp for dedupe/suppression
- Consent attributes (email/SMS) sent and used to gate sends
- QA confirms events before/after Identify land on the same Customer.io profile
Expert Implementation Tips
These are the small operator moves that keep identity clean when your app, storefront, and ESP logic collide. In most retention programs, these details are what separates “working” from “trustworthy.”
- Identify earlier than you think for cart recovery: if you wait until payment success, you’ve already missed the window where intent signals matter. Email capture at checkout is often the right compromise for guest users.
- Use internal IDs to survive email changes: customers change emails; internal IDs don’t. Keep email as an attribute so profile history doesn’t fragment.
- Send a single “source of truth” purchase event: if mobile app and backend both emit
order_completed, you’ll double-count purchases and break suppression. Pick one system to send it (usually backend) and enforce it. - Build a debugging segment: create a segment like “Added to cart in last 24h AND Purchased in last 24h” and spot-check that they’re not receiving abandonment messages. If they are, identity stitching is off.
Common Mistakes to Avoid
Most of these don’t show up as errors—they show up as “why are we sending the wrong message?” issues. If you’re seeing inflated abandonments, weird duplicates, or suppression failing, it’s usually one of these.
- Using email as the primary ID in some places and user_id in others: you’ll split one customer into multiple profiles.
- Calling Identify too late: pre-login cart and browse events never stitch, so your journeys treat purchasers like abandoners.
- Not clearing identity on logout: shared devices (tablets, family phones) become a compliance and CX problem fast.
- Overwriting good attributes with null/empty values: mobile clients sometimes send partial profiles; protect key traits like email/phone/consent from being blanked out.
- No dedupe strategy for purchases: duplicate order events create phantom “repeat buyers” and break replenishment timing.
Summary
Identify is the foundation for reliable retention in Customer.io: it stitches anonymous intent to known customers and keeps suppression, segmentation, and attribution honest.
If cart recovery, post-purchase, or reactivation feels noisy, fix Identify before you touch creative or cadence.
Implement Identify with Propel
If you’re implementing Identify and want it to hold up across app + backend + storefront edge cases, we’ll typically start by mapping identifiers, defining when Identify fires, and pressure-testing the “abandon → purchase → suppress” loop in Customer.io. When you’re ready, book a strategy call and we’ll walk through your current tracking and the exact points where identity stitching tends to break.