In May 2023, Google announced that Firebase Dynamic Links (FDL) would be deprecated with no replacement. As of today, the countdown is real: all existing FDL links will stop working on August 25, 2025: just over 100 days away.
This guide is for Flutter developers looking to migrate from Firebase Dynamic Links to other deep linking options, whether you need simple link routing or advanced features like deferred deep linking and install attribution.
What Are Dynamic Links (and Why Do They Matter)?
Dynamic links are essential for apps that care about:
Seamless onboarding: Open to the right screen after install
Marketing & attribution: Track installs from ads or QR codes
Cross-platform consistency: One link that works on iOS, Android, and web
In-app navigation: Route users to specific content via URLs
Typical Flow of a Dynamic Link
User taps a link (e.g. from email, ad, or QR code)
If the app is installed → it opens to the correct screen
If not → user goes to the App Store / Play StoreAfter install, the app opens to the linked screen (if deferred linking is supported)
Post August 25, 2025: All Firebase Dynamic Links will stop working
Web: Shows a 404 page
Mobile SDKs: Return 400 errors
Why is Google Deprecating FDL?
Google hasn't given a full reason, but the ecosystem is moving toward native deep linking standards:
🔗 App Links (Android)
🍎 Universal Links (iOS)
These are more privacy-safe, OS-supported, and less reliant on a third-party intermediary.
🛠️ Your Deep Linking Options (in Flutter)
Depending on your needs, you can go native or use a third-party SDK.
Need help migrating your app? reach out: happy to help!
Option A: Native Deep Links
App Links (Android) + Universal Links (iOS)
For simple, direct in-app routing. No analytics or deferred linking.
Setup in 3 Steps:
1. Host Digital Asset Files
Android:
URL:https://yourdomain.com/.well-known/assetlinks.json
iOS:
URL:https://yourdomain.com/.well-known/apple-app-site-association
2. Sample File for Android
jsonCopyEdit[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": ["YOUR_SHA256_HASH"]
}
}
]
3. Sample File for iOS
jsonCopyEdit{
"applinks": {
"apps": [],
"details": [
{
"appID": "YOUR_TEAM_ID.com.example.app",
"paths": [ "/promo/*" ]
}
]
}
}
4. Flutter Routing with go_router
dartCopyEditfinal router = GoRouter(
routes: [
GoRoute(
path: '/',
builder: (_, __) => HomeScreen(),
routes: [
GoRoute(
path: 'promo',
builder: (_, __) => PromoScreen(),
),
],
),
],
);
🚫 What You Don't Get with Native Links:
No deferred deep linking (new users won’t land on the right screen after install)
No campaign tracking or attribution
No short link generation
Option B: Use a Deep Linking SDK (for deferred linking + analytics)
🌱 Branch.io
→ Supports deferred deep linking, custom domains, short link generation, and in-depth analytics.
📈 AppsFlyer
→ Offers deep links plus full-funnel install attribution and powerful campaign insights—great for marketers.
🛡 Adjust
→ Known for strong attribution features, fraud prevention, and advanced mobile analytics.
📦 Kochava
→ Excellent for install tracking, QR code support, and linking via SMS or email.
🔗 Bitly
→ Best for creating simple, branded short links with basic analytics—fast and easy.
🔁 Migrating from Firebase Dynamic Links
Step 1: Export Your FDLs
From the Firebase console, download all existing links via CSV.
Step 2: Choose the Right Path
✅ If you only need simple in-app routing (e.g. open a screen when the app is installed):
→ Use App Links (Android) and Universal Links (iOS)
📦 If you need deferred deep linking (e.g. user installs the app and still lands on the correct screen):
→ Use Branch, AppsFlyer, or Adjust
📊 If you’re focused on QR codes and marketing analytics (e.g. offline campaigns, branded links, tracking scans):
→ Use Kochava, Bitly, or AppsFlyer
📈 If your priority is campaign performance tracking (e.g. install attribution, ad analytics):
→ Go with AppsFlyer or Branch
Step 3: Update Your Flutter App
Remove FDL SDKs & dependencies
Add the new provider’s Flutter SDK
Update link routing logic (e.g. using
getInitialLink
,go_router
, or provider-specific handlers)Test on iOS & Android, with and without app pre-installed
Bonus: Real-World Example
Let’s say you’re running an event app:
You want to send new users a link to a specific event
If the app is installed → they open directly to the event
If not → they go to the App Store, install, and still land on the right event
➡️ Use Branch.io or AppsFlyer, which support deferred deep linking, attribution, and short links.
Best Practices
Use HTTPS and custom domains for all links
Test fallback behavior (broken link ≠ broken UX)
Track link performance in dashboards (especially during launch campaigns)
Secure your asset files: they control your app’s linking permissions
📚 Resources & Links
Flutter Deep Linking Guide
Branch Flutter SDK Docs
AppsFlyer Flutter Guide
Kochava SDK Docs
⚠️ Final Reminder
All Firebase Dynamic Links will stop working on August 25, 2025.
Start migrating now to avoid broken user experiences, lost attribution data, and failed campaigns.
Need help migrating your app? reach out: happy to help!