Set up in-app messages (SDK-first) in Customer.io

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 want in-app messages to actually move repeat purchase and cart recovery, the work starts long before you design the banner. The difference between “nice UI” and “incremental revenue” is whether your Customer.io SDK implementation identifies users cleanly and fires the right commerce events at the right moments—without duplicates, gaps, or broken identity stitching. If you want a second set of eyes on your tracking plan before you ship, you can book a strategy call and we’ll pressure-test it like an operator.

In-app messages in Customer.io are best when they’re treated like a real-time retention channel: they show up only when the app knows who the customer is, what they’ve done, and what they’re likely to do next.

How It Works

In practice, in-app messaging only performs when the SDK has two things nailed: identity and timing. Customer.io’s mobile/web SDKs track devices/sessions, associate them to a person when you call identify, and then evaluate in-app message targeting based on attributes and events you send.

  • SDK initializes in the app: your app loads the Customer.io SDK with the correct site/workspace credentials. This is what lets Customer.io register the device/session and be eligible to display in-app content.
  • Identity stitching via identify: anonymous sessions become useful only after you tie them to a real customer profile. The moment a shopper logs in, creates an account, or you otherwise know who they are, you call identify(userId) (and typically send core attributes like email, phone, and marketing consent flags).
  • Behavior arrives as events: you track events like Product Viewed, Added to Cart, Checkout Started, Order Completed, and Subscription Canceled. Customer.io uses these events to qualify people into segments and trigger in-app campaigns/workflows.
  • In-app message targeting: messages are evaluated in real time based on who the user is (attributes), what they’ve done (events), and what device/app context they’re currently in (screen, session, app version—depending on what you pass).

Real D2C scenario: a shopper adds a moisturizer to cart on mobile but doesn’t check out. When they reopen the app later that day, the SDK identifies them on session start, Customer.io sees they fired Added to Cart but not Order Completed, and you show a subtle in-app message: “Still thinking it over? Free shipping ends tonight.” That only works if the cart event is reliably tied to the same person profile you’re targeting.

Step-by-Step Setup

Most teams get stuck because they treat in-app as “turn it on in Customer.io.” The real setup is: install SDK, get identity right, instrument a minimal event taxonomy, then build messages that map to those events.

  1. Install the Customer.io SDK in your app Pick the SDK that matches your stack (iOS, Android, React Native, Flutter, etc.) and add it to the app. Make sure you’re using the correct workspace/site credentials for the environment (dev vs prod). If you mix credentials, you’ll end up debugging “missing users” that are actually in the wrong workspace.
  2. Initialize the SDK as early as possible in app startup Initialize on app launch so sessions/devices are captured consistently. If initialization happens late (after routing, after auth, etc.), you’ll miss the very moments you want for retention prompts (home screen return, cart revisit, PDP view).
  3. Implement identify at the right moment (and only when you truly know the user) Call identify immediately after login/account creation, and on subsequent app launches once the user is authenticated. Pass stable identifiers (your internal customer ID) and key attributes you’ll segment on (email, first_order_date, loyalty_tier, sms_opt_in, push_opt_in).
  4. Track a retention-grade commerce event set Start with the events you’ll actually orchestrate against. Typical D2C minimum:
    • Product Viewed (include product_id, category, price)
    • Added to Cart (include cart_id, product_ids, cart_value)
    • Checkout Started (include cart_value, shipping_method if known)
    • Order Completed (include order_id, order_value, items)
    In most retention programs, we’ve seen teams over-instrument early and then never use 80% of the events. Keep it tight and revenue-linked.
  5. Confirm event delivery and identity stitching in Customer.io Before you build any in-app message, validate in the Customer.io UI that:
    • events appear on the person profile you expect (not on an anonymous profile)
    • attributes update correctly after identify
    • duplicate events aren’t firing on app resume / back navigation
  6. Create the in-app message and target it with real conditions Build a message that maps to a specific event pattern. Example: show only when Added to Cart happened in the last 6 hours AND Order Completed has not happened since.
  7. QA on real devices with real user flows Test on iOS and Android separately. Run through: fresh install → browse → add to cart → close app → reopen → login/logout. In practice, this tends to break on edge cases like “guest checkout” or “login after browsing,” which is exactly where you want the message to work.

When Should You Use This Feature

In-app messages shine when you need a nudge inside the purchase context—not another email that lands two hours later. They’re especially effective when you can trigger off app-side events that email/SMS can’t reliably capture in real time.

  • Cart recovery inside the app: shopper returns to the app with items still in cart; show a reminder, incentive, or shipping reassurance based on cart value.
  • Second purchase push: after Order Completed, wait until the replenishment window and show a “reorder” or “complete the routine” message when they open the app.
  • Product discovery that leads to repeat purchase: if a customer repeatedly views a category (e.g., “protein”), show a targeted bundle offer or quiz CTA on the third view.
  • Reactivation for lapsed app users: if they haven’t purchased in 60+ days but still open the app, use an in-app winback message that routes them to bestsellers or a personalized collection.

Operational Considerations

Once in-app is live, the operational work is keeping segmentation and orchestration clean as your app, catalog, and promo calendar change. The SDK is the source of truth for “what’s happening right now,” so treat it like production infrastructure.

  • Segmentation depends on consistent event schemas: if one app version sends AddedToCart and another sends Added to Cart, your targeting silently degrades. Lock naming and properties early.
  • Data flow latency and ordering: if Order Completed arrives late (or from server-side only), you can accidentally show a cart recovery message to someone who already bought. For high-risk moments, consider sending the purchase event from the app immediately after confirmation (and reconcile server-side later).
  • Identity stitching across guest → logged-in: D2C apps often allow browsing and cart building before login. Decide how you’ll merge that activity once the user authenticates. If you don’t, your “return to cart” message won’t match the right person.
  • Orchestration with email/SMS/push: in-app shouldn’t fight other channels. Use shared suppression rules (e.g., if SMS discount sent in last 24h, don’t show an in-app discount—show reassurance or social proof instead).
  • Frequency control: in-app fatigue is real because it’s interruptive. Set caps by campaign and by user (e.g., max 1 cart prompt per day) and use event-based exits (purchase, cart cleared).

Implementation Checklist

If you want in-app to be dependable, treat this like a release checklist—not a marketing task. These are the items that prevent 90% of “why didn’t it show?” issues.

  • SDK installed and initialized on app launch (prod credentials verified)
  • identify called on login and on subsequent authenticated launches
  • Stable customer ID used as primary identifier (not email as the key)
  • Core commerce events instrumented with consistent naming and required properties
  • Event deduping strategy confirmed (no double-fire on resume/navigation)
  • Test plan covers guest browsing → login, and uninstall/reinstall edge cases
  • Segments built off events/attributes you know are populated for most users
  • Exit conditions set (purchase, cart emptied, subscription restarted, etc.)
  • Channel coordination rules defined (avoid stacking incentives)

Expert Implementation Tips

The teams that win with in-app tend to obsess over “what exactly happened in the app” and “who exactly is this person” more than creative. That’s where the leverage is.

  • Instrument “screen context” as an event/property: if you can pass screen_name or track Viewed Screen, you can avoid showing checkout prompts on irrelevant screens and keep messages feeling native.
  • Use cart value tiers to control incentive spend: for carts under $40, lead with reassurance (shipping/returns). For $100+, consider a stronger offer—only if they’ve shown intent (e.g., 2+ cart sessions).
  • Prefer event-based suppression over time-based guesses: don’t just “wait 2 hours.” Suppress when Order Completed fires, when Cart Emptied fires, or when Checkout Started fires.
  • Track “message shown” and “message clicked” back into Customer.io: if your SDK supports it (or you can emit your own events), feed exposure/click events so you can measure incrementality and prevent repeated prompts to people who already dismissed.

Common Mistakes to Avoid

Most in-app failures aren’t creative problems—they’re tracking and identity problems that only show up once real customers hit real edge cases.

  • Calling identify too late: if you identify after the user lands on Home, you miss the best trigger moments and your message eligibility becomes inconsistent.
  • Using unstable identifiers: tying identity to email (which can change) or device-only IDs (which reset) creates duplicates and breaks “repeat purchase” segmentation.
  • Relying on server-side purchase events only: if purchases arrive delayed, you’ll show post-purchase recovery prompts and burn trust.
  • No dedupe on add-to-cart: some apps fire add-to-cart on quantity change or on cart screen load. Your campaigns then think customers are “high intent” when they’re not.
  • Over-targeting with thin data: if only 30% of users have the attribute you filter on, your message won’t scale and you’ll blame the channel.

Summary

If you already have the Customer.io SDK in place, in-app messages are one of the fastest ways to capture “returning intent” and convert it into repeat purchases. The unlock is clean identify calls and a small set of commerce events you trust.

Use in-app when timing matters inside the app experience—and build your targeting around events, not assumptions.

Implement In App with Propel

If you’re rolling out in-app and want it to hold up under real D2C conditions (guest sessions, cross-device shoppers, delayed purchase events), it’s worth treating the SDK plan and identity stitching as the project—not the message design. We regularly see performance jump just by fixing when identify fires and tightening event schemas before campaigns go live.

We work hands-on with teams running Customer.io to get app-side tracking and orchestration right, then translate that into retention flows that don’t spam or waste discounts. If you want to sanity-check your implementation and targeting approach, book a strategy call.

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