Summarize this documentation using AI
Overview
If you’re running retention in Customer.io, mobile lifecycle events are the difference between “we sent a push” and “we hit the user at the exact moment they came back to the app.” If you want help pressure-testing your tracking plan before you wire it into automations, book a strategy call—most issues we see aren’t message problems, they’re event/identity problems.
Lifecycle events are the app-side signals that tell Customer.io when the app opened, resumed, backgrounded, or when a session effectively started. Once those are reliable, you can build journeys that react to real engagement—especially for cart recovery, browse follow-ups, and reactivation.
How It Works
On mobile, you don’t get “site visits” for free like you do on the web. Lifecycle events fill that gap by emitting standardized engagement signals from the SDK into Customer.io, so your segmentation and orchestration don’t rely on fragile proxy metrics.
- The SDK listens for app lifecycle transitions (foreground/background, app open/resume) and sends corresponding events to Customer.io.
- Events land on a person profile—either an anonymous profile (pre-login) or an identified profile (post-login / post-email capture).
- Identity stitching matters: if a user browses anonymously, then logs in, you want that pre-login activity to merge into the known profile so your cart recovery or product follow-up doesn’t “forget” what they did.
- Journeys use these events as triggers, filters, and timing gates (e.g., “send a push 30 minutes after last app open if cart still open”).
In practice, this tends to break when teams track “App Open” but never send a stable identifier, so the same shopper becomes 3–10 profiles over time. Your messaging looks noisy, frequency controls fail, and attribution gets weird.
Step-by-Step Setup
Before you touch journeys, get the plumbing right. Your goal is simple: every meaningful lifecycle event should arrive in Customer.io on the correct person, with consistent device + identity behavior across installs, logins, and logouts.
- Install the Customer.io mobile SDK
Add the SDK for your platform (iOS/Android/React Native/Flutter/Expo) and confirm the app builds cleanly in a release configuration. - Initialize the SDK as early as possible
Do this at app start (e.g., Application/Scene entry points). If initialization happens late, you’ll miss the very events you care about (first open, resume). - Enable/confirm lifecycle tracking is on
Depending on your SDK version/config, lifecycle events may be automatic or require an explicit toggle. Verify your implementation actually emits lifecycle events in a real device session (not only simulator). - Implement
identifywith a stable customer identifier
Call identify immediately after you know who the user is (login, account creation, email capture). Use a stable ID (your internal customer ID is best; email is acceptable if it’s immutable for your business). - Pass key customer attributes at identify-time
At minimum: email/phone (if you message there), acquisition source if you have it, and anything you’ll segment on (VIP tier, subscription status). Don’t drip these in randomly—set them deterministically. - Track commerce events alongside lifecycle events
Lifecycle events tell you they’re active; commerce events tell you what to do about it. Track events likeProduct Viewed,Added to Cart,Checkout Started,Order Completedwith consistent properties (product_id, price, quantity, cart_id/order_id). - Validate in Customer.io Activity Logs
Open the app, background it, reopen it, log in/out, and confirm:- Lifecycle events appear with expected names/timestamps.
- Anonymous activity merges into the identified profile after identify.
- Duplicate profiles aren’t being created for the same user.
- Only then wire events into journeys
Use lifecycle events as triggers/guards (e.g., “if app opened in last 24h, suppress reactivation”). Use commerce events as the intent signal.
When Should You Use This Feature
Lifecycle events pay off when timing and recency drive the conversion—especially on mobile where push and in-app are your fastest levers. If you’re already sending pushes but you’re not gating by “recently active,” you’re probably burning opt-outs.
- Cart recovery that respects engagement: trigger cart follow-up after
Added to Cart, but suppress if the user opened the app in the last 30–60 minutes (they might still be deciding). - Reactivation that avoids spamming active users: send a winback only if there’s been no lifecycle activity for 14+ days, not just “no purchase.”
- Post-purchase repeat purchase nudges: if a customer bought 21 days ago and then opens the app, that open can be the cue for a replenishment push or cross-sell sequence.
- Browse-to-buy follow-ups: if someone viewed a product category and then you see no app opens for 48 hours, that’s a clean handoff to email/SMS instead of more push.
Real D2C scenario: A skincare brand sees lots of “Add to Cart” but low checkout completion on mobile. With lifecycle events, they run: (1) if cart created and no purchase within 30 minutes, wait; (2) if no app open in that window, send push with the exact product name; (3) if the app opens but they still don’t buy, switch to email the next morning with reviews/UGC. Without lifecycle events, step (2) hits people who are actively in-app and tanks push permission rates.
Operational Considerations
Once lifecycle events are flowing, the work shifts to keeping your data model clean so segmentation and orchestration behave predictably. This is where most retention programs quietly leak performance.
- Segmentation depends on event consistency: decide which lifecycle event represents “active” for your business (e.g., app open/resume) and standardize on it for recency segments like “Active in last 3 days.”
- Identity stitching is non-negotiable: if your app supports guest browsing, make sure anonymous profiles merge on login/identify. Otherwise, cart and browse events won’t connect to the person you can message.
- Data flow timing affects journey timing: mobile events can arrive delayed on poor networks. Build buffers (e.g., wait 5–10 minutes) before sending “you left something behind” pushes to avoid false positives.
- Orchestration across channels: lifecycle events are great for push/in-app gating, but email/SMS should often be driven by a combination of intent + inactivity (e.g., “added to cart + no app open for 2 hours”).
- Frequency control needs a single source of truth: if lifecycle events create duplicate profiles, your frequency caps won’t protect the customer experience.
Implementation Checklist
Use this as the “done means done” list before you let lifecycle events drive revenue-critical journeys like cart recovery and winback.
- SDK installed and initialized at app start (release build verified)
- Lifecycle events visible in Customer.io Activity Logs from a real device
identifycalled immediately on login/account creation/email capture- Stable identifier chosen (internal customer ID preferred) and used consistently
- Anonymous-to-known merge confirmed (pre-login events show on the known profile)
- Commerce events tracked with consistent naming + required properties
- Recency segments defined (e.g., Active 1d/3d/7d) using lifecycle events
- Journey suppression rules drafted (active users suppressed from winback, etc.)
Expert Implementation Tips
These are the small choices that usually separate “events are flowing” from “events are profitable.”
- Pick one canonical “engaged” event and build everything around it. If you mix open/resume/session-start interchangeably, your segments will drift and your holdouts won’t be trustworthy.
- Send identify once you’ve earned the right: don’t identify on app install with a random ID that later changes. Identify when you have a stable account identifier, then merge the anonymous history.
- Use lifecycle events as guards, not just triggers: the best cart recovery flows don’t trigger on opens—they use opens to decide whether to wait, switch channels, or stop.
- Instrument logout intentionally: if your app supports logout, decide what should happen to messaging eligibility and device association. Otherwise, shared devices can create messy cross-user targeting.
- QA with “ugly” conditions: test on slow network, background/kill/reopen, and fresh install. That’s where missing initialization and delayed events show up.
Common Mistakes to Avoid
Most retention teams don’t fail on creative—they fail on event truth. These are the patterns that cause duplicated sends, broken suppression, and journeys that feel random.
- Calling identify with different IDs over time (email one day, internal ID another). This fragments profiles and breaks frequency controls.
- Relying on lifecycle events without commerce context. Knowing someone opened the app doesn’t tell you what to say; pair it with product/cart/order events.
- Triggering winback purely on “no purchase”. You’ll hit active browsers who aren’t ready, and you’ll train them to ignore you.
- No delay buffers for mobile event latency. Immediate “abandoned cart” pushes can fire while the checkout event is still in-flight.
- Not validating anonymous merge. Guest carts are common in D2C; if those don’t stitch, your best-intent signals never reach the messageable profile.
Summary
If mobile is a meaningful revenue channel, lifecycle events are table stakes for accurate recency, suppression, and timing. Get SDK initialization + identify + stitching correct first, then use lifecycle signals to gate cart recovery, repeat purchase nudges, and winback.
Implement Lifecycle Events with Propel
If you’re already in Customer.io, the fastest path is usually: confirm lifecycle events are clean, confirm identity stitching works, then map those signals into 2–3 high-impact journeys (cart recovery, post-purchase, reactivation) with clear suppression rules. If you want a second set of eyes on your SDK event plan and how it’ll behave once it hits segmentation and orchestration, book a strategy call.