Summarize this documentation using AI
Overview
If you want Customer.io to actually drive repeat purchase and recovery flows, the “quick start” is really about one thing: getting clean identity + event tracking from your app/site so Journeys can trigger off real behavior. If you want a second set of eyes on your tracking plan before you ship it, book a strategy call—it’s usually faster than debugging a half-working cart trigger for two weeks.
In most retention programs, the first win comes from stitching anonymous browsing/cart behavior to a known customer the moment they log in or enter email—then using that to power cart recovery, browse abandon, and post-purchase replenishment.
How It Works
Customer.io’s SDK setup becomes “real” when your app (or web app) consistently does three things: initializes a device/session, identifies the person, and sends events with the right properties. Once that data lands, you build segments and Journeys that trigger on those events and person attributes.
- SDK initialization creates a device-level footprint. Before you know who the user is, the SDK can still collect anonymous activity (device/session scoped). This is what makes browse/cart behavior recoverable later.
identifystitches anonymous activity to a real profile. The moment you have a stable identifier (customer ID, hashed email, etc.), you call identify. That’s the difference between “we sent a cart email” and “we actually know which cart belonged to this customer.”trackevents become your Journey triggers. Events likeProduct Viewed,Added to Cart,Checkout Started, andOrder Completedshould include consistent properties (SKU, price, quantity, cart_id, order_id). These properties power personalization and suppression logic.- Attributes support segmentation and suppression. Things like
last_order_date,lifetime_value,subscription_status, andpush_opt_inbelong on the person profile so you can target intelligently.
Real D2C scenario: a shopper adds a cleanser to cart on mobile, gets distracted, then logs in the next day on desktop. If your SDK captures Added to Cart anonymously and you call identify on login, you can still trigger a cart recovery Journey with the right product content—without double-sending to the wrong profile.
Step-by-Step Setup
The goal here isn’t “send your first message.” The goal is to ship a tracking foundation that won’t break once you add more channels, more campaigns, or a second app platform.
- Create your workspace and confirm your data model.
Decide your canonical person identifier (e.g., internal customer_id). In practice, this tends to break when teams use email as an ID and later need to merge accounts or handle Apple Private Relay. - Install the Customer.io SDK (mobile or web).
Add the SDK to your iOS/Android (or web app) and initialize it on app start/page load. Keep initialization consistent across environments so QA data doesn’t pollute production. - Implement
identifyat the earliest reliable moment.
Callidentifyon login/account creation and any time you can confidently tie the device to a known customer. Include core attributes you’ll segment on (email, phone if you have consent, acquisition_source, first_order_date if known). - Track your commerce events with stable naming + required properties.
Start with a retention-first event set:Product Viewed: sku, product_id, category, priceAdded to Cart: cart_id, sku, quantity, priceCheckout Started: cart_id, cart_value, item_countOrder Completed: order_id, revenue, sku_list, discount_code, shipping_method
- Handle anonymous-to-known stitching explicitly.
Make sure anonymous events before login are retained and merged into the identified profile afteridentify. If you’re seeing “duplicate people,” fix identity rules now—don’t build flows on top of broken stitching. - Validate in Customer.io: people profiles, event stream, and timing.
Spot-check a full funnel: view product → add to cart → start checkout → purchase. Confirm properties appear as expected and timestamps match reality (timezone issues cause a lot of “why didn’t they qualify?” confusion). - Only then build Journeys and segments.
Once events are clean, you can safely build cart recovery, browse abandon, post-purchase cross-sell, and reactivation without constant patching.
When Should You Use This Feature
SDK-based tracking is the right move when you need high-fidelity behavioral signals and reliable identity stitching—especially if you’re doing anything beyond basic email blasts.
- Cart recovery that actually reflects the cart. Trigger on
Added to Cartand suppress ifOrder Completedhappens within a window. This avoids the classic “you left something behind” email after they already bought. - Browse abandon and product discovery flows. When
Product Viewedis tracked with category/SKU, you can follow up with relevant alternatives, bundles, or UGC—without guessing. - Repeat purchase and replenishment. Use
Order Completed+ SKU to start timed replenishment reminders (e.g., 21/30/45 days depending on product). This is where LTV usually moves. - Reactivation based on true inactivity. Combine “no app opens” (or no key events) with “has purchased before” to avoid spamming active buyers who just haven’t opened email.
Operational Considerations
Most teams don’t fail at “sending events.” They fail at making events usable for segmentation and orchestration across channels without creating duplicates, gaps, or noisy triggers.
- Segmentation depends on predictable properties. If one platform sends
productIdand another sendsproduct_id, your segments silently undercount and your Journey logic gets leaky. - Data flow latency changes your suppression logic. If purchase confirmation arrives late, your cart Journey may fire before the
Order Completedevent lands. Build short delays (15–60 minutes) before sending high-risk messages. - Identity stitching is a retention multiplier. Prioritize merging anonymous activity after login/email capture. Without it, browse/cart Journeys miss a big chunk of intent.
- Orchestration realities: one event can trigger multiple flows. If
Added to Carttriggers cart recovery and also triggers “bundle upsell,” you need guardrails (frequency caps, mutual exclusions, or a single orchestrated Journey). - Device and channel eligibility should live on the profile. Track push permission, app version, and device type so you don’t send push to users who can’t receive it.
Implementation Checklist
Before you call the SDK “done,” run this checklist. It’s the difference between a retention engine and a pile of half-triggering automations.
- SDK installed and initialized in production (and clearly separated from staging/dev)
- Single canonical identifier chosen (and used consistently in
identify) identifycalled on login/account creation and includes core attributes- Anonymous activity is retained and merges correctly after identification
- Commerce events tracked with consistent names and required properties
- Order events include stable
order_idfor deduplication - Basic QA path validated end-to-end in Customer.io (events + properties + timestamps)
- Suppression logic planned (purchase suppresses cart, unsubscribe/consent respected)
Expert Implementation Tips
These are the operator moves that keep your program stable once volume ramps and you start layering more Journeys.
- Design your events around decisions. If you can’t answer “who should get what message?” from the event payload, you’ll end up adding brittle workarounds later.
- Always include a stable cart/order key.
cart_idandorder_idprevent duplicates and make it easier to debug why a customer got (or didn’t get) a message. - Send category + SKU, not just product name. Names change. SKUs don’t (or at least they shouldn’t). Category enables smarter cross-sell and browse follow-ups.
- Build a “golden path” QA script. One internal doc: install app → view product → add to cart → checkout → purchase → confirm events. Run it after every app release.
- Plan for logged-out checkout. If your brand supports guest checkout, decide how you’ll stitch email capture to prior anonymous activity (often via identify at email entry).
Common Mistakes to Avoid
These are the issues that quietly kill performance—usually discovered after you’ve already built the campaigns.
- Delaying
identifyuntil after purchase. You lose the whole cart/browse window, which is where recovery revenue lives. - Inconsistent event schemas across platforms. iOS sends one payload, Android sends another, web sends a third—segments become unreliable and hard to maintain.
- No deduplication strategy for purchases. If
Order Completedfires twice (common with retries), you’ll inflate revenue reporting and break suppression logic. - Triggering Journeys on noisy events. Tracking every tiny UI action as a “view” event creates spammy flows and makes it harder to find the signals that matter.
- Forgetting consent/eligibility attributes. If you don’t track push opt-in (or SMS consent), you’ll either over-message or under-utilize channels.
Summary
If you’re implementing Customer.io via SDK, the win is clean identity stitching plus a small set of commerce events that map directly to retention decisions. Get that right, and cart recovery, repeat purchase, and reactivation Journeys become straightforward—and reliable.
Implement Quick Start Guide with Propel
If you’re already committed to Customer.io, the fastest path is usually: align on an event/identity spec, implement SDK tracking once, then build Journeys on top of stable data. If you want help pressure-testing the schema (and the real-world edge cases like guest checkout, cross-device login, and purchase dedupe), book a strategy call and we’ll map it to the retention flows you actually care about.