Summarize this documentation using AI
Overview
If you’re already using Customer.io for email/SMS/push, inline in‑app messages are the missing “last mile” for retention: they let you change what customers see inside the app based on real behavior, not just send another notification. If you want help designing the placements and triggers so they actually lift repeat purchase (and don’t annoy customers), book a strategy call.
Inline in‑app is best when you need a message to appear as part of the product UI (banner, card, module) rather than a modal. For D2C apps, that usually means nudges on PDPs, cart, order status, loyalty, and account screens—places customers already visit when purchase intent is high.
How It Works
Inline messages only work as well as your tracking and identity stitching. In practice, the win comes from showing the right content to the right person at the moment they load a screen—so the SDK has to (1) know who the user is and (2) have the latest events/attributes that qualify them for the message.
- SDK renders a placement: Your app defines an “inline slot” (a placement) in a specific screen or component. When that view loads, the SDK requests any eligible inline content for that placement.
- Eligibility is audience-driven: Customer.io decides what to return based on the person profile (attributes), recent events, and campaign/journey rules.
- Identity stitching is the gate: Anonymous browsing can be captured, but the message targeting gets dramatically better once you call
identify(email, customer_id, or your internal user id). If you delay identify until after checkout/login, you’ll miss the highest-intent sessions. - Events make it contextual: Inline works best when you track screen views and commerce actions (viewed_product, added_to_cart, started_checkout, purchased) with clean properties (sku, category, cart_value, currency).
- Impressions/clicks should be tracked: Don’t just rely on “message sent.” Track exposure and engagement so you can segment people who saw it but didn’t act—and follow up via push/email.
Real D2C scenario: A customer adds a moisturizer to cart but doesn’t check out. Next time they open the app and land on the cart screen, you render an inline module offering “Free shipping over $45” or a bundle suggestion. If they tap, you track inline_clicked with placement + variant, and if they still don’t convert you trigger a push 2 hours later—only for people who saw the module.
Step-by-Step Setup
The setup is straightforward, but most teams get tripped up by identity timing and inconsistent event payloads. Get the SDK wired, then lock down a naming convention for placements and commerce events before you build more than 1–2 modules.
- Install the Customer.io SDK (mobile/web): Add the appropriate SDK to your iOS/Android/React Native/Flutter/web app and confirm it initializes on app start.
- Decide your primary identifier and call
identifyearly:- Use a stable
customer_id(preferred) or email if that’s your system of record. - Call
identifyimmediately after login and after account creation. If your app supports guest checkout or pre-login browsing, plan for anonymous activity and merge when the user authenticates.
- Use a stable
- Track the minimum viable commerce events:
screen_viewed(properties: screen_name, placement_context)viewed_product(sku, product_id, category, price)added_to_cart(sku/product_id, quantity, cart_value)started_checkout(cart_value, item_count)purchased(order_id, revenue, items[])
- Create inline placements in the app UI:
- Name placements like
cart_inline_upsell_v1orpdp_loyalty_banner_v1(avoid vague names like “banner1”). - Render the inline container only on the intended screen(s) so you don’t accidentally request content everywhere.
- Name placements like
- Configure the inline in-app message in Customer.io:
- Target the placement name(s) you defined in the app.
- Build the audience using events/attributes (e.g., added_to_cart in last 24h AND not purchased).
- Set frequency rules so the same customer doesn’t see the same module every session.
- Track exposure and engagement from the app:
- Track
inline_impressionwhen the module is actually visible (not just “loaded”). - Track
inline_clickedwith properties: placement, campaign_id/message_id, variant, destination.
- Track
- QA with real devices and real identities:
- Test anonymous → login merge flows.
- Confirm the right person qualifies when events fire in the expected order.
- Validate you can turn the message off instantly without an app release (that’s one of the operational wins here).
When Should You Use This Feature
Inline in‑app shines when the customer is already in a high-intent moment and you want to guide the next action without interrupting them. For retention, the best use cases are the ones where timing and context matter more than reach.
- Cart recovery inside the app: Show a “complete your order” module only to people who added to cart recently and haven’t purchased—especially effective if your push/email is already saturated.
- Repeat purchase nudges on account/order screens: After delivery windows, show replenishment reminders or “buy again” modules based on last purchased SKU/category.
- Product discovery tied to behavior: On PDPs, show an inline “Pairs well with” bundle card for customers who viewed multiple products in a category but haven’t added to cart.
- Loyalty/VIP progression: If you track points/tier as attributes, show “You’re $12 away from VIP” in cart to increase AOV and repeat rate.
- Reactivation during organic return sessions: If a lapsed customer opens the app (but ignores email), show a personalized “Welcome back” offer module—gated by last purchase date.
Operational Considerations
Inline messages are easy to launch and easy to mess up if your data model isn’t disciplined. The biggest operational difference vs email/SMS is that the app controls when the placement loads—so segmentation and data freshness matter more than send-time optimization.
- Segmentation depends on event latency: If your app batches events or sends them late, customers won’t qualify when the screen loads. For cart recovery, aim for near-real-time event delivery for
added_to_cartandpurchased. - Identity stitching impacts eligibility: If a user adds to cart while anonymous and only identifies later, make sure your implementation merges anonymous activity into the known profile—otherwise you’ll show generic modules instead of cart-aware ones.
- Placement naming is your orchestration layer: Treat placement names like API contracts. If engineers rename a placement without telling marketing, the message “dies” silently.
- Frequency + fatigue controls: Inline can become visual clutter fast. Use frequency rules (per session/day) and suppress messages after conversion events.
- Cross-channel coordination: In most retention programs, the best lift comes from sequencing: inline first (low-friction), then push/email only if the customer saw it and didn’t act.
Implementation Checklist
If you want this to work without weekly fire drills, lock these basics before you scale placements across the app.
- SDK initialized on app start and verified in production builds
identifycalled reliably (login, signup) with a stable primary ID- Anonymous → known merge plan documented and tested
- Core commerce events implemented with consistent property schema
- Inline placement names standardized and versioned (v1/v2)
inline_impressionandinline_clickedevents tracked with placement + campaign metadata- Suppression logic in journeys/campaigns (stop showing after purchase or after N impressions)
- QA plan covering edge cases (offline mode, delayed events, logged-out sessions)
Expert Implementation Tips
The teams that win with inline aren’t the ones with the most modules—they’re the ones with clean triggers, clean identity, and ruthless control over where messages appear.
- Gate by intent, not just segment membership: Instead of “all lapsed users,” target “lapsed users who viewed_product in this session.” Inline is most powerful when it reacts to what’s happening now.
- Use a two-step measurement plan: Measure (1) engagement (impressions → clicks) and (2) downstream conversion (click → add_to_cart/purchase). If clicks are high but purchases aren’t moving, your offer or landing destination is the issue—not the SDK.
- Version placements when you redesign UI: Keep
cart_inline_upsell_v1live while you shipv2. It prevents “nothing shows up” regressions when layouts change. - Send campaign context back to Customer.io: Include message/campaign identifiers in your click events so you can build segments like “saw inline bundle offer but didn’t purchase in 24h.”
- Don’t rely on one identifier across platforms: If you have web + app, align on a single customer key across both so you don’t fragment purchase history and eligibility.
Common Mistakes to Avoid
Most inline rollouts fail for boring reasons: the message technically renders, but targeting is wrong, attribution is missing, or the same customer sees it 20 times.
- Calling
identifytoo late: If you identify only after checkout, you lose the session where inline would have prevented abandonment. - Inconsistent event schemas: Mixing
productIdandproduct_idacross platforms breaks segmentation and personalization. - No impression tracking: Without impressions, you can’t separate “message didn’t render” from “message rendered but didn’t work.”
- Over-targeting with stale attributes: If loyalty tier or last purchase date isn’t updated promptly, you’ll show the wrong offer to the wrong customer.
- Ignoring suppression after conversion: Showing a “Finish checkout” module to someone who already purchased is the fastest way to train customers to ignore in-app content.
- Engineering-only placement logic: If placements are hardcoded without a shared naming/ownership process, marketing can’t safely iterate.
Summary
Inline in‑app messages are a retention lever when you need context: cart, PDP, loyalty, and reorder moments. Get identity stitching and event hygiene right first, then scale placements with tight frequency and clean measurement.
Implement Inline In App with Propel
If you’re running Customer.io and want inline in‑app to drive measurable repeat purchase (not just “we shipped a banner”), the fastest path is aligning SDK identity, event schema, and placement strategy before you build 10 variants. If you want an operator’s POV on what to track, where to place modules, and how to orchestrate inline → push/email follow-ups, book a strategy call.
In most retention programs, we’ve seen inline work best when it’s treated like a product surface with lifecycle-grade measurement: impressions, clicks, downstream revenue, and strict suppression rules—so it earns its place on your highest-intent screens.