Customer.io HTTP API for Data In (Events + Identity) — Retention-Grade Implementation

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 pushing behavioral data into Customer.io from a storefront, backend, or custom checkout, the HTTP API is the workhorse that keeps your retention triggers honest. When it’s implemented well, cart recovery, replenishment, and winback flows fire off the right identity, with the right timing—without you duct-taping segments later.

If you want a second set of eyes on your event taxonomy, identity rules, and how this will actually behave inside campaigns, book a strategy call and we’ll pressure-test it like an operator would.

How It Works

At a practical level, the HTTP API is how your systems tell Customer.io two things: who someone is (profile/attributes) and what they did (events). Retention performance lives or dies on those two inputs—because segments, triggers, and message personalization all resolve from them.

  • Profiles (identify/create/update): You send a customer identifier (most teams use id as an internal user ID, plus email when available) along with attributes like first_name, accepts_marketing, lifetime_value, last_order_at, etc.
  • Events (track): You send an event name (like cart_viewed, checkout_started, order_completed) tied to the same person identifier, plus event properties (SKU, cart value, category, coupon, etc.).
  • Identity resolution: In practice, this tends to break when anonymous sessions (cookie/device) aren’t merged into a known profile at the moment you finally learn the email. Your goal is to ensure the “person” in Customer.io is consistent across browsing, checkout, and purchase—otherwise your cart recovery flow triggers for the wrong record (or not at all).
  • Segmentation + triggers: Once events/attributes land, segments update and campaigns can trigger immediately (or near-real-time). If you’re missing required properties or using inconsistent naming, your segments silently degrade and your triggers become unreliable.

Real D2C scenario: A shopper adds a bundle to cart on mobile, abandons, then completes purchase later on desktop after clicking a paid ad. If your HTTP API implementation doesn’t merge anonymous activity into the identified profile when they enter email at checkout, Customer.io may treat this as two people. Result: cart abandonment still sends after purchase, or purchase-based upsell never fires.

Step-by-Step Setup

The setup is straightforward, but the order matters. You’re trying to prevent the classic retention failure modes: duplicate profiles, missing emails, and events that arrive without the properties your segments depend on.

  1. Decide your canonical identifier strategy.
    Pick one primary key for Customer.io—ideally a stable internal customer_id (sent as id). Treat email as an attribute that can change, not the only identifier.
  2. Map your “must-have” profile attributes.
    Start with what your segments and message logic will actually use: email, phone (if SMS), created_at, accepts_marketing, country, timezone, last_order_at, orders_count, lifetime_value.
  3. Define a tight event taxonomy (names + required properties).
    For retention, you typically need: product_viewed, added_to_cart, checkout_started, order_completed, and optionally subscription_created, refund_created, order_shipped. For each event, document required properties like sku, product_id, category, price, quantity, cart_value, order_id.
  4. Implement Identify calls server-side wherever possible.
    Send profile updates from your backend (post-checkout, account create, subscription change). This reduces spoofed data and ensures the “source of truth” writes the attributes segments rely on.
  5. Implement Track calls for behavioral events.
    Send events from the system that knows the truth at that moment. For example: cart events can be client-side, but order_completed should be server-side to avoid false positives.
  6. Handle anonymous-to-known merging deliberately.
    When you capture email (email capture modal, checkout email step, account creation), immediately identify the person and merge prior anonymous activity if your architecture supports it. This is where most cart recovery programs either become clean—or permanently noisy.
  7. Validate in Customer.io with real-time testing.
    Trigger a test journey off checkout_started, then confirm: the person profile shows the right identifiers, the event includes required properties, and the segment membership updates as expected.

When Should You Use This Feature

Use the HTTP API any time you need higher-fidelity behavioral data than an off-the-shelf integration gives you, or when you need to control identity and event payloads to keep triggers dependable.

  • Cart recovery with real exclusions: Fire abandonment only if checkout_started happened and order_completed did not happen within X minutes—this requires clean purchase events and stable identity.
  • Post-purchase cross-sell based on SKU/category: If your upsell logic depends on line items, you need order_completed with item arrays or normalized properties you can segment on.
  • Replenishment reminders: Trigger “time to restock” based on last purchase date + product type. That requires accurate last_order_at and product-level event properties.
  • Reactivation that doesn’t spam buyers: Winback flows should suppress anyone who purchased in the last 30 days. That’s only safe if purchase events/attributes arrive reliably and quickly.

Operational Considerations

Most retention programs don’t fail because the message is bad—they fail because the data arriving in Customer.io is inconsistent, delayed, or mapped in a way that makes segmentation fuzzy. Treat the HTTP API as production infrastructure, not a “marketing integration.”

  • Segmentation accuracy depends on consistent naming and types: If cart_value is sometimes a string and sometimes a number, you’ll get segments that look right but don’t match in edge cases.
  • Event timing affects orchestration: If order_completed arrives late (batch sync), your abandonment flow will send to recent purchasers. For cart recovery, near-real-time purchase confirmation is non-negotiable.
  • Source of truth rules: Decide which system “owns” each attribute. For example, don’t let a client-side script overwrite accepts_marketing if your ESP consent lives in your backend.
  • Identity drift is the silent killer: If you create profiles sometimes by email and sometimes by internal ID without a merge plan, you’ll accumulate duplicates. That shows up later as inflated audience counts and broken frequency control.
  • Schema evolution: When you add new properties (like discount_code), roll them out with backward compatibility so segments don’t suddenly drop people due to missing fields.

Implementation Checklist

Before you call the implementation “done,” you want proof that Customer.io is receiving data that can actually drive retention logic without manual cleanup.

  • Canonical identifier chosen (internal id preferred) and documented
  • Profile attribute map finalized (names, types, source of truth)
  • Event taxonomy finalized (names, required properties, example payloads)
  • Server-side tracking for order_completed (and refunds/cancels if relevant)
  • Anonymous-to-known merge plan implemented at email capture/checkout
  • At least one cart recovery trigger tested end-to-end with purchase suppression
  • Segments validated against known test users (matched/not matched as expected)
  • Monitoring in place for failed API calls / dropped events

Expert Implementation Tips

The difference between “we integrated Customer.io” and “our retention engine prints money” is usually a handful of boring details that keep data clean at scale.

  • Make event payloads segment-friendly. If you know you’ll segment by brand/category/SKU, send those as first-class properties. Don’t bury everything in a nested blob you can’t easily filter on later.
  • Use one purchase event and standardize it. In most programs, we’ve seen teams track both purchase and order_completed from different systems. Pick one canonical event for workflows and keep it consistent.
  • Send “state change” attributes alongside events. When order_completed fires, also update last_order_at, orders_count, and lifetime_value in the same window. That prevents segments from lagging behind events.
  • Design for suppression first. Your best-performing flows (abandonment, winback) are also the easiest to mess up. Build the purchase/refund/cancel signals early so you can suppress confidently.

Common Mistakes to Avoid

These are the mistakes that create “ghost audiences,” misfires, and the kind of deliverability problems that look like a creative issue—but aren’t.

  • Tracking purchases client-side only: Ad blockers and page unloads will drop events, and you’ll email people who already bought.
  • Creating duplicate people by mixing identifiers: If one flow creates a profile with email and another with internal ID, you’ll split history and break frequency caps.
  • Inconsistent property naming: productId vs product_id vs sku becomes three separate segment dimensions and nobody notices until performance tanks.
  • Not sending timestamps correctly: If your event time is wrong (timezone, format, or missing), “within the last X hours/days” segments become unreliable—especially for abandonment windows.
  • Letting marketing consent drift: If consent is updated from multiple places without rules, you’ll either suppress too much (lost revenue) or message people you shouldn’t (compliance risk).

Summary

If you need reliable retention triggers, you need reliable inputs. The Customer.io HTTP API is the cleanest path when you care about identity resolution, real-time purchase suppression, and segmentation that matches how customers actually behave.

Implement it like production data plumbing, not a one-time integration, and your cart recovery + repeat purchase programs will stop leaking.

Implement Http Api with Propel

If you’re already running Customer.io, the fastest wins usually come from tightening identity and standardizing the handful of events your retention engine depends on. That’s the work that prevents abandoned cart noise, fixes duplicate profiles, and makes segments match reality.

If you want help pressure-testing your schema, merge strategy, and trigger reliability before you scale sends, book a strategy call and we’ll map the data-in plan to the retention outcomes you care about.

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