Customer.io Events: Getting Your Behavioral Data In (Without Breaking Triggers)

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 Customer.io to drive retention, your events need to land cleanly, map to the right person, and arrive fast enough to trigger Journeys on time—otherwise your “cart recovery” turns into “random reminder.” If you’re tightening up tracking or rebuilding your event taxonomy, it’s usually worth pressure-testing the plan first; you can book a strategy call and we’ll sanity-check the data layer for trigger reliability.

Events are the behavioral inputs that power segmentation and automation entry. In practice, the brands that win on repeat purchase and reactivation don’t send “more events”—they send the right events with stable naming, correct identity, and payloads that match how they actually want to branch and personalize.

How It Works

At a mechanical level, an “event” is a timestamped action tied to an identifier that Customer.io can resolve to a person profile. The moment that event hits Customer.io, it becomes available for: (1) triggering Journeys, (2) filtering who enters, (3) branching logic, and (4) building segments based on recent behavior.

  • Event ingestion: Your site/app/server sends an event (name + data payload + timestamp). Customer.io stores it on the person’s activity timeline.
  • Identity resolution: The event must include an identifier Customer.io can match to a person (commonly an internal id, email, or another stable customer key). If the user is anonymous at first, you need a plan for merging that anonymous activity into the known profile later—otherwise cart events sit on a ghost profile and your recovery flow never fires.
  • Data mapping: The payload fields you send become the fields you can reference later for segmentation and personalization (e.g., cart_value, sku, category, currency, discount_applied).
  • Trigger reliability: Journeys depend on predictable event names and consistent payload shapes. If one checkout path sends Checkout Started and another sends checkout_started, you’ll quietly under-trigger.

Real D2C scenario: A shopper adds two items to cart on mobile, then completes purchase on desktop. If your mobile events are anonymous and you don’t merge them when they log in on desktop, Customer.io sees “Added to Cart” on an anonymous profile and “Order Completed” on the known profile. Result: they still get cart abandonment emails after buying—classic retention tax caused by identity gaps, not messaging.

Step-by-Step Setup

Before you touch Customer.io, decide what you need the event stream to accomplish: which Journeys should trigger, what branches you need, and what segments you’ll rely on weekly. Then implement the minimum event set that supports those decisions cleanly.

  1. Pick a canonical customer identifier.
    Use a stable internal customer ID wherever possible. Email changes; IDs don’t. Align this across your storefront, backend, CDP (if you have one), and Customer.io.
  2. Define your retention-critical events (start small).
    For most D2C programs, the core set looks like:
    • product_viewed (or viewed_product)
    • added_to_cart
    • checkout_started
    • order_completed
    • subscription_started / subscription_cancelled (if applicable)
    Keep naming consistent (snake_case is common). Don’t mix spaces, title case, and underscores across sources.
  3. Standardize event payloads to match how you’ll segment.
    Decide which fields you’ll need later for targeting and message logic. Typical payload fields:
    • product_id, sku, variant_id
    • category (or collection)
    • price, currency
    • quantity
    • cart_value
    • order_id, order_value, items (array of line items)
    The operator rule: if you can’t segment on it, don’t bloat the payload—unless you’re sure you’ll use it for personalization later.
  4. Handle anonymous behavior intentionally.
    If you track pre-login events (common in D2C), make sure you can merge anonymous activity into the known person once they identify (email capture, account login, checkout email). If you skip this, cart recovery and browse abandonment will misfire.
  5. Send events from the right system.
    Use client-side events for fast signals (views, add-to-cart), but rely on server-side for “source of truth” events like order_completed. This prevents false purchases from ad blockers, flaky browsers, or payment failures.
  6. Validate in Customer.io with real test users.
    Create a test profile, run through add-to-cart → checkout → purchase, and confirm:
    • Events appear on the person timeline in the right order
    • Payload fields are present and correctly typed (numbers as numbers, timestamps as timestamps)
    • Journeys trigger once (not 2–3x due to duplicate sends)
  7. Lock naming and version changes.
    When you need to change an event name or payload structure, treat it like a migration. Run old + new in parallel for a short window, update Journeys/segments, then deprecate the old event.

When Should You Use This Feature

Events are your retention “truth layer” when you need automation to react to behavior, not just static attributes. If you’re trying to improve repeat purchase or reduce churn, events are usually the difference between generic flows and precision targeting.

  • Cart recovery: Trigger off added_to_cart or checkout_started, then suppress if order_completed happens within a time window. This only works if identity is consistent across devices and purchase is server-confirmed.
  • Product discovery → conversion: Use product_viewed + category to build “high intent” segments (e.g., viewed hydration products 2+ times in 7 days) and trigger a targeted offer or social proof message.
  • Repeat purchase timing: Trigger replenishment reminders from order_completed with SKU-level payloads. Branch timing based on product type (30 days for supplements vs 90 days for skincare) without needing a separate system.
  • Reactivation: Use “no events in X days” segments (no order_completed, no site_visit, no email_click) to identify true dormancy. This is far more reliable than last email open.

Operational Considerations

Most retention programs don’t fail because the Journey logic is wrong—they fail because the underlying event stream is inconsistent. Treat events like production infrastructure: stable, monitored, and boring.

  • Segmentation accuracy depends on event consistency. If half your orders send order_total and half send total, your “VIP purchasers” segment will be wrong and your CLV lift will look random.
  • Data flow latency matters for recovery. Cart and checkout events need to arrive quickly; if your pipeline delays by 30–60 minutes, your first recovery touch hits too late. In most programs we’ve seen, the first 15–30 minutes is where the easy conversions happen.
  • Deduplication is not optional. Retries, webhook replays, and client-side double-fires can trigger multiple entries. Use an idempotency key (like order_id) and ensure your sending layer doesn’t create duplicates.
  • Orchestration across tools breaks at identity boundaries. If Shopify, your CDP, and Customer.io don’t share the same primary key strategy, you’ll end up suppressing in one place and still sending in another.
  • Payload typing impacts Liquid and branching. Numbers sent as strings will break comparisons (e.g., cart_value > 100). Decide types and keep them consistent.

Implementation Checklist

If you want Journeys to trigger reliably and segments to stay clean over time, this is the checklist we run before scaling any retention automation.

  • Primary identifier defined and consistent across all event sources
  • Event names standardized (single convention, no duplicates/aliases)
  • Core retention events implemented: product_viewed, added_to_cart, checkout_started, order_completed
  • Server-side “source of truth” for purchase confirmation
  • Anonymous-to-known merge strategy verified (especially for cart events)
  • Payload schema documented (required fields + types)
  • Deduplication strategy in place (order_id, event_id, retry handling)
  • Test user flow validated end-to-end inside Customer.io
  • Monitoring plan for event volume drops/spikes and schema changes

Expert Implementation Tips

These are the small operator moves that keep your retention machine from degrading as you add channels, promos, and new storefront experiences.

  • Model events around decisions, not pages. “checkout_started” is actionable; “visited_/checkout” is noisy and brittle when your theme changes.
  • Send line items as arrays for real personalization. Cart recovery works better when you can render the exact items left behind, not just “You left something in your cart.”
  • Use a single purchase event, then branch by payload. Don’t create order_completed_subscription, order_completed_one_time, etc. Keep one event and branch on order_type or contains_subscription_item.
  • Build suppression off events, not tags. For cart recovery, suppress when order_completed happens after entry. Tags drift; events don’t.
  • Version payload changes explicitly. If you must change structure, add a field like schema_version so you can maintain backward compatibility in Liquid and Journey conditions during rollout.

Common Mistakes to Avoid

These are the mistakes that create “why did they get this message?” tickets and quietly tank deliverability and trust.

  • Tracking purchases client-side only. You’ll fire “order_completed” on failed payments, blocked scripts, or double submits—then your post-purchase and cart recovery flows collide.
  • Letting multiple teams invent event names. Growth calls it AddToCart, engineering calls it added_to_cart, the CDP calls it Product Added. Customer.io ends up with three partial truths.
  • Not merging anonymous activity. This is the #1 reason cart recovery underperforms for mobile-heavy brands.
  • Changing payload fields without updating segments. Segments silently stop matching, and you assume “email fatigue” when it’s actually a data regression.
  • Over-sending high-frequency events. If you dump every scroll and click, you’ll make segmentation harder and troubleshooting painful. Keep the stream focused on retention outcomes.

Summary

If events don’t resolve to the right person, your Journeys won’t trigger consistently and your segments won’t be trustworthy. Nail identity, stabilize naming, and keep payloads aligned to the decisions you need for cart recovery, repeat purchase, and reactivation. Once the data is clean, the messaging becomes the easy part.

Implement Cio Journeys with Propel

When teams ask us to “fix cart abandonment,” we usually start by auditing the event stream—because most issues are identity, duplication, or schema drift, not copy. If you’re building or rebuilding your event tracking into Customer.io, you can book a strategy call and we’ll map the minimum event design needed for reliable triggers and clean segmentation before you scale Journeys.

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