Get started with Customer.io (Data In) for retention programs that actually trigger

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 standing up Customer.io for a D2C retention program, the “get started” work is mostly a data problem: getting the right identities and events into the platform so your segments stay clean and your automations fire when they should. 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.

In most retention programs, we’ve seen the same pattern: teams rush into building cart recovery and post-purchase flows, then realize later that anonymous browsing never merges, “Placed Order” fires twice, or product/variant IDs don’t match what the catalog uses. Fixing data after the fact is what slows retention down.

How It Works

Customer.io retention orchestration depends on two things entering the system consistently: (1) people (profiles + identifiers) and (2) activity (events + attributes). When those are mapped cleanly, segments evaluate correctly and triggers become dependable—especially for high-frequency automations like browse/cart abandonment.

  • People profiles: A person exists in Customer.io when you create/update them (via SDK, Track API, Pipelines, or imports). Profiles carry identifiers (like id, email, phone) and attributes (like first_name, accepts_sms, lifetime_value, last_order_at).
  • Identity resolution: Retention use cases break when anonymous behavior can’t be tied to the eventual buyer. Your job is to ensure anonymous activity merges into the known profile at the moment you learn who they are (email capture, account login, checkout). If you don’t merge, “Viewed Product” and “Added to Cart” end up stranded on an anonymous profile and cart recovery underperforms.
  • Events as triggers: Events (like product_viewed, added_to_cart, checkout_started, order_placed) are the backbone of campaigns and workflows. You’ll use them to start journeys, to branch logic, and to define conversions (e.g., exit cart recovery when order_placed arrives).
  • Event payloads for segmentation: The event name gets someone into a journey. The payload determines whether the journey is relevant. For D2C, that usually means passing sku/variant_id, product_id, category, price, quantity, cart_value, and currency. Without these, you can’t reliably segment “high-intent cart” vs “low-intent browse.”
  • Segments evaluate against your data model: Customer.io segments are only as accurate as your attribute hygiene. If last_order_at is missing or formatted inconsistently, your “90-day lapsed” reactivation segment will be noisy and your winback triggers will misfire.

Real D2C scenario: A shopper browses two products, adds one to cart, then abandons. If you only start tracking after checkout begins, Customer.io never sees added_to_cart, so your cart recovery journey doesn’t trigger. If you do track added_to_cart but don’t merge anonymous activity after email capture, the journey triggers on an anonymous profile with no deliverable email—so it “works” in reporting but produces zero revenue.

Step-by-Step Setup

The fastest way to get Customer.io retention-ready is to treat setup like a tracking implementation, not a marketing project. Start with identity and the few events that power 80% of revenue flows, then expand.

  1. Create your workspace and lock basic conventions early.
    Decide on event naming (snake_case is common), timestamp formats (ISO 8601), and ID strategy (your internal customer ID as the primary id is usually safest).
  2. Pick your “data in” method and stick to it per surface area.
    Most D2C brands end up with a mix: server-side for orders, client-side for browse/cart, and an ecom integration for baseline objects. The key is consistency—don’t send the same event from multiple sources unless you have a dedupe plan.
  3. Implement identity capture + merge points.
    Define the exact moments you learn an identifier and ensure you call identify/merge there:
    • Email capture (newsletter popup, quiz result, account creation)
    • Login
    • Checkout email step
    Your goal: all pre-purchase events attach to the same person who later places the order.
  4. Send the core retention event set first.
    At minimum for D2C retention reliability:
    • product_viewed (include product_id/variant_id, category, price)
    • added_to_cart (include cart_id, items array, cart_value)
    • checkout_started (include cart_value, items, shipping_country if available)
    • order_placed (include order_id, total, items, discount codes, subscription flag)
  5. Map and standardize customer attributes that power winback + LTV logic.
    Common ones that matter immediately:
    • first_order_at, last_order_at
    • orders_count
    • lifetime_value
    • is_subscriber / subscription_status (if applicable)
    • sms_consent, email_consent
  6. Validate in Activity Logs before building journeys.
    Spot-check real users end-to-end: anonymous browse → email capture → add to cart → abandon → purchase. Confirm the events appear on one profile and in the right order.
  7. Only then build segments and triggers.
    Start with segments that reflect your data reality (e.g., “Added to cart in last 2 hours AND no order_placed since”). If the segment is hard to express, it’s usually a tracking gap—not a segmentation problem.

When Should You Use This Feature

“Getting started” sounds generic, but the data-in setup is the difference between journeys that print money and journeys that silently leak. You’ll feel it most in high-intent recovery and reactivation where timing and identity matter.

  • Cart recovery that actually reaches the shopper: Use when you need added_to_cart tied to an identifiable profile (email/phone) so messages don’t die on anonymous users.
  • Browse abandonment and product discovery: Use when you want to trigger category/product follow-ups based on product_viewed payloads (category, price band, variant).
  • Post-purchase repeat purchase: Use when you need reliable order_placed events and item-level data to drive replenishment, cross-sell, and “second order” pushes.
  • Winback/reactivation: Use when your lapsed segments depend on accurate timestamps like last_order_at and clean order counts/LTV.

Operational Considerations

Once you’re past the first implementation, the operational risk is drift: new site features ship, tracking changes, and suddenly your segments stop matching. Plan for that now so your triggers stay reliable.

  • Segmentation depends on stable schemas: If your items array shape changes (or sometimes sends strings, sometimes objects), any segment or liquid logic referencing it will become brittle.
  • Event duplication is more common than missing events: In practice, this tends to break when teams send order_placed from both the front-end “thank you” page and the backend order system. Decide your source of truth (usually backend) and treat everything else as non-authoritative.
  • Time zones and timestamps impact “within X hours” logic: If you rely on client timestamps, you’ll see weird edge cases in cart recovery windows. Prefer server-side timestamps for commerce-critical events.
  • Orchestration needs clear exit criteria: Your recovery flows should exit on a single, trustworthy purchase event. If purchase can arrive late or twice, you’ll either spam buyers or fail to stop messages in time.
  • Consent is data too: If SMS/email consent isn’t mapped as a clean attribute, you’ll end up with under-delivery (overly strict) or compliance risk (overly loose). Keep consent fields explicit and auditable.

Implementation Checklist

If you want to move fast without creating downstream cleanup, use this as your “done means done” list before you build core retention automations.

  • Primary identifier strategy defined (id vs email/phone) and consistent across sources
  • Anonymous-to-known merge points implemented (email capture, login, checkout)
  • Core events shipped: product_viewed, added_to_cart, checkout_started, order_placed
  • Event payloads include item-level identifiers (sku/variant_id) and revenue fields (total, currency)
  • Purchase source of truth chosen and duplicate purchase events prevented/deduped
  • Customer attributes mapped: last_order_at, orders_count, lifetime_value, consent flags
  • Activity Logs validated on real users end-to-end (not just test events)
  • At least one “golden segment” built and verified (e.g., cart abandoners last 2 hours, no purchase)

Expert Implementation Tips

The difference between “we track events” and “retention runs on autopilot” is usually a few operator decisions made early. These are the ones that keep segments clean and triggers predictable as you scale.

  • Model carts explicitly. Pass a cart_id and an items array on cart/checkout events. It makes it much easier to suppress messages when the cart changes or when a shopper removes the hero item.
  • Send one canonical purchase event. If you need multiple, name them differently (order_paid vs order_fulfilled) so your “exit on purchase” logic stays simple.
  • Prefer backend for revenue-critical events. Front-end events are great for intent; backend events should be the source for money (orders, refunds, subscription state).
  • Keep product identifiers consistent with your catalog. If your ESP uses variant_id but your site sends sku, pick one as the standard and add the other as a secondary field. Mismatched IDs are why dynamic product blocks fail.
  • Build a retention QA loop. Every site release that touches cart/checkout should include a quick check that the four core events still fire and still merge into known profiles.

Common Mistakes to Avoid

Most “Customer.io isn’t working” complaints are really “our data-in layer is inconsistent.” These are the failure modes that show up fastest in D2C retention.

  • Relying on email as the only identifier while also tracking anonymous browsing. If you don’t merge anonymous activity, your highest-intent signals never become messageable.
  • Sending the same event from multiple places. Double order_placed creates double conversions, broken frequency logic, and messy suppression rules.
  • Event names without payload discipline. A product_viewed event without product/category/price is basically useless for segmentation beyond “they did a thing.”
  • Using inconsistent timestamp formats. This quietly breaks lapsed segments and “within last X days” logic.
  • Building flows before validating Activity Logs. You’ll spend weeks “optimizing” creative when the real issue is that 40% of users never qualify due to missing/stranded events.

Summary

If you want cart recovery, repeat purchase, and winback to perform, treat Customer.io setup as a data implementation: stable identities, canonical events, and payloads built for segmentation. Once your triggers are reliable, everything downstream—testing, personalization, channel mix—gets dramatically easier.

Implement Legacy Js with Propel

If you’re inheriting a legacy JS tracking setup (or a patchwork of Shopify apps, tag manager scripts, and backend webhooks), the practical goal is the same: make sure the right identities and events land in Customer.io cleanly so segments and triggers don’t degrade over time. When you want to pressure-test your tracking plan or untangle merge/duplication issues before they hit revenue, book a strategy call and we’ll walk through what to standardize first.

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