Track in Customer.io (Track API): build a track spec that won’t break your retention flows

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 running retention in Customer.io, your results live or die on whether events land cleanly, map to the right person, and show up fast enough to trigger journeys. Track is the layer that turns onsite/app behavior (browse, add to cart, checkout started, order placed) into dependable automation inputs—if you implement it with a real track spec instead of “whatever the dev shipped.” If you want a second set of eyes on your spec before it silently breaks cart recovery, book a strategy call.

In most D2C programs, Track becomes the source of truth for high-intent moments: cart abandonment, product interest, replenishment timing, and winback eligibility. The goal isn’t “send more events”—it’s “send the right events with the right identifiers so segments and triggers are accurate.”

How It Works

Track is how your site/app tells Customer.io that something happened. Each event comes in with an event name, a timestamp, an identifier that ties it to a person, and a payload of properties you’ll use for segmentation and message personalization.

  • Events enter Customer.io as named actions (for example: product_viewed, added_to_cart, checkout_started, order_placed). These names become your triggers and your segment conditions—so naming consistency matters more than people think.
  • Identity resolution happens at ingestion. Customer.io needs a stable person identifier (commonly id, and often email as a secondary). If the same human shows up as multiple IDs (anonymous session, then logged-in ID, then email), your abandonment and post-purchase flows split across profiles and performance tanks.
  • Event properties become your targeting and personalization inputs. If you don’t send cart_value, items, product_id, variant_id, currency, or discount_code consistently, you’ll end up with generic messages and brittle segments (or worse: wrong offers to the wrong people).
  • Trigger reliability depends on timing and dedupe. Cart recovery is a race: if added_to_cart arrives late, or order_placed arrives twice, you’ll message people after they’ve bought or suppress people who haven’t.

A realistic D2C scenario: a shopper adds a bundle to cart on mobile, bounces, then completes the purchase on desktop an hour later. If mobile sent events under an anonymous ID and desktop sent order_placed under an email-based ID, Customer.io sees two “people.” Your cart abandonment journey fires anyway because it never sees the purchase on the same profile. That’s not a creative problem—it’s an identity problem.

Step-by-Step Setup

The cleanest implementations start with a track spec (names, required properties, identifiers, and expected timing) and then wire it into Customer.io. You’ll move faster later because every new flow reuses the same inputs.

  1. Define your canonical person identifier (what Customer.io will treat as the primary key). Decide whether you’ll use an internal customer ID, email, or both—and document it. In practice, internal IDs are safer long-term; email changes and aliases happen.
  2. Map identity for logged-out vs logged-in states. Decide how you’ll handle anonymous browsing and when you’ll merge to a known profile (e.g., at email capture, account creation, or checkout). If you can’t merge anonymous activity, don’t build “browse abandon” journeys that assume you can.
  3. Write the event taxonomy (your retention event list). Start with the events that drive revenue:
    • added_to_cart (must include item list, cart value, currency)
    • checkout_started (must include cart value, item list, shipping country if available)
    • order_placed (must include order_id, revenue, items, discount, first_order flag)
    • product_viewed (include product_id, variant_id, category, price)
  4. Standardize property names and types. Pick one format and stick to it (e.g., cart_value as a number, currency as ISO code, items as an array of objects). Segments break when the same field flips between string/number or when different teams ship cartValue vs cart_value.
  5. Implement Track calls server-side where it matters. For purchase confirmation (order_placed), prioritize server-side tracking so ad blockers and flaky browsers don’t create false “abandoners.” Client-side is fine for discovery events, but be intentional.
  6. Set up deduplication rules for transactional events. Ensure order_id is present and stable so you can guard against duplicate sends (retries, webhook replays, etc.). Duplicate purchases inflate LTV and can suppress the wrong people from winback.
  7. Validate in Customer.io Activity Logs. Before you build journeys, confirm:
    • events appear on the correct person profile
    • properties are populated and typed correctly
    • timestamps reflect when the action happened (not when the batch job ran)
  8. Only then build segments and triggers. Build one “golden path” journey (cart recovery) as your integration test. If that journey behaves, the rest will too.

When Should You Use This Feature

Track is the right move when your retention program depends on behavioral truth, not just customer attributes. If you’re trying to drive repeat purchase and recovery with precision, you need event-level inputs you can trust.

  • Cart recovery that suppresses correctly: trigger on checkout_started or added_to_cart, suppress on order_placed on the same identity, and personalize from items and cart_value.
  • Post-purchase cross-sell and replenishment: use order_placed with item-level detail so you can branch by category (e.g., skincare cleanser vs moisturizer) and time follow-ups based on product cadence.
  • Reactivation based on real inactivity: define “inactive” as no order_placed within X days AND no high-intent events (like checkout_started) within Y days—Track gives you that behavioral layer.
  • Product discovery nudges: trigger on product_viewed frequency or category interest, but only if identity is stable enough to avoid spamming anonymous traffic.

Operational Considerations

The biggest operational gap is assuming data will stay consistent over time. Retention automations run for months; your tracking will change weekly unless you lock down a spec and monitor it.

  • Segmentation accuracy depends on property discipline. If category is missing on 30% of product_viewed events, your “viewed category X but didn’t buy” segment becomes a random sample.
  • Data flow latency changes send timing. If events arrive in batches (every 30–60 minutes), your “send 30 minutes after abandonment” logic won’t behave. Align journey delays to actual ingestion timing, not ideal timing.
  • Orchestration breaks when identities fragment. If email capture happens after added_to_cart, your cart journey may never find an address to message. Decide whether you’ll (a) capture email earlier, (b) use SMS with phone capture, or (c) accept that some abandoners are uncontactable.
  • Source-of-truth conflicts. If Shopify (or your order system) and Track both send purchase events, you’ll double count unless you decide which feed owns order_placed and enforce it.

Implementation Checklist

Before you call the integration “done,” run through this like a pre-flight. It’s the difference between a journey that prints money and one that quietly bleeds margin.

  • Primary identifier chosen and documented (and used consistently across all Track calls)
  • Plan for anonymous-to-known merge documented (or explicitly avoided in journey design)
  • Event taxonomy finalized with exact names (no duplicates like add_to_cart vs added_to_cart)
  • Required properties defined per event (and validated in real payloads)
  • Item schema standardized (product_id, variant_id, quantity, price)
  • order_placed includes stable order_id and revenue fields
  • Server-side tracking in place for purchases (or a documented fallback)
  • Activity Log spot-check: correct profile, correct timestamp, correct properties
  • One “golden path” journey QA’d end-to-end (abandon → purchase suppression works)

Expert Implementation Tips

These are the small operator moves that keep your segments clean and your triggers trustworthy as the business evolves.

  • Send a boolean like is_first_order on order_placed. It saves you from expensive segment logic and makes first-to-second order journeys far more reliable.
  • Include event_source and channel properties (web, iOS, Android, POS). When performance dips, you’ll isolate whether tracking broke on one platform instead of guessing.
  • Version your item schema (e.g., items_schema_version: 1). When merchandising adds fields later, you can support old and new formats without breaking personalization.
  • Prefer “state” events for carts if your stack supports it. Instead of only added_to_cart, also send cart_updated with the full cart. It reduces edge cases where quantity changes or items are removed and your email shows the wrong cart.

Common Mistakes to Avoid

Most retention issues blamed on “creative” or “frequency” are actually tracking issues. These are the ones that show up repeatedly in D2C.

  • Inconsistent event names across teams (web uses checkout_started, backend uses begin_checkout). Your triggers miss half the audience.
  • Using email as the only identifier when email isn’t captured early. You end up building journeys that trigger correctly but can’t message anyone.
  • Missing or unstable order_id. Duplicate purchase events inflate revenue reporting and suppress customers from winback incorrectly.
  • Property type drift (sending cart_value as “49.00” sometimes and 49.00 other times). Segments and comparisons become unreliable.
  • Assuming “within the past X minutes” works without checking latency. If your pipeline batches, your abandonment windows won’t match reality.
  • Over-tracking low-signal events before you’ve nailed the money events. Get cart and purchase perfect first; then expand into browse and engagement.

Summary

If your Track implementation nails identity, naming, and required properties, your cart recovery and post-purchase flows become predictable and scalable.

If it’s sloppy, you’ll fight ghost abandoners, broken segments, and misfired suppressions—no amount of copywriting fixes that.

Implement Track Spec with Propel

When we audit retention programs in Customer.io, the fastest lift usually comes from tightening the Track spec: fewer events, better identifiers, and properties that map directly to the segments you actually run. If you want help pressure-testing your event taxonomy (especially identity merge and purchase dedupe) before you scale journeys, book a strategy call.

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