Summarize this documentation using AI
Overview
If you’re using Customer.io to drive repeat purchase and recovery, the “quick start” is really about one thing: getting identity + event tracking right so your automations trigger off real buyer behavior. If you want a second set of eyes on your tracking plan before you ship it (and before you build 20 journeys on shaky data), book a strategy call and we’ll pressure-test the setup like an operator would.
In most retention programs, the biggest lift doesn’t come from prettier emails—it comes from clean app-side events (viewed product, added to cart, started checkout, purchased) and consistent identity stitching so cart recovery and post-purchase flows don’t miss people.
How It Works
Customer.io needs two inputs from your app (web or mobile): (1) a person record (who someone is) and (2) behavioral events (what they did). The SDK is the most reliable way to capture those behaviors in real time, including anonymous browsing that later becomes attributable after login/checkout.
- Install the SDK for your platform (iOS/Android/React Native/etc.) so the app can send events directly to Customer.io.
- Identify users when you know who they are (login, account creation, email capture, or checkout). This is where you attach a stable
user_id(and optionally email/phone) to the device/session. - Track events for the actions that matter to retention: product views, add-to-cart, checkout started, purchase completed, subscription paused, etc.
- Stitch anonymous → known behavior so the browsing and cart activity from “unknown visitor” becomes part of the same profile once they identify. In practice, this is what stops your cart flow from treating a known customer like a stranger (or worse: firing twice).
- Use events + attributes for segmentation and orchestration inside Customer.io—segments like “Added to cart, no purchase in 2 hours” or “Purchased 30–45 days ago, no repeat order.”
Real D2C scenario: A shopper browses on mobile, adds a cleanser + moisturizer to cart, then creates an account at checkout. If you identify at account creation/checkout and you’ve implemented anonymous stitching, Customer.io can correctly trigger a cart recovery push/email with the exact items they left—without waiting for a nightly sync and without losing the pre-login cart events.
Step-by-Step Setup
The goal here is to get from “empty workspace” to “reliable events powering retention segments.” Don’t overbuild journeys until you can see clean event streams on real devices.
- Create your workspace
Set up the Customer.io workspace you’ll use for production. Keep environments separate (prod vs staging) so test events don’t pollute real segments. - Set up message channels
Configure the channels you’ll actually use for retention (email, push, SMS, in-app). Even if you won’t launch all on day one, align on which channels require SDK support (push/in-app especially). - Integrate via SDK (mobile/web)
Install the appropriate Customer.io SDK for your app stack. Validate that the SDK can reach Customer.io from your app (watch for ad blockers on web, VPN/network constraints on mobile, and ATS/SSL issues on iOS). - Implement Identify
Callidentifyas soon as you have a stable user identifier. Common operator choices:- At account creation (best for long-term identity)
- At email capture (if you allow “guest” capture)
- At checkout completion (fallback if earlier isn’t possible)
- Track your retention-critical events
Start with a tight event taxonomy you’ll actually use in automations:product_viewed(includesku,category,price)added_to_cart(includecart_id, line items, qty)checkout_started(includecart_value)order_completed(includeorder_id, items, revenue, discount)
- Verify data in Customer.io
Open a test device/session, run through browse → cart → checkout, and confirm:- Events appear on the person profile
- Anonymous activity merges into the identified profile
- Attributes (email, phone, locale, last purchase date) look correct
- Create a first segment and a simple recovery automation
Build one segment like “Added to cart AND not purchased within 2 hours” and trigger a single message. This is your canary—if this works reliably, you can scale into full flows.
When Should You Use This Feature
The SDK route is the right move when you care about behavioral accuracy and timing. For D2C retention, that usually means you want to react within minutes (not hours) and you want item-level personalization.
- Cart recovery that actually matches what happened: trigger off
added_to_cart/checkout_startedand suppress onorder_completedwithout waiting for a backend sync. - Product discovery → repeat purchase loops: track
product_viewedandcategory_viewedso you can follow up with “still thinking about…” or replenishment recommendations. - Reactivation based on real inactivity: define inactivity as “no app opens + no product views + no purchases” instead of just “hasn’t ordered.”
- Cross-device identity stitching: if customers browse on mobile and buy on desktop (or vice versa), SDK + consistent identify patterns reduce profile fragmentation.
Operational Considerations
Most teams get the SDK installed and then wonder why segments are messy or why journeys leak. The difference between “events exist” and “events are usable” is how you govern identity, naming, and orchestration rules.
- Segmentation depends on stable IDs: pick a canonical
user_idand don’t change it. If you identify by email sometimes and internal ID other times, you’ll split profiles and your suppression logic will fail. - Anonymous-to-known stitching is where flows win or lose: if a user adds to cart anonymously and you only identify after purchase, your cart recovery segment will either miss them or target them incorrectly. Identify as early as your UX allows.
- Event naming is an orchestration contract: once journeys depend on
checkout_started, changing it tocheckout_initiatedwill silently break triggers. Treat event names like API endpoints—version them or add new ones, don’t mutate casually. - Data flow timing matters: if purchase confirmation is server-side but cart is app-side, you need clear rules for which source of truth suppresses recovery. In practice, we’ve seen duplicate sends when the “purchase” event arrives late.
- Attributes vs events: use events for things that happen (cart, purchase), attributes for durable facts (VIP tier, subscription status, acquisition source). Don’t cram everything into attributes or you’ll lose timing and history.
Implementation Checklist
Before you build more than one or two automations, make sure the foundation is solid. This checklist is what we run through to avoid weeks of debugging later.
- SDK installed in the correct environment (staging vs production)
identifycalled consistently with a canonicaluser_id- Anonymous activity merges into the identified profile after login/checkout
- Core events implemented:
product_viewed,added_to_cart,checkout_started,order_completed - Events include the properties you need for personalization (SKU, cart value, item list)
- Purchase event timing validated (no long delays that cause recovery misfires)
- At least one segment built off events and validated against real sessions
- Suppression logic defined (e.g., “if purchased, exit journey immediately”)
Expert Implementation Tips
Once the basics are live, a few operator moves make your tracking far more resilient—and make your retention programs easier to scale without constant engineering help.
- Track a stable cart identifier (
cart_id) across events. It makes it much easier to dedupe and to reason about “this cart was recovered” vs “they started a new cart.” - Send both item-level and summary properties: include line items and a
cart_value. The summary powers quick segmentation; the line items power personalization. - Implement a “purchase source” property (app vs web) on
order_completed. It helps you debug channel performance and prevents false conclusions when one platform lags on event delivery. - Design events around decisions, not screens. “Viewed PDP” is less useful than “product_viewed” with SKU + category because it survives app redesigns.
- Proactively plan for identity edge cases: guest checkout, email change, device re-installs. These are the cases that quietly create duplicate people and inflate sends.
Common Mistakes to Avoid
These are the mistakes that cause the classic D2C problems: cart flows spamming purchasers, winbacks targeting active buyers, and segments that never match anyone.
- Identifying too late: waiting until after purchase to call
identifymeans you lose the ability to recover carts and personalize browse abandonment. - Using email as the only identifier: emails change and aren’t always available. Use an internal customer ID as canonical, then attach email/phone as attributes.
- Inconsistent event schemas: sending
skusometimes andproduct_idother times forces messy liquid logic and breaks templates. - No suppression/exit rules: if your cart journey doesn’t exit immediately on
order_completed, you’ll inevitably message people who already bought. - Testing only in the UI: always test on real devices/sessions. SDK issues often don’t show up in mocked events.
Summary
If you want Customer.io retention to perform, treat the SDK implementation like revenue infrastructure: identify early, track the handful of events that drive decisions, and make sure anonymous behavior stitches cleanly into known profiles. Once that’s stable, cart recovery, repeat purchase, and reactivation become straightforward to orchestrate.
Implement Quick Start Guide with Propel
If you’re rolling out the SDK and want to avoid the usual identity and event-taxonomy pitfalls, it helps to sanity-check the plan before engineering locks it in. We’ll map your retention use cases (cart recovery, replenishment, winback) to the exact events/identify calls Customer.io needs, then validate segments and suppression so your first journeys don’t leak.
Start with your current Customer.io setup and book a strategy call when you’re ready to review tracking, stitching, and the first production-ready triggers.