Summarize this documentation using AI
Overview
If you’re routing behavioral data through Customer.io via mParticle (Legacy), the win isn’t “having an integration”—it’s getting identities and event payloads consistent enough that your retention triggers fire every time. If you want a second set of eyes on your schema and identity rules before you scale journeys, you can book a strategy call and we’ll pressure-test it like an operator would.
In most D2C programs, mParticle is the source of truth for app + web behavior. Customer.io becomes the orchestration layer. Your job is to make sure what enters Customer.io is: (1) correctly identified, (2) mapped to the right attributes/events, and (3) stable over time so segments don’t drift.
How It Works
At a practical level, mParticle (Legacy) is your data router: it collects events/attributes from your app, site, and backend, then forwards them to Customer.io. Customer.io stores people profiles (attributes) and behavioral events, and your campaigns/journeys trigger off that data.
- Identity resolution happens before retention works. mParticle will see multiple identifiers (email, customer_id, device IDs). Customer.io needs one primary identifier per person profile (typically
idoremail). If you don’t standardize this, you’ll split one shopper into multiple profiles and your cart recovery will “miss” them. - Data mapping determines segmentation accuracy. mParticle forwards:
- Profile attributes (e.g.,
email,phone,first_name,lifetime_value,last_order_date) that Customer.io uses for segments and personalization. - Events (e.g.,
Product Viewed,Add to Cart,Checkout Started,Order Completed) that Customer.io uses for triggers, goals, and suppression logic.
- Profile attributes (e.g.,
- Trigger reliability depends on event shape and timing. Customer.io triggers are literal: if your journey listens for
checkout_startedbut mParticle sendsCheckout Started, you’ll get silent failure. Same if you sendorder_completedwithout anorder_idand can’t dedupe. - Anonymous-to-known stitching is where cart recovery usually breaks. A shopper browses anonymously, adds to cart, then logs in at checkout. If mParticle doesn’t stitch the anonymous activity to the known user before forwarding to Customer.io (or you don’t send the right identify call), Customer.io will store the cart events on an anonymous/duplicate profile and your recovery flow won’t reach the right email/phone.
Real scenario: A shopper adds a bundle to cart on mobile web, then completes checkout in-app after logging in. If mParticle resolves both sessions to the same customer_id and forwards consistent events, Customer.io can (a) suppress cart recovery because purchase happened, and (b) start a post-purchase cross-sell journey using the exact items from the cart/order payload. If identity isn’t unified, you’ll send an abandoned cart message after they already bought—classic retention self-own.
Step-by-Step Setup
Before you touch Customer.io campaigns, lock down the data contract. You’re setting this up so your future journeys don’t require constant “why didn’t they enter?” debugging.
- Decide your primary identifier for Customer.io.
Most D2C teams use a stable internalcustomer_idasidand also sendemailandphoneas attributes. Pick one and stick to it across web, app, and backend sources. - Audit the events you’ll rely on for retention.
At minimum, validate naming and required properties for:product_viewed(product_id, sku, category)add_to_cart(cart_id, items[], value)checkout_started(cart_id, items[], value)order_completed(order_id, items[], revenue, discount, shipping)
- Configure the mParticle output to Customer.io (Legacy connector).
Set the destination to forward both profile updates and events. The operator check here is simple: are you sending identify/profile updates often enough that Customer.io has deliverable channels (email/phone) by the time an event triggers a journey? - Map identities and user attributes intentionally.
Ensure mParticle forwards:- Required identifiers:
id(oremailif you’re email-first). - Channel fields:
email,phone(E.164 format), and consent flags if you use them. - Retention-critical attributes:
first_order_date,last_order_date,orders_count,lifetime_value,subscription_status(if applicable).
- Required identifiers:
- Send test traffic and validate in Customer.io.
Use Customer.io’s people profiles and activity feed to confirm:- Events land under the correct person (not an anonymous/duplicate profile).
- Event names match exactly what you’ll use in triggers.
- Key properties exist (order_id, cart_id, items[]).
- Lock a versioned event schema.
Document event names + properties and treat changes like code changes. Retention performance drops fast when “someone renamed an event” and nobody updated journeys.
When Should You Use This Feature
mParticle (Legacy) → Customer.io is the right move when you want Customer.io to react to behavior across multiple surfaces (web, app, backend) without building and maintaining separate tracking pipelines. The real benefit is consistency: one identity graph and one event stream feeding retention.
- Cart recovery that actually suppresses on purchase. Forward
checkout_startedandorder_completedwith shared keys (cart_idor a consistent user id) so Customer.io can avoid sending “you left items behind” after the order. - Repeat purchase triggers based on product/category. If
order_completedincludes line items withproduct_id/category, you can build segments like “Bought skincare cleanser but not moisturizer” and trigger replenishment or attach-rate flows. - Reactivation based on true inactivity. Use a reliable
last_order_dateattribute or derive inactivity fromorder_completedevents—either way, don’t rely on “last seen” web activity if your brand has heavy app usage. - Cross-channel orchestration. If mParticle is also managing consent and channel eligibility, you can keep Customer.io segments clean (e.g., SMS-eligible purchasers in the last 60 days).
Operational Considerations
Most retention issues here aren’t “integration bugs”—they’re data consistency problems that show up as leaky segments, duplicate profiles, and unreliable triggers. Plan for those realities upfront.
- Segmentation drift from inconsistent attribute types. If
last_order_datearrives as a string for some users and a timestamp for others, your “purchased in last 30 days” segment will be wrong. Standardize formats at the source. - Duplicate profiles kill attribution and suppression. If one user exists as
email-identified andcustomer_id-identified separately, you’ll double-send and misread performance. Pick a primary id and ensure mParticle stitches before forwarding. - Event latency changes journey behavior. If
order_completedarrives late (or intermittently), cart recovery suppression fails. For D2C, purchase events should come from the backend/order system when possible, not only client-side. - Dedupe strategy matters. Customer.io will record what you send. If your stack retries events, you need an
order_id/event_idproperty you can use downstream to avoid counting conversions twice. - Orchestration across tools needs a single “truth.” If you also send events directly to Customer.io (Track API) while mParticle sends the same events, you’ll create double triggers. Decide one ingestion path per event family.
Implementation Checklist
Use this as a pre-flight before you build or scale any retention journeys off mParticle-fed data. If you can’t check these off, you’ll spend your time debugging instead of shipping.
- Primary identifier chosen and consistent across all sources (web/app/backend).
- Email and phone are mapped as attributes; phone is normalized to E.164.
- Consent/eligibility attributes are defined (email opt-in, SMS opt-in) and consistently populated.
- Event names are finalized (case, spacing, underscores) and match what Customer.io triggers will reference.
- Core retention events include required properties (cart_id, order_id, items[], revenue/value).
- Anonymous-to-known stitching is validated with a real browse → login → purchase flow.
- Backend purchase event is implemented or confirmed reliable.
- No duplicate ingestion paths for the same events (mParticle vs direct Track API).
- Test profiles in Customer.io show correct activity history and attributes.
Expert Implementation Tips
The teams that win with Customer.io aren’t doing “more automations”—they’re feeding cleaner data so every automation behaves predictably.
- Send item arrays in a consistent schema. For cart and order events, keep
itemsstructured the same way every time (product_id, sku, quantity, price). This unlocks reliable dynamic content and product-specific suppression. - Prefer backend for revenue truth. Client-side purchase events are fine for speed, but backend events are what keep LTV segments and post-purchase timing accurate.
- Use a “channel eligibility” attribute, not just consent. In practice, deliverability and compliance are messy. A single boolean like
sms_eligibleoremail_eligible(computed upstream) keeps Customer.io segments simple and reduces accidental sends. - Stitch before the first high-intent event. Don’t wait until
order_completedto identify. Make sure login/create account triggers an identify/profile update socheckout_startedcan trigger the right journey in real time.
Common Mistakes to Avoid
These are the failure modes that show up after you’ve launched “working” flows—and then wonder why performance is inconsistent week to week.
- Building journeys off event names that aren’t stable. Someone changes
Add to CarttoAdded to Cartand your trigger goes dead. - Letting multiple IDs compete. Email on web, customer_id in app, and no stitching means one shopper becomes three profiles.
- Missing suppression keys. If cart recovery can’t match purchase to cart (or at least to the same unified user), you’ll spam customers who already converted.
- Overloading attributes with inconsistent types. Arrays sometimes, strings other times. Customer.io segmentation won’t behave the way you think.
- Relying on “last seen” instead of purchase truth for reactivation. Browsing ≠ buying. Reactivation should key off orders unless you have a very specific browse-based strategy.
Summary
If mParticle (Legacy) is feeding Customer.io, treat it like a data contract—not a toggle. Get identity resolution, event naming, and payload consistency right and your retention triggers will fire cleanly.
If you’re seeing missed entries, duplicate sends, or broken suppression, it’s almost always an ID or schema problem upstream.
Implement Integrating With Mparticle with Propel
If you’re implementing mParticle (Legacy) into Customer.io, the fastest path is usually validating identity + schema with real shopper flows (anonymous browse → add to cart → login → purchase) before you build more journeys. That’s the point where segmentation accuracy and trigger reliability either lock in—or quietly fall apart.
If you want help pressure-testing your event map and stitching rules, you can book a strategy call. We’ll focus on the operational stuff that keeps cart recovery, repeat purchase, and reactivation programs from breaking at scale.