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 Links | WarpLink |
|---|---|
| Dynamic Links | Links |
| Firebase console | WarpLink dashboard |
yourapp.page.link domain | aplnk.to domain (or custom domain) |
| Link parameters (social metadata) | Link fields + OG tags |
| Firebase Analytics integration | Built-in click analytics + attribution |
1. Recreate Your Links
Recreate your Firebase Dynamic Links in WarpLink via the dashboard or REST API.
Parameter Mapping
| Firebase Parameter | WarpLink 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 parameters | custom_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:
- Remove
FirebaseCoreandFirebaseDynamicLinkspackages from Xcode - Remove
FirebaseApp.configure()(unless you use other Firebase services) - Remove
import FirebaseCoreandimport 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 installAdd WarpLink:
npm install @warplink/react-native
cd ios && pod install3. 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 callAfter (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/appAfter (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.toIn AndroidManifest.xml, update the intent filter host:
<data
android:scheme="https"
- android:host="yourapp.page.link" />
+ android:host="aplnk.to" />5. Migrate Deep Link Handling
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);
});6. Migrate Deferred Deep Links
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);
}What's New with WarpLink Deferred Links
| Feature | Firebase | WarpLink |
|---|---|---|
| Deferred detection | No isDeferred flag | link.isDeferred === true |
| Attribution data | None | matchType, matchConfidence |
| Match confidence | Not available | 0.0–1.0 score |
| Caching | Manual | Automatic (once per install) |
| Matching method | Play Install Referrer only | Referrer + IDFV + fingerprint |
7. API Migration
| Firebase REST API | WarpLink REST API |
|---|---|
POST https://firebasedynamiclinks.googleapis.com/v1/shortLinks | POST https://api.warplink.app/v1/links |
| API key as query parameter | Bearer token in Authorization header |
dynamicLinkInfo object | Flat JSON body |
Feature Comparison
| Feature | Firebase Dynamic Links | WarpLink |
|---|---|---|
| Short links | Yes | Yes |
| Deferred deep links | Yes (limited) | Yes (with confidence scores) |
| Install attribution | No | Yes (deterministic + probabilistic) |
| Custom domains | Yes | Yes |
| Social previews | Built-in | Built-in (bot detection + OG tags) |
| Open source SDK | No | Yes (MIT license) |
| Pricing | Free (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