Deep Links (SDK): Route customers from message to the exact 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 fastest ways to lift conversion from push/SMS/email by landing customers exactly where the intent is—cart, PDP, reorder, subscription portal—without making them hunt. If you want a second set of eyes on the tracking + routing layer (where most programs quietly leak revenue), book a strategy call.

In most D2C retention programs, deep links don’t fail because the link is “wrong”—they fail because identity isn’t stitched, app routing is brittle, or the post-click event trail is missing. The goal here is simple: Customer.io sends a message, the customer taps, the app opens to the right screen, and you capture the events that prove it worked.

How It Works

Deep links are just URLs with intent. The real work happens in your app: you decide how to interpret the URL, where to route the user, and what you track back to Customer.io so you can segment and orchestrate follow-ups.

  • Link in message: You place a deep link (custom scheme or universal/app link) into push/SMS/email. The link includes the destination and usually some context (SKU, cart_id, collection, offer, etc.).
  • App receives the link: iOS/Android resolves the deep link and hands it to your app. Your navigation layer routes the user to the intended screen (Cart, PDP, Order Details, Subscription Management, etc.).
  • Identity stitching matters: If the user is logged in, you should already be calling identify (Customer.io SDK) with your stable customer ID. If they’re anonymous, you’ll often need to handle “open → login → continue deep link” so the intent survives authentication.
  • Track the outcome: On open and on conversion-adjacent actions, send events back via the SDK (e.g., Deep Link Opened, Product Viewed, Checkout Started, Order Completed). This is what lets you suppress, escalate, or branch journeys based on what actually happened.

Real D2C scenario: A customer abandons checkout on mobile. You send a push 45 minutes later: “Your cart’s still waiting.” The deep link routes to /cart?cart_id=abc. If they complete purchase, you track Order Completed and immediately suppress the rest of the abandonment sequence and move them into post-purchase cross-sell.

Step-by-Step Setup

The cleanest implementations treat deep links as a product feature, not a marketing hack. You’ll set up routing, ensure identity is consistent, then add a minimal set of events that make your journeys measurable and controllable.

  1. Choose your deep link format (and be consistent)
    • Universal/App Links (recommended): standard HTTPS links that open your app when installed, otherwise fall back to web.
    • Custom scheme (e.g., myapp://): easier to implement, but can be less reliable and has weaker fallback behavior.
    • Pick one canonical pattern like https://shop.yourbrand.com/app/cart?cart_id=... or myapp://cart?cart_id=....
  2. Implement routing in the app
    • Parse the incoming URL and map it to screens (Cart, PDP, Collection, Orders, Subscription, Loyalty).
    • Persist the deep link intent if the user isn’t authenticated yet (store it, then resume after login).
    • Handle edge cases: missing SKU, expired cart, discontinued product → route to best fallback (cart overview, category, or “recommended for you”).
  3. Install and initialize the Customer.io SDK
    • Use the appropriate Customer.io Mobile SDK (iOS/Android/React Native/Flutter/Expo) and confirm it’s sending successfully in a dev environment.
    • Make sure push token registration (if you use push) is working; deep links often show up first in push flows.
  4. Call identify as soon as you have a stable customer ID
    • On login/signup, call identify with your internal customer ID (not email as the primary key unless that’s truly stable for your brand).
    • If you support guest checkout, decide how you’ll promote a guest to an identified profile post-purchase (this is where reactivation and repeat purchase attribution often breaks).
  5. Track a “Deep Link Opened” event with useful properties
    • Fire an event when the app processes the deep link (not just when it receives it).
    • Recommended properties: destination, campaign_id (if you pass it), message_id (if available), sku, cart_id, source_channel.
  6. Track the downstream conversion events you’ll actually use for suppression
    • At minimum for D2C: Checkout Started, Order Completed, and ideally Product Viewed.
    • Make sure these events include identifiers you can join on (e.g., order_id, cart_id) so you can avoid false positives.
  7. Use those events inside Customer.io to control journeys
    • Entry: “Cart Updated” or “Checkout Started” without “Order Completed.”
    • Exit/suppression: “Order Completed” for the same customer (and ideally same cart_id).
    • Branching: If “Deep Link Opened” but no “Checkout Started” within X hours, escalate offer or switch channel.

When Should You Use This Feature

Deep links matter most when the customer’s next best action is specific and time-sensitive. If the destination is vague (“browse around”), you’ll still get value—but the lift is smaller and harder to attribute.

  • Cart recovery on mobile: Route straight to cart/checkout, not the homepage. This is where you typically see the cleanest ROI.
  • Back-in-stock / low inventory: Deep link to the exact SKU + variant selector state when possible.
  • Repeat purchase / replenishment: Route to “Buy again” or a pre-filled cart with the last purchased SKU(s).
  • Winback / reactivation: Route to a curated collection or personalized recommendations instead of forcing a cold start.
  • Subscription management: Route to “skip, swap, delay” screens to reduce churn and support load.

Operational Considerations

Deep links sit at the intersection of app behavior and orchestration logic. The retention win comes from making the click path deterministic and the data trail trustworthy enough to automate decisions.

  • Segmentation depends on clean identity: If users click while anonymous and later log in, you need a plan to stitch that activity to the identified profile. In practice, this tends to break when identify happens late (after multiple screens) or when guest checkout never becomes a known profile.
  • Event timing affects journey logic: If “Order Completed” arrives late (network retries, background execution limits), you’ll accidentally send the next abandonment message. Build buffers (delays) and use exit conditions aggressively.
  • Pass stable identifiers in links: Use cart_id, sku, collection_id, offer_id. Avoid relying only on UTM parameters for in-app routing—they’re great for reporting, not for navigation.
  • Fallback behavior is part of retention: If the app isn’t installed, decide where the HTTPS link should land (mobile web cart, PDP, or an app install page that preserves intent).
  • Orchestration reality: Your best-performing flows usually combine channels. Deep links let you keep the destination consistent across push and SMS, while email can use the same URL for continuity.

Implementation Checklist

Before you ship deep links into high-volume retention flows, get the basics locked so you don’t create noisy metrics or broken customer experiences at scale.

  • Universal/App Links or custom scheme implemented and tested across iOS + Android
  • Deep link routing supports: cold start, background open, and post-login continuation
  • Customer.io SDK installed and sending events in dev/staging
  • identify called on login/signup with a stable customer ID
  • Event: Deep Link Opened tracked with destination + key IDs (sku/cart_id)
  • Events: Checkout Started and Order Completed include cart_id or order_id
  • Customer.io journeys use exit conditions to stop messages after purchase
  • Fallback destination defined for app-not-installed and expired cart/SKU cases

Expert Implementation Tips

Once the basics work, the gains come from reducing ambiguity: make every click attributable, and make every journey decision based on a small number of reliable signals.

  • Track “routed successfully” vs “received link”: Fire the deep link event after you’ve confirmed the app navigated to the intended screen. This avoids counting opens that immediately bounced due to parsing errors.
  • Use a single deep link builder: Centralize link construction so marketing, product, and engineering aren’t inventing new URL shapes every sprint.
  • Prefer deterministic suppression: Suppress cart recovery on Order Completed (and ideally matching cart_id) rather than relying on “clicked” as a proxy for intent.
  • Design for variant-level PDP links: For apparel/beauty, routing to the correct variant reduces friction (and reduces “sold out” dead ends).
  • Keep properties consistent across platforms: If Android sends cartId and iOS sends cart_id, segmentation gets messy fast.

Common Mistakes to Avoid

Most deep link programs look fine in a happy-path demo and then underperform in real traffic because the edges weren’t handled. These are the ones that show up repeatedly in D2C retention.

  • Sending customers to the homepage: It “works,” but it kills conversion and makes your abandonment program look weaker than it is.
  • Not persisting intent through login: If the user has to authenticate and then lands on a default screen, your click was wasted.
  • No event trail after the click: Without Deep Link Opened and downstream events, you can’t branch, suppress, or debug.
  • Relying on UTMs for in-app routing: UTMs are for analytics; your app should route based on explicit path/params.
  • Identity mismatch: If you identify users inconsistently (email sometimes, customer_id other times), you’ll misattribute conversions and re-message buyers.
  • Ignoring app-not-installed behavior: SMS/email clicks from lapsed users often happen on devices without the app—plan the fallback or you’ll lose the reactivation moment.

Summary

Deep links are a retention multiplier when they reliably route customers to a specific, high-intent screen and you track the events that confirm success. If your SDK identity and event schema are clean, you can suppress faster, personalize harder, and stop paying for “clicks” that don’t convert.

Implement Deep Links with Propel

If you’re already running retention in Customer.io, deep links are one of those “small plumbing” projects that quietly unlock bigger wins across cart recovery, replenishment, and winback. When teams want help pressure-testing identity stitching, event naming, and journey suppression logic before rolling this out to high-volume sends, it’s usually worth a quick working session—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