Deep Links (SDK): Drive app opens that actually convert

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

Deep links are one of the fastest ways to turn a message click into revenue—if your app tracking and identity stitching are solid. With Customer.io, deep links become the bridge between your retention messages (push/SMS/email) and the exact in-app destination that completes the purchase. If you want a second set of eyes on your SDK events, identity model, and routing (where most teams quietly lose conversion), book a strategy call.

In most retention programs, we’ve seen deep links move the needle most when they’re paired with clean “intent” events (Viewed Product, Started Checkout, Abandoned Cart) and a deterministic identifier (customer_id) that survives app reinstalls and device changes.

How It Works

At a practical level, deep linking is two systems working together: Customer.io generates and sends a link, and your app decides what to do when that link opens the app. The retention win comes from consistently landing the customer on the right screen and logging the right events back to Customer.io so you can segment and orchestrate follow-ups.

  • Link in message: You place a deep link URL in your push/SMS/email. That link includes a route (where to go) and usually some context (product SKU, cart ID, collection, offer).
  • App receives link: On open, your app parses the URL and routes the user to the intended screen (PDP, cart, checkout, reorder, subscription manage, etc.).
  • Identity stitching: The SDK must identify the person (typically with a stable customer_id) so the click/open and downstream purchase can be attributed to the same profile—especially if they clicked from SMS on one device and purchased on another.
  • Event trail back to Customer.io: You track events like Deep Link Opened, Product Viewed, Checkout Started, Order Completed. Without this, you’ll end up “sending harder” instead of fixing the funnel.

D2C scenario: A customer abandons a cart with a best-selling moisturizer. Your SMS goes out 45 minutes later with a deep link to /cart (not the homepage). When they open, you track Deep Link Opened with source=sms and campaign=cart_recovery_45m. If they don’t start checkout within 20 minutes, you trigger a push that deep links directly to /checkout (or the cart with a pre-applied offer) and suppress anyone who already fired Checkout Started.

Step-by-Step Setup

Deep links tend to “work” in a demo and then break in production because of identity gaps, missing event coverage, or inconsistent routing between iOS/Android. Treat setup like instrumentation: define the contract (URL format + events), then implement it consistently across platforms.

  1. Pick your deep link format and routing contract
    • Decide on a canonical structure like myapp:// or https://yourdomain.com/app that redirects into the app.
    • Standardize routes: /product/{sku}, /cart, /checkout, /orders/{id}, /collection/{handle}.
    • Define required query params: utm_source, utm_campaign, plus your own like cio_medium, offer_id, cart_id.
  2. Install the Customer.io SDK on app (iOS/Android/React Native/etc.)
    • Use the official Customer.io Mobile SDK for your platform.
    • Confirm the SDK is initialized early in app start so you don’t miss the deep link open event on cold start.
  3. Implement identify as soon as you can do it correctly
    • On login (or when you have a verified customer record), call the SDK identify method with a stable identifier (e.g., customer_id).
    • Attach key attributes you’ll segment on: email, phone, last_order_at, lifetime_value, push_opt_in.
    • If you support guest checkout, decide how you’ll handle pre-login behavior (anonymous events) and how/when you’ll merge them after identify.
  4. Capture the deep link open event (every time)
    • When the app opens via a deep link, track an event like Deep Link Opened.
    • Include properties: url, route, source (sms/push/email), campaign, message_id (if you pass it), cold_start (true/false).
    • This event becomes your “did they land?” truth source for suppression and follow-ups.
  5. Track the downstream funnel events you’ll optimize
    • Minimum for D2C retention: Product Viewed, Added to Cart, Checkout Started, Order Completed.
    • Pass identifiers consistently: sku, variant_id, order_id, cart_id, value, currency.
  6. Validate end-to-end in Customer.io before scaling sends
    • Click from a test push/SMS/email → confirm the app routes correctly.
    • Confirm the profile shows Deep Link Opened and the next funnel events.
    • Confirm the same person is attributed after login (no duplicate profiles).

When Should You Use This Feature

Deep links are worth the engineering time when the “next best action” in your retention program is inside the app. If your message click dumps people on the homepage, you’re basically paying for a second product discovery session.

  • Cart recovery: Send to /cart or /checkout with cart context so the customer finishes in under 30 seconds.
  • Repeat purchase: Deep link to a pre-filtered collection like /collection/refills or directly to the last purchased SKU.
  • Reactivation: Route dormant customers to a “starter bundle” PDP or a personalized recommendations screen, then track whether they viewed products within the session.
  • Post-purchase upsell: After Order Completed, route to /product/add-on or subscription upgrade, while suppressing customers who already added the upsell.

Operational Considerations

Deep links aren’t just a URL problem—they’re a data flow and orchestration problem. The goal is to make sure Customer.io has enough signal to target precisely, suppress correctly, and sequence messages without spamming people who already converted.

  • Segmentation depends on event hygiene: If iOS logs Checkout Started but Android doesn’t, your cart recovery journey will over-message Android users and undercount conversions.
  • Identity stitching is the make-or-break: In practice, this tends to break when teams identify with email sometimes, internal ID other times, and phone for SMS. Pick one primary key (usually customer_id) and map channels as attributes.
  • Cold start vs warm start behavior: A deep link open on a cold start can drop query params if your routing layer isn’t set up correctly. Track cold_start and compare conversion rates—this is where “it works on my phone” hides.
  • Message orchestration needs suppression events: Use Deep Link Opened and Checkout Started as suppression gates so your 45-minute SMS doesn’t get followed by a 2-hour push to someone who already bought.
  • Attribution realism: Treat deep link open as engagement, not revenue. Revenue attribution should come from Order Completed with order value passed in.

Implementation Checklist

If you want deep links to improve conversion instead of creating messy reporting, lock down the basics first. This checklist is the minimum bar before you scale volume.

  • Deep link URL format is standardized across iOS/Android and matches your routing map
  • Customer.io SDK initialized early enough to capture cold-start deep link opens
  • Identify call implemented with a stable customer_id (and consistent across channels)
  • Deep Link Opened event tracked with route, source, campaign, and full url
  • Core commerce events tracked: Product Viewed, Added to Cart, Checkout Started, Order Completed
  • Event properties standardized (sku, cart_id, order_id, value, currency)
  • QA flow tested: click from message → correct screen → events visible on the same profile in Customer.io
  • Suppression logic defined in journeys based on open + conversion events

Expert Implementation Tips

Once the basics are in, the gains come from tightening the loop between “what we sent,” “where they landed,” and “what they did next.” That’s how you stop guessing and start iterating.

  • Pass a campaign fingerprint through the link: Add something like cio_campaign and cio_step so your app events can echo it back. Then you can measure conversion by step, not just by journey name.
  • Use route-level conversion benchmarks: Compare /cart vs /checkout deep links. For many D2C apps, /checkout wins for warm carts but loses for cold-start sessions where login friction is high.
  • Build “link landed but didn’t act” segments: Segment: Deep Link Opened in last 1 hour AND NOT Checkout Started. That’s your high-intent pool for a single follow-up (not a whole sequence).
  • Guard against out-of-stock: If you deep link to a PDP, make sure the app can gracefully reroute to a substitute collection when inventory is gone—otherwise you’re paying to frustrate people.

Common Mistakes to Avoid

Most deep link failures aren’t dramatic—they’re silent. The app opens, but the customer lands somewhere generic, the event doesn’t fire, and the journey keeps sending because it thinks nothing happened.

  • Sending everyone to the homepage: This kills cart recovery and makes reactivation feel like a generic promo blast.
  • Inconsistent identifiers: Identifying by email in one place and internal ID in another creates duplicate profiles and breaks suppression.
  • Not tracking the deep link open event: Without it, you can’t separate “message didn’t work” from “message worked but checkout UX failed.”
  • Missing cold-start handling: The link works when the app is open, but fails when the app is closed—exactly when most customers click.
  • No standardized event properties: If sku is sometimes a string and sometimes an object, segmentation and reporting get painful fast.

Summary

Deep links are a retention multiplier when they reliably route customers to the next best action and your SDK events confirm what happened next. If your identity stitching and funnel events are clean, you can orchestrate cart recovery, repeat purchase, and reactivation with far less guesswork.

Implement Deep Links with Propel

If you’re already running journeys in Customer.io, deep links are usually the quickest “engineering + retention” win—because you improve conversion without increasing send volume. When you want help tightening the SDK event contract, identity stitching, and suppression logic (so your cart and reactivation flows stop leaking), 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