WarpLink
Migration

Firebase Dynamic Links Migration

Step-by-step guide to migrate from Firebase Dynamic Links to WarpLink.

Firebase Dynamic Links was deprecated on August 25, 2025. Existing links will eventually stop working. Migrate now to avoid disruption.

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

curl -X POST https://api.warplink.app/v1/links \
  -H "Authorization: Bearer wl_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "destination_url": "https://yourapp.com/product/123",
    "ios_url": "myapp://product/123",
    "android_url": "myapp://product/123",
    "custom_params": { "referrer": "campaign_spring" }
  }'

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:

// Package.swift
dependencies: [
    .package(url: "https://github.com/ApolloLinks/warplink-ios-sdk", from: "0.1.0")
]

Remove Firebase:

// Remove from build.gradle.kts
// implementation(platform("com.google.firebase:firebase-bom:33.0.0"))
// implementation("com.google.firebase:firebase-dynamic-links")

Add WarpLink:

dependencies {
    implementation("app.warplink:sdk:0.1.0")
}

Remove Firebase:

npm uninstall @react-native-firebase/dynamic-links
# If no other Firebase packages:
npm uninstall @react-native-firebase/app
cd ios && pod install

Add WarpLink:

npm install @warplink/react-native
cd ios && pod install

3. Update SDK Initialization

Before (Firebase):

import FirebaseCore
FirebaseApp.configure()

After (WarpLink):

import WarpLink
WarpLink.configure(apiKey: "wl_live_YOUR_KEY")

Before (Firebase):

// Firebase auto-initializes via FirebaseApp — no explicit call

After (WarpLink):

import app.warplink.WarpLink

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        WarpLink.configure(context = this, apiKey = "wl_live_YOUR_KEY")
    }
}

Before (Firebase):

// Firebase auto-initializes via @react-native-firebase/app

After (WarpLink):

import { WarpLink } from '@warplink/react-native';
WarpLink.configure({ apiKey: 'wl_live_YOUR_KEY' });

4. Update Domain Configuration

In Signing & Capabilities > Associated Domains:

- applinks:yourapp.page.link
+ applinks:aplnk.to

In AndroidManifest.xml, update the intent filter host:

  <data
      android:scheme="https"
-     android:host="yourapp.page.link" />
+     android:host="aplnk.to" />

Before (Firebase):

DynamicLinks.dynamicLinks().handleUniversalLink(url) { dynamicLink, error in
    guard let link = dynamicLink?.url else { return }
    self.handleDeepLink(link)
}

After (WarpLink):

WarpLink.handleDeepLink(url) { result in
    switch result {
    case .success(let deepLink):
        navigateTo(deepLink.destination)
    case .failure(let error):
        print("Error: \(error.localizedDescription)")
    }
}

Before (Firebase):

FirebaseDynamicLinks.getInstance()
    .getDynamicLink(intent)
    .addOnSuccessListener { pendingData ->
        pendingData?.link?.let { handleDeepLink(it) }
    }

After (WarpLink):

intent?.data?.let { uri ->
    WarpLink.handleDeepLink(uri) { result ->
        result.onSuccess { deepLink ->
            navigateTo(deepLink.destination)
        }
    }
}

Before (Firebase):

// Cold start
const link = await dynamicLinks().getInitialLink();
if (link) handleDeepLink(link.url);

// Warm start
const unsubscribe = dynamicLinks().onLink((link) => {
    handleDeepLink(link.url);
});

After (WarpLink):

// Cold start
const link = await WarpLink.getInitialDeepLink();
if (link) navigateTo(link.destination);

// Warm start
const unsubscribe = WarpLink.onDeepLink((event) => {
    if (event.deepLink) navigateTo(event.deepLink.destination);
});

Before (Firebase):

DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) { link, error in
    guard let deepLink = link?.url else { return }
    self.handleDeepLink(deepLink)
}

After (WarpLink):

WarpLink.checkDeferredDeepLink { result in
    if case .success(let deepLink) = result, let deepLink = deepLink {
        navigateTo(deepLink.destination)
    }
}

Before (Firebase):

// Firebase handled deferred links via getDynamicLink(intent)
FirebaseDynamicLinks.getInstance().getDynamicLink(intent)

After (WarpLink):

WarpLink.checkDeferredDeepLink { result ->
    result.onSuccess { deepLink ->
        deepLink?.let { navigateTo(it.destination) }
    }
}

Before (Firebase):

// Firebase used getInitialLink() for both cold-start and deferred
const link = await dynamicLinks().getInitialLink();

After (WarpLink):

const link = await WarpLink.checkDeferredDeepLink();
if (link?.isDeferred) {
    console.log('Match confidence:', link.matchConfidence);
    navigateTo(link.destination);
}
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 — uninstall, click link, reinstall, verify match
  • 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

On this page