Skip to main content
Deferred Deep Links (DDLs) provide the most seamless way to guide users from your funnel to your mobile application after purchase, eliminating the need for manual login or authentication. You can use any DDL provider of your choice. As an example, this guide explains how to configure deep links with Adapty UA, AppsFlyer, or Adjust.
You’ll need an active Adapty UA, AppsFlyer, or Adjust account to implement deep links.
Deferred deep links (DDLs) enable you to pass information (such as user identifiers or tokens) through a single link that can:
  • Redirect new users to the App Store if the app isn’t installed.
  • Automatically open the app if it’s already installed.
  • Deliver metadata (like authentication tokens) into the app on first launch, even after installation.
This creates a frictionless post-purchase experience with no login steps required.
The customer email is saved in the {{email}} variable (from Email input or OAuth), so you can include it in your deep links.

Prerequisites

Before setting up deep links, ensure you have:
  • Adapty UA tracking link configured, an AppsFlyer account with OneLink configured, or an Adjust account. You can also use any other DDL provider of your choice.
  • Mobile app with the Adapty, AppsFlyer, or Adjust SDK integrated.
  • FunnelFox funnel ready for button configuration.

Configuration

Setting up deferred deep links requires configuring both your funnel and mobile app to pass and receive user identification data.

1. Funnel setup

1

Create iOS and Android links in Adapty UA

  1. Open Adapty UA in the Adapty dashboard.
  2. Create an iOS tracking link and an Android tracking link.
  3. Append a deferred data parameter to each link to carry the user ID using user variables:
  • For the iOS link, add &ios_deferred_data={{user.id}}.
  • For the Android link, add &android_deferred_data={{user.id}}.
  1. Copy the click links you’ll use in the funnel. Example URLs:
https://api-ua.adapty.io/api/v1/attribution/click?adpt_cid=__ADAPTY_ID__&ios_deferred_data={{user.id}}&redirect_url=__APP_LINK__
https://api-ua.adapty.io/api/v1/attribution/click?adpt_cid=__ADAPTY_ID__&android_deferred_data={{user.id}}&redirect_url=__APP_LINK__
2

Add button elements with conditional visibility

Adapty uses a different deferred data parameter for each platform, so your funnel needs one button per platform.
  1. Add two Button elements where you want the app redirect (one for iOS, one for Android).
  2. Use conditional visibility on each button with a Device OS condition: show the first button only on iOS and the second only on Android.
  3. Configure each button with an External Link action.
3

Set the deep link URLs on the buttons

Paste the Adapty UA links from step 1 into the buttons:
  • Set the iOS button link to the iOS Adapty URL containing ios_deferred_data={{user.id}}.
  • Set the Android button link to the Android Adapty URL containing android_deferred_data={{user.id}}.
You can use other identifiers like {{user.session_id}} or custom properties depending on your authentication flow.
Your web configuration is now complete! Next, you’ll need to handle these links in your mobile application.

2. Mobile app setup

The goal is to get the user ID into the app and use it for identification (e.g., with Adapty).
When a user clicks an Adapty UA link, Adapty saves the click data (including any ios_deferred_data or android_deferred_data value you appended).After the user installs the app and opens it for the first time, Adapty matches the install to the click and delivers the payload to the SDK through the onInstallationDetailsSuccess callback.Set up your mobile app in three steps:
  1. Implement the onInstallationDetailsSuccess callback on the Adapty SDK.
  2. Parse details.payload (an escaped JSON string) and read ios_deferred_data on iOS or android_deferred_data on Android.
  3. Identify/authenticate the user using the extracted value.
For complete implementation details, refer to the Adapty UA deferred deeplinks documentation.Code examples:
import Adapty

// During setup:
//   Adapty.delegate = AdaptyDelegateHandler.shared

final class AdaptyDelegateHandler: NSObject, AdaptyDelegate {
    static let shared = AdaptyDelegateHandler()

    nonisolated func onInstallationDetailsSuccess(_ details: AdaptyInstallationDetails) {
        guard
            let payloadStr = details.payload,
            let data = payloadStr.data(using: .utf8),
            let payload = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
            let userId = payload["ios_deferred_data"] as? String
        else { return }

        // Identify user with userId
    }
}