Deep Links (SDK): Send customers back into the right in-app moment

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’re using Customer.io for retention, deep links are one of the highest-leverage ways to turn a click into revenue—because the customer lands exactly where the message promised, inside your app. If you want help pressure-testing your tracking and routing (where most teams bleed conversions), book a strategy call and we’ll map it to your real flows.

In D2C, this usually shows up as: “Your cart is waiting” push/SMS/email → tap → app opens directly to the cart (not the home screen) with the items still there. When deep links are wired correctly, you reduce friction, improve cart recovery rate, and make post-purchase cross-sells feel intentional instead of spammy.

How It Works

Deep links are only as good as the app-side plumbing behind them. The marketing part is easy—Customer.io sends a URL. The retention part is making sure the app can resolve that URL into the right screen, with the right customer identity, and enough context to render the experience.

  • Customer.io sends a message containing a link (email/SMS/WhatsApp/push). That link can be your universal link/app link, a custom scheme, and often includes query params like cart_id, variant_id, or offer.
  • The OS routes the click: iOS/Android decide whether to open the app (universal/app links) or fall back to web if the app isn’t installed.
  • Your app parses the deep link and routes the user to the destination (cart, PDP, order status, loyalty page, etc.).
  • Your SDK identity stitching determines whether the session ties to the right person. If the user is logged in, you should call identify() early in the session so downstream events and conversions credit the right profile.
  • You track the outcome as an event (e.g., Deep Link Opened, Cart Viewed, Checkout Started, Order Completed) so you can suppress follow-ups, branch journeys, and measure lift.

In most retention programs, we’ve seen deep links “work” in QA but fail in production because identity isn’t consistent (guest vs logged-in), the app opens to a default screen, or the cart context isn’t persisted long enough to render the promised state.

Step-by-Step Setup

Before you touch Customer.io, get your app behavior deterministic: the same link should always land on the same screen, and it should behave sensibly for logged-out users. Once that’s stable, Customer.io becomes the distribution layer.

  1. Pick your deep link strategy
    • iOS: Universal Links (preferred) + a fallback route (web) for non-installed.
    • Android: App Links (preferred) + fallback route.
    • Avoid relying only on custom schemes for retention-critical flows—they’re easier to hijack and can be less reliable across apps/browsers.
  2. Define a routing contract (your “link map”)
    • Examples: mybrand.com/cart?cart_id=..., mybrand.com/pdp?sku=..., mybrand.com/reorder?order_id=...
    • Keep params stable; don’t change names every sprint or your journeys will rot.
  3. Install the Customer.io SDK (mobile) and initialize early
    • Initialize the SDK at app launch so events from a deep-link session don’t get dropped.
    • Enable push handling if you’re using push; deep links often come through push taps.
  4. Implement identity stitching with identify()
    • Call identify(customerId) immediately after login/registration.
    • If you support guest browsing, track events anonymously first, then identify on login so the session attributes to the eventual customer profile.
    • If you have multiple identifiers (email, phone), pick one canonical customerId and store the rest as attributes—this reduces duplicate profiles.
  5. Parse deep links and route to the correct screen
    • Handle both cold start (app closed) and warm start (app backgrounded).
    • If the user is logged out, route to login and then continue to the intended destination (don’t dump them on home after auth).
  6. Track deep link opens and downstream intent events
    • At minimum: Deep Link Opened with properties like source (email/sms/push), campaign_id, destination, and the business context (e.g., cart_id).
    • Then track the next meaningful steps: Cart Viewed, Checkout Started, Order Completed.
  7. Use the link consistently inside Customer.io messages
    • Standardize the deep link per message type (cart recovery, winback, replenishment) so reporting and suppression rules are clean.
    • If you add query params for attribution, keep them consistent across channels.

When Should You Use This Feature

Deep links matter most when the “next click” needs to land in a high-intent moment. If the customer has to hunt for what you referenced, you’ll see a click spike without a revenue spike.

  • Cart recovery: Tap goes straight to cart with the exact contents restored. This is the classic D2C win because it cuts steps between intent and checkout.
  • Back-in-stock or price drop: Link to the exact PDP/variant that triggered the alert, not a generic collection page.
  • Post-purchase cross-sell: Link to a bundled offer pre-loaded in cart (or a “complete your routine” landing inside the app).
  • Replenishment: Link to a one-tap reorder screen for the last purchased SKU, especially for consumables.
  • Reactivation: Link to a personalized “welcome back” screen that explains what’s new + a curated set of products based on last category viewed.

Real scenario: A skincare brand sends an SMS 2 hours after abandonment: “Your routine is still in your cart—checkout in under a minute.” The link includes cart_id. The app opens directly to the cart, fires Deep Link Opened and Cart Viewed, and if the customer purchases you suppress the rest of the abandonment sequence automatically.

Operational Considerations

Deep links touch product, engineering, and retention ops at the same time. The teams that win here treat deep links as a data contract—something you can segment on, orchestrate with, and trust in reporting.

  • Segmentation:
    • Build segments off Deep Link Opened + destination (e.g., opened cart deep link but no Checkout Started within 30 minutes).
    • Use device/platform attributes to debug issues (iOS vs Android performance gaps often indicate universal/app link misconfig).
  • Data flow and identity:
    • Make sure deep link events are sent after identify when possible; otherwise you’ll create “anonymous success” that never ties to revenue.
    • If you commonly see duplicate profiles, fix identity first—deep link reporting becomes misleading when conversions split across profiles.
  • Orchestration realities:
    • Don’t branch journeys on “clicked” alone—branch on Deep Link Opened (app) vs generic click (web) when the experience differs.
    • Set sane time windows. Cart recovery usually needs minutes/hours, not days. Deep link intent decays fast.

Implementation Checklist

If you want this to drive revenue (not just clicks), treat this like a release checklist. The small edge cases—logged out, app not installed, stale cart—are where performance quietly dies.

  • Universal Links (iOS) / App Links (Android) configured and validated on real devices
  • Fallback behavior defined (web landing that matches the promise)
  • Deep link routing map documented (paths + required query params)
  • Customer.io SDK initialized at app start
  • identify() called on login/registration; anonymous-to-known stitching verified
  • Deep link parsing handles cold start and warm start
  • Event tracking implemented: Deep Link Opened + downstream intent events
  • Customer.io messages use standardized link formats (consistent params across channels)
  • QA: cart deep link restores cart state; PDP deep link loads correct variant
  • Reporting: segment/journey logic uses events (not assumptions) to suppress follow-ups

Expert Implementation Tips

Once the basics work, the gains come from making deep links “operationally safe”—meaning your team can reuse them across campaigns without re-testing everything each time.

  • Track destination as a first-class property (e.g., destination=cart, destination=pdp). It makes segmentation and debugging dramatically faster.
  • Use a single canonical param schema. If cart recovery sometimes uses cartId and sometimes cart_id, you’ll end up with messy segments and broken branching.
  • Persist deep link intent through login. Store the destination locally, complete auth, then route—otherwise your highest-intent clicks get wasted.
  • Fire “opened” and “landed” separately when you can. An “opened” event can trigger even if the destination fails to render; a “landed” event (screen viewed) tells you the routing actually worked.
  • Design for out-of-stock and stale carts. If the cart can’t be restored, route to a “cart updated” screen with substitutions instead of a dead end.

Common Mistakes to Avoid

Most deep link issues aren’t marketing problems—they’re consistency problems between app routing, identity, and event timing. These are the ones that show up as “good CTR, bad revenue.”

  • Linking to the home screen and hoping the customer finds the product/cart again.
  • Not handling logged-out users (deep link opens, user logs in, then gets dumped somewhere irrelevant).
  • Missing or late identify() calls, causing deep link sessions and purchases to attach to anonymous profiles.
  • Using “click” metrics as success without tracking Cart Viewed/Checkout Started/Order Completed.
  • Changing link formats over time without versioning, breaking old messages and long-running journeys.
  • No channel-specific nuance: SMS deep links often open differently than email links inside in-app browsers—test both.

Summary

Deep links are a retention multiplier when they land customers in the exact in-app moment you promised. Get identity stitching and event tracking right, and you can reliably suppress, branch, and measure cart recovery and repeat purchase flows. If the app routing is flaky, you’ll pay for clicks that never convert.

Implement Deep Links with Propel

If you’re rolling this out across cart recovery, replenishment, and winback, the hard part is keeping routing + identity + events consistent as the program scales. Working alongside Customer.io setups, we usually start by auditing deep link destinations, validating identify() timing, and standardizing the event schema so journeys can orchestrate off real behavior. If you want a second set of operator eyes on your implementation plan, 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