WarpLink
Migration

Firebase Dynamic Links Migration

A step-by-step guide to migrate from Firebase Dynamic Links to WarpLink, including link mapping, SDK setup, and attribution.

Firebase Dynamic Links shut down on August 25, 2025. Existing FDL short links now return 404. Migrate to restore your deep links.

Concept Mapping

Firebase Dynamic LinksWarpLink
Dynamic LinksLinks
Firebase consoleWarpLink dashboard
yourapp.page.link domainaplnk.to domain (or custom domain)
Link parameters (social metadata)Link fields + OG tags
Firebase Analytics integrationBuilt-in click analytics + attribution

Recreate your Firebase Dynamic Links in WarpLink via the dashboard or REST API.

Parameter Mapping

Firebase ParameterWarpLink Field
link (deep link URL)destination_url
isi / apn (app identifiers)Configured per-app in dashboard
ifl / afl (fallback links)ios_fallback_url / android_fallback_url
efr (skip preview page)N/A (WarpLink uses 302 redirects by default)
st / sd / si (social metadata)og_title / og_description / og_image_url
Custom parameterscustom_params JSON object

Create via API

2. Swap the SDK

Remove Firebase:

  1. Remove FirebaseCore and FirebaseDynamicLinks packages from Xcode
  2. Remove FirebaseApp.configure() (unless you use other Firebase services)
  3. Remove import FirebaseCore and import FirebaseDynamicLinks

Add WarpLink:

Remove Firebase:

Add WarpLink:

Remove Firebase:

Add WarpLink:

3. Update SDK Initialization

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

Before (Firebase):

After (WarpLink):

Before (Firebase):

After (WarpLink):

Before (Firebase):

After (WarpLink):

4. Update Domain Configuration

In Signing & Capabilities > Associated Domains:

In AndroidManifest.xml, update the intent filter host:

Moving your links to a custom domain instead? Use that host here, and declare it to the SDK as well: linkDomains at configure(), or the WarpLinkDomains plist key / app.warplink.DOMAINS manifest entry. That is what makes a custom-domain link resolve on the first launch. See Use it in your app.

The onLink callback you set in step 3 already receives resolved links for cold start, warm start, and deferred installs. Firebase's manual handleUniversalLink / getDynamicLink / getInitialLink calls have no equivalent to port: delete them. All that remains is a minimal host hook so the OS hands URLs to the SDK.

Delete the DynamicLinks.dynamicLinks().handleUniversalLink(...) block. Forward the incoming activity to WarpLink (or set your scene delegate class to WarpLinkSceneDelegate):

Resolved links arrive in your onLink callback.

Delete the FirebaseDynamicLinks.getInstance().getDynamicLink(intent) block. Cold start is automatic. For warm start, forward new intents and set android:launchMode="singleTask" on the Activity:

Resolved links arrive in your onLink callback.

Delete the dynamicLinks().getInitialLink() and dynamicLinks().onLink(...) calls. Cold and warm start flow into onLink automatically.

On iOS you are removing the Firebase call from a delegate method that already exists and already forwards to your linking library. Swap the Firebase line for the WarpLink call and leave the rest of the method alone. Do not let handleIncomingURL decide the return value: it returns nothing, and replacing the forwarded result breaks React Navigation, Expo Linking, and OAuth callbacks.

Android needs no host code, given android:launchMode="singleTask". See the React Native SDK guide for the Objective-C form and Expo prebuild.

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 from Firebase.

Handle the deferred case inside your onLink callback:

Handle the deferred case inside your onLink callback:

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).

FeatureFirebaseWarpLink
Deferred detectionNo isDeferred flaglink.isDeferred === true
Attribution dataNonematchType, matchConfidence
Match confidenceNot available0.0–1.0 score
CachingManualAutomatic (once per install)
Matching methodPlay Install Referrer onlyReferrer + IDFV + fingerprint

7. API Migration

Firebase REST APIWarpLink REST API
POST https://firebasedynamiclinks.googleapis.com/v1/shortLinksPOST https://api.warplink.app/v1/links
API key as query parameterBearer token in Authorization header
dynamicLinkInfo objectFlat JSON body

Feature Comparison

FeatureFirebase Dynamic LinksWarpLink
Short linksYesYes
Deferred deep linksYes (limited)Yes (with confidence scores)
Install attributionNoYes (deterministic + probabilistic)
Custom domainsYesYes
Social previewsBuilt-inBuilt-in (bot detection + OG tags)
Open source SDKNoYes (MIT license)
PricingFree (deprecated)Free tier (10K clicks/mo)

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://aplnk.to/.well-known/apple-app-site-association
  • Error handling: test invalid URLs, expired links, no connectivity
  • All Firebase code removed: no remaining imports or dependencies
  • Clean build: no compilation errors

Next Steps

On this page