Skip to main content
Documentation
Migration

AppsFlyer Migration

Migrate from AppsFlyer OneLink to WarpLink: link and parameter mapping, SDK swap, and deep linking, install attribution, and analytics.

This guide is for teams moving from AppsFlyer OneLink to WarpLink: mapping OneLink links and parameters, swapping the SDK, and carrying deep linking, install attribution, and analytics over to WarpLink. It assumes a WarpLink account and app are already set up.

For the provider-agnostic playbook (planning, domains, cutover, decommissioning), see the general migration guide. This page covers only what is specific to leaving AppsFlyer OneLink.

Concept Mapping

AppsFlyer OneLinkWarpLink
OneLink templateLink
AppsFlyer dashboardWarpLink dashboard
onelink.me domainyourapp.aplnk.to (your app's subdomain) or a custom domain
Branded domain (CNAME to a OneLink subdomain)Custom domain
Unified Deep Linking (onDeepLink callback)onLink callback (on React Native and Flutter, not the separate onDeepLink stream, which is only for manual wiring)
deep_link_value / deep_link_sub1-deep_link_sub10Query parameters on destination_url, echoed back as custom_params

WarpLink always attempts the app open (Universal Link or App Link) when the app is installed, and falls back to the link's fallback URL or the app store only when it is not. See Fallback Cascade.

Dashboard CSV export downloads a CSV of OneLink URLs per template. It only includes links created from the dashboard or a template: links created via the SDK, the OneLink REST API, or bulk upload do not appear in that export.

To get those links out, use the OneLink REST API (current version v2.0) to read them back programmatically. Access is not self-serve: it requires a customer success manager or an email to hello@appsflyer.com to enable it.

For historical click and conversion data, AppsFlyer's Raw Data Pull API caps downloads at 1,000,000 rows per request; larger histories need to be split into narrower time windows. Pull the data you need before decommissioning the account, since there is no single export that covers both link configuration and historical click data together.

Recreate each OneLink link in WarpLink via the dashboard or the REST API.

Parameter Mapping

AppsFlyer ParameterWarpLink Field
deep_link_value (in-app routing value)ios_url / android_url
af_dp (legacy URI-scheme deep link)ios_url / android_url
af_web_dp (web/social preview target)destination_url
af_ios_url / af_android_url (fallback URLs)ios_fallback_url / android_fallback_url
deep_link_sub1 … deep_link_sub10 (auxiliary values)Query parameters on destination_url, echoed back as custom_params on resolve
pid (media source) / c (campaign)utm_source / utm_campaign
Custom title, description, image (set in the OneLink template UI)og_title / og_description / og_image_url

pid and c map to the utm_source and utm_campaign fields for campaign tracking.

Create via API

Custom slugs are 2 to 100 characters, lowercase alphanumeric with hyphens. AppsFlyer's OneLink URL ID defaults to 8 characters and allows up to 50; if you are scripting the migration, decide on a slug mapping up front for any URL ID that does not fit WarpLink's format.

3. Swap the SDK

Remove AppsFlyer:

  1. Remove the AppsFlyerFramework package (CocoaPods, or SPM: AppsFlyerSDK/AppsFlyerFramework on SDK versions before 6.12.0, AppsFlyerFramework-Static/-Dynamic/-Strict on 6.12.0 and later)
  2. Remove AppsFlyerLib.shared().appsFlyerDevKey, .appleAppID, and the .start() call
  3. Remove the NSAdvertisingAttributionReportEndpoint and AdAttributionKit keys from Info.plist
  4. Remove the AppsFlyerDeepLinkDelegate conformance and didResolveDeepLink(_:) (or the legacy onAppOpenAttribution)

Add WarpLink:

4. Update SDK Initialization

Mobile apps authenticate with an SDK key, created in the dashboard under Keys > SDK keys. An API key looks identical but cannot record installs, so pasting one here leaves deep links working while attribution silently fails.

Before (AppsFlyer):

After (WarpLink):

5. Update Domain Configuration

In Signing & Capabilities > Associated Domains:

onelink.me is AppsFlyer-owned infrastructure: it cannot be repointed, so links on it stop resolving once you leave AppsFlyer. A branded custom domain is different, since its CNAME sits on your own DNS. Once your links exist on WarpLink with the same paths, repoint that domain's DNS to WarpLink and existing shares, QR codes, and bookmarks keep working. See custom domains.

Moving to a custom domain? Declare it to the SDK too: linkDomains at configure(), or the WarpLinkDomains plist key / app.warplink.DOMAINS manifest entry. See Use it in your app.

The onLink callback set in step 4 already receives resolved links for cold start, warm start, and deferred installs.

Delete the AppsFlyerDeepLinkDelegate conformance and didResolveDeepLink(_:) (or the legacy onAppOpenAttribution). Forward the incoming activity to WarpLink (or set your scene delegate class to WarpLinkSceneDelegate):

Resolved links arrive in your onLink callback.

WarpLink runs the deferred deep link check automatically from configure(). The match arrives in the same onLink callback, flagged with isDeferred. There is no separate deferred call to port.

AppsFlyer's deferred delivery ran through the legacy onAppOpenAttribution callback on first open, or through Unified Deep Linking's onDeepLink, distinguishing a deferred match with isDeferred(). Delete those listeners; WarpLink's onLink replaces both.

Handle the deferred case inside your onLink callback:

To run the check manually instead, set the deferred opt-out flag and call checkDeferredDeepLink() yourself (see the deferred deep links guides).

8. Attribution and Reporting

WarpLink attributes installs to the link that drove them through a match cascade: an exact referrer signal (Play Install Referrer) on Android, an enriched probabilistic match on both platforms, and a device ID (IDFV) check on iOS that recognizes an install asking again, with a confidence score on every result. See the iOS attribution guide (or the Android, React Native, and Flutter equivalents) for match types, confidence bands, and privacy details.

Running both SDKs for a period is a normal part of a migration: it lets you compare install counts and deep link behavior before retiring the old provider. See Run the Cutover in the general guide for the rollout sequencing.

Testing Checklist

After migration, verify on each platform:

  • SDK initializes: enable debug logging and check console output
  • Deep links open the app: tap a WarpLink URL on a physical device
  • Deep link data resolves: destination and custom parameters are correct
  • Deferred deep links work: click link, install, verify match. An uninstall is enough to retest on either platform, because the completion marker goes with the app. That second install is reported as a reinstall and still counts as an install
  • AASA/assetlinks verified: curl https://yourapp.aplnk.to/.well-known/apple-app-site-association
  • Error handling: test invalid URLs, expired links, no connectivity
  • All AppsFlyer code removed: no remaining imports or dependencies
  • Clean build: no compilation errors

Next Steps