Summarize this documentation using AI
Overview
If your Customer.io journeys are “randomly” underperforming, it’s usually not creative—it’s tracking. When the SDK isn’t identifying users consistently or events arrive without the right IDs, your cart recovery, replenishment, and winback automations silently miss people. If you want a second set of eyes on the end-to-end data flow (app → identity → event → segment → journey), book a strategy call and we’ll walk through what’s actually breaking.
In most retention programs, we’ve seen troubleshooting come down to three things: identity stitching (anonymous → known), event timing (events firing before identify), and inconsistent payloads (same event name, different fields across platforms/releases).
How It Works
Customer.io SDK tracking only helps retention if it produces a clean, durable customer timeline. Practically, that means the app (or web) has to (1) create a stable customer identity, then (2) send consistent events tied to that identity, so segments and journeys can reliably evaluate conditions.
- Identify establishes the person record. Your app calls
identifywith a stable identifier (typically your internal user ID; sometimes email/phone depending on your model). This is the “anchor” that retention automations depend on. - Anonymous activity needs stitching. Users often browse or add to cart before login. The SDK can track anonymous events/device activity, but you only get retention value if that activity is merged to the identified profile after login/signup.
- Events drive orchestration. Journeys trigger off events like
Product Viewed,Added to Cart,Checkout Started,Order Completed. If those events are missing required properties (SKU, value, currency) or land on the wrong profile, your segments won’t match and messages won’t send. - Data quality impacts eligibility. Frequency caps, suppression rules, and “has/has not done X” filters all depend on timestamps and consistent naming. Small inconsistencies create big audience gaps.
Step-by-Step Setup
When a journey isn’t firing, don’t start by editing the workflow. Start by proving the app is sending the right identity and events, in the right order, to the right profile. This sequence is the fastest way to isolate the failure point.
- Pick one broken use case and one test user. Example: iOS cart abandonment isn’t sending, but Android is. Choose a single internal tester account and reproduce the behavior end-to-end.
- Verify SDK initialization happens once and early. Confirm the SDK is configured at app start (or web app boot) and not re-initialized on every screen. Re-inits can cause duplicate device records and weird anonymous behavior.
- Confirm
identifyruns immediately after authentication. After login/signup, callidentifywith your stable user ID and core attributes (email/phone if you message on those channels). If identify is delayed until “later,” your events will attach to an anonymous profile. - Validate anonymous-to-known stitching. Reproduce: open app logged out → view product → add to cart → login → complete checkout. Then confirm those pre-login events appear on the identified profile (not stranded on an anonymous profile).
- Check event naming and property schema. Ensure the same event name is used across platforms (iOS/Android/Web) and across app versions. Lock a schema for required properties (e.g.,
sku,product_id,price,currency,quantity,cart_id). - Confirm event timing relative to identify. If the app fires
Added to Cartbefore identify, you’ll see “missing audience” issues in cart recovery. Either identify earlier or queue events until identity is set. - Verify the person profile in Customer.io. In the UI, open the test person and confirm: attributes updated, device present, and the event timeline shows expected events with expected properties.
- Validate the segment/journey conditions against real data. Take the exact event properties you see on the profile and compare them to your segment filters and journey trigger rules. Most “journey bugs” are actually property mismatches (e.g., filtering on
cart_valuewhen the app sendsvalue).
When Should You Use This Feature
Troubleshooting isn’t a one-off task—it’s part of keeping retention revenue stable while your app, site, and product catalog change. The highest ROI comes from debugging around the moments where identity and event integrity matter most.
- Cart recovery drops suddenly. Common scenario: a new app release changed
Added to Cartproperties, so the journey trigger still fires but downstream filters exclude most users. - Repeat purchase flows feel “thin.” If replenishment or post-purchase cross-sell is under-sending, the usual culprit is
Order Completedmissing line items, SKU/category, or order value—so segmentation can’t target correctly. - Reactivation audiences don’t match reality. If “30-day inactive” includes recent purchasers, you probably have identity duplication (same customer across multiple profiles) or missing app activity events.
- Mobile vs web performance diverges. When web drives revenue but app does not (or vice versa), it’s often inconsistent identity strategy (email on web, user_id in app) causing split profiles.
Operational Considerations
Once tracking is “working,” the operational risk is drift—teams ship changes that slowly degrade segmentation and orchestration. The goal is to make data flow predictable enough that retention programs don’t require constant babysitting.
- Segmentation depends on stable schemas. If your segments reference
product_categoryorsku, treat those as contracts. In practice, this tends to break when merchandising renames fields or engineering ships a new event payload without updating downstream filters. - Identity stitching is a retention multiplier. Anonymous browsing + later login is normal in D2C. If you don’t merge that activity, your cart recovery and browse abandonment will undercount high-intent users—especially on mobile.
- Orchestration needs deterministic event order. Journeys often assume:
identify→Added to Cart→ delay → check forOrder Completed. If events arrive out of order, you’ll message buyers like abandoners. - Cross-channel eligibility relies on attributes. Push requires device tokens; SMS requires phone + consent state; email requires deliverable email. Missing attributes look like “journey not working” when it’s actually “user not reachable.”
- Versioning matters. Keep an internal changelog of event schema updates by app version. Without it, troubleshooting becomes guesswork when performance shifts week-over-week.
Implementation Checklist
Before you call a journey “broken,” run this checklist on one test user and one real customer profile. It catches the issues that most often cause missed sends and bad audience math.
- SDK initializes once per session (not per screen)
identifyuses a stable ID (and the same strategy across platforms)- Anonymous pre-login events merge into the identified profile after login
- Event names are consistent across iOS/Android/Web
- Required properties exist on key events (cart, checkout, purchase)
- Events fire after identify (or are queued until identity exists)
- Customer.io profile shows the device + recent events in the activity timeline
- Segment filters match the actual property names/types being sent
- Suppression/consent attributes are present for each channel you use
Expert Implementation Tips
The difference between “tracking implemented” and “tracking operationally reliable” is the layer of discipline you add around identity and schemas. These are the moves that keep retention stable as the business scales.
- Standardize on one primary identifier. Pick
user_idas the anchor everywhere (web + app) and store email/phone as attributes. This reduces split profiles and makes reactivation segments trustworthy. - Queue high-intent events until identity is known. For app flows where users add to cart before login, buffer the event and flush it right after identify. That single change often lifts cart recovery eligibility materially.
- Define “required properties” per event. For
Order Completed, requireorder_id,value,currency, and line items. If any are missing, treat it as a tracking error, not “good enough.” - Keep event names boring and permanent. Marketing-friendly names change; retention logic shouldn’t. Use stable internal names and map them to message copy with Liquid.
- Test with real journey logic, not just event receipt. Seeing an event in a timeline doesn’t mean the journey will send—filters, time windows, and “has not purchased since” checks can still exclude users.
Common Mistakes to Avoid
Most teams don’t fail because they didn’t implement the SDK—they fail because they implemented it in a way that makes identity and events unreliable under real customer behavior.
- Firing events before
identify. This strands high-intent behavior on anonymous profiles and guts cart/browse recovery. - Using email as ID on web and user_id as ID in app. That creates two “different” customers, wrecking frequency control and reactivation logic.
- Changing property names without updating segments. One small payload change can drop segment size overnight and look like deliverability or creative issues.
- Not validating data types. Sending
valueas a string in one platform and a number in another breaks comparisons and “above/below” filters. - Assuming purchase events are enough. Without product/category context, your repeat purchase and upsell targeting becomes generic and underperforms.
Summary
If retention sends are inconsistent, start by proving identity stitching and event order—not by rewriting journeys. Once identify is stable and event schemas are consistent, your segments tighten up and automation performance becomes predictable.
Implement Troubleshooting with Propel
If you’re seeing gaps between “events are coming in” and “journeys are sending,” it usually means identity, schema drift, or channel eligibility is off. We’ll help you trace the full path inside Customer.io—from SDK calls to segment logic—so cart recovery, repeat purchase, and winback flows hit the right people at the right time. If you want to pressure-test your tracking and stitching approach, book a strategy call.