Summarize this documentation using AI
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 Startedand another sendscheckout_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.
- 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. - Define your retention-critical events (start small).
For most D2C programs, the core set looks like:
product_viewed(orviewed_product)added_to_cartcheckout_startedorder_completedsubscription_started/subscription_cancelled(if applicable)
- 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_idcategory(orcollection)price,currencyquantitycart_valueorder_id,order_value,items(array of line items)
- 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. - 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 likeorder_completed. This prevents false purchases from ad blockers, flaky browsers, or payment failures. - 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)
- 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_cartorcheckout_started, then suppress iforder_completedhappens within a time window. This only works if identity is consistent across devices and purchase is server-confirmed. - Product discovery → conversion: Use
product_viewed+categoryto 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_completedwith 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, nosite_visit, noemail_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_totaland half sendtotal, 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 onorder_typeorcontains_subscription_item. - Build suppression off events, not tags. For cart recovery, suppress when
order_completedhappens after entry. Tags drift; events don’t. - Version payload changes explicitly. If you must change structure, add a field like
schema_versionso 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 itadded_to_cart, the CDP calls itProduct 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.