TL;DR: Firebase Dynamic Links will be fully shut down on August 25, 2025, and after that existing links will stop working according to Google’s Firebase Dynamic Links FAQ. If your Flutter app still depends on FDL, export your link data now, audit every link creation path, keep the current implementation stable until cutover, and choose a replacement based on whether you need native control or faster rollout with managed analytics.
The surprising part about firebase dynamic links isn't that Google killed them. It's that many teams still treat the shutdown like a routine SDK cleanup instead of a product risk.
That mindset is dangerous because firebase dynamic links sat in the middle of onboarding, referral flows, promo campaigns, re-engagement, and attribution. Remove that layer without a plan and users don't just lose a convenience feature. They lose the path into the right screen, marketing loses visibility, and product teams lose confidence in what a campaign or share flow did.
The End of an Era for Firebase Dynamic Links


Firebase Dynamic Links are no longer a background dependency you can postpone. For Flutter teams, this is a shutdown with product impact, release risk, and support fallout attached.
Google’s deprecation notice is clear: new link creation is disabled, and existing Firebase Dynamic Links stop working after August 25, 2025, according to the official deprecation FAQ. Any app that still relies on FDL for installs, referrals, email entry points, promotions, or re-engagement needs a plan now, not a cleanup task later.
FDL earned its place because it solved a hard mobile problem that plain deep links did not handle well. It connected three states that teams care about in production: app already installed, app not installed yet, and post-install routing back into the intended screen. In Flutter projects, that usually meant fewer broken share flows and less custom platform code to maintain.
That convenience also created hidden dependency. Over the years, many teams treated FDL as routing infrastructure, campaign infrastructure, and attribution glue all at once. Once it disappears, those responsibilities do not disappear with it. They fall back onto your app, your backend, your redirect setup, and your analytics model.
Practical rule: Treat every existing dynamic link as application behavior, not a marketing asset.
The teams that get hurt by this deprecation are rarely the ones with the oldest plugin version. They are the ones that underestimate link spread. A referral URL generated in a retired Flutter screen, a QR code printed months ago, a CRM template nobody reviewed this year, or an onboarding email that still points at an FDL domain can all fail after cutoff. Users see the symptom first. Product and growth teams feel it next.
A second mistake is framing this as a package swap. Replacing firebase_dynamic_links with another SDK does not automatically restore deferred deep linking, fallback behavior, route parsing, install handoff, and campaign tracking in the same way. Flutter teams need to separate those concerns and decide which ones matter for the business. For many apps, understanding platform deep linking behavior on Android is part of that work, because the replacement often depends on native app links or custom redirect handling instead of one managed Firebase layer.
What made FDL useful still matters. What changes now is ownership. Mobile, backend, growth, and lifecycle teams need one migration plan, because broken links will show up as failed journeys, not as a neat deprecation warning in the console.
Understanding Your Current Dynamic Links Setup


Before choosing a migration path, map the current one. It is common to underestimate how many places firebase dynamic links get created. Some live in the Firebase console. Others come from backend jobs, CRM templates, referral services, or old Flutter screens that still generate user-share links.
An audit should answer one question: if FDL disappeared tomorrow, which user journeys would fail first?
Start with where links are created
Look in more places than the obvious plugin setup. In Flutter codebases, I usually find link generation spread across UI code, repositories, cloud functions, support tooling, and campaign docs.
Audit these areas:
- Firebase console campaigns: Promo links, email links, QR destinations, social shares, and one-off launches.
- Backend generation paths: REST API calls that produce links for referrals, invites, or transactional messages.
- Client-side creation: Old Flutter screens that generate shareable links directly from the app.
- External systems: Marketing automation, push systems, CMS entries, support macros, and spreadsheet-based campaign ops.
A practical companion to this work is understanding platform-native deep linking behavior as documented in this Android deep linking overview for Flutter developers. It helps teams separate what FDL handled from what Android App Links will later need to handle directly.
Export data before you lose visibility
Google's analytics reference is useful here because the linkStats endpoint exposes event counts for clicks, first-opens, re-opens, and installs, and Firebase projects are capped at 10 URL prefixes, according to the Firebase Dynamic Links analytics reference. Those metrics give you enough signal to prioritize which links matter most.
Use the export phase to answer business questions, not just technical ones. Which links still get meaningful activity? Which ones lead to acquisition flows versus simple content opens? Which prefixes are tied to old experiments you can retire instead of rebuild?
Build a migration inventory that product can use
Don't dump a CSV into a folder and call the audit done. Turn the output into an inventory with owners and decisions. This saves weeks later when teams argue over whether a route is still "important."
A useful working table looks like this:
| Link group | Where it's created | User journey | Keep, replace, or retire |
|---|---|---|---|
| Referral links | Backend or app share flow | Existing user invites new user | Usually keep |
| Campaign links | Firebase console or CRM | Acquisition or re-engagement | Keep selectively |
| Legacy promo URLs | Old launch assets | Often stale traffic | Often retire |
| Internal ops links | Support or QA tools | Staff-only routing | Replace simply |
Identify the routes that need exact parity
Not every firebase dynamic link deserves a one-for-one rebuild. Teams waste time preserving old complexity that nobody needs.
Use these triage questions:
- Does the link open a revenue or onboarding path? Those usually need high-fidelity replacement.
- Does the route require post-install intent? FDL used to shine in this area, and replacement gets harder.
- Is the destination still valid in the app? Dead screens shouldn't survive the migration.
- Can a regular deep link replace it? Some FDL usage was overkill from the start.
Audit for behavior, not just volume. A low-traffic password reset or invite acceptance flow can be more critical than a high-traffic blog campaign URL.
Review the Flutter entry points too
A lot of migration pain comes from weak understanding of the current app-side handling. Search for listeners, startup routing logic, custom navigation wrappers, route parsing, and any code that reads query parameters from incoming URIs.
If the existing implementation is brittle, fix that before migration. A shaky baseline makes provider comparisons meaningless because you won't know whether failures come from the new link platform or from your app's route handling.
Maintaining Legacy Links in Flutter Until the Deadline
Firebase Dynamic Links is on the way out, but production apps still have to open the right screen today. The short-term job is simple. Keep every high-value legacy link working long enough to migrate without breaking onboarding, invites, resets, and re-engagement flows.
For Flutter teams, that usually means tightening app-side handling before the service reaches its end. If the current implementation is inconsistent across cold starts and in-app link events, users will feel the failure before your migration even begins.
Handle the initial link and the live stream separately
Flutter apps receive incoming links through two different paths:
- the app starts from a terminated state
- the app is already running and receives a link event
Treat those as separate code paths. I regularly see teams test only one of them, then discover that links fail after install, after auth, or when the app returns from the background.
If you're still on firebase_dynamic_links, the canonical pattern is to process getInitialLink() at startup and subscribe to onLink for later events.
import 'package:firebase_dynamic_links/firebase_dynamic_links.dart';
import 'package:flutter/material.dart';
class DynamicLinkHandler {
DynamicLinkHandler(this.navigatorKey);
final GlobalKey<NavigatorState> navigatorKey;
Future<void> init() async {
final PendingDynamicLinkData? initialLink =
await FirebaseDynamicLinks.instance.getInitialLink();
if (initialLink != null) {
_handleDeepLink(initialLink.link);
}
FirebaseDynamicLinks.instance.onLink.listen((PendingDynamicLinkData data) {
_handleDeepLink(data.link);
}).onError((Object error) {
debugPrint('Dynamic link error: $error');
});
}
void _handleDeepLink(Uri uri) {
final path = uri.path;
final contentId = uri.queryParameters['id'];
if (path == '/product' && contentId != null) {
navigatorKey.currentState?.pushNamed(
'/product',
arguments: contentId,
);
return;
}
if (path == '/invite') {
navigatorKey.currentState?.pushNamed(
'/invite',
arguments: uri.queryParameters,
);
return;
}
navigatorKey.currentState?.pushNamed('/home');
}
}
That code is enough to keep the app functional, but only if routing stays predictable.
Parse once, route once
Legacy FDL integrations often fail because link parsing is scattered across widgets, BLoCs, guards, and startup services. Centralize it. Convert every incoming URI into a small internal route model, then let the navigation layer act on that model.
That gives you two benefits. Runtime behavior becomes easier to debug, and your migration gets cheaper because the replacement provider only needs to supply a URI, not rewire the whole app.
A practical internal model usually includes:
- Path intent: product, article, invite, reset, promo
- Required identifiers: slug, ID, token, campaign payload
- Fallback behavior: home, webview, login, or error screen
This Flutter deep linking examples guide is a useful reference if you're refactoring older navigation code into a cleaner route parser.
If raw query parameters directly trigger screen pushes across the app, fix that now. Keeping the old behavior alive is hard enough. Migrating it later gets worse.
Protect the user journey while FDL is still alive
A maintenance pass before cutover is worth the time. Focus on failure handling and route integrity, not elegance.
These are the fixes I would prioritize first:
Normalize every incoming URI
Clean trailing slashes, decode values safely, and reject malformed payloads before they hit navigation.Preserve post-login intent
Protected routes should survive authentication. If a user opens an invite or reset link while signed out, store the destination and resume it after login.Log unresolved routes and bad payloads
Unknown paths, missing IDs, and expired tokens should show up in diagnostics. Without that visibility, teams misread migration bugs as provider bugs.Test every app state on both platforms
Validate terminated, backgrounded, and foreground flows on Android and iOS. Universal Links and App Links replacements will be judged against this baseline, so the baseline needs to be real.Define a safe fallback for dead destinations
Some old campaign links will point to screens that no longer exist. Send users somewhere intentional, such as a collection page or home, instead of dropping them into a blank state.
What to avoid during the sunset period
Do not add new product bets on top of FDL. A retiring link service is the wrong foundation for a new referral flow, attribution rule, or campaign structure.
Keep the old implementation stable, narrow, and observable. The goal is to preserve business-critical behavior until the replacement is ready, while reducing the amount of Firebase-specific logic you still have to carry.
Planning Your Migration Strategy Away from Firebase


Most migration debates sound technical but are really business decisions in disguise. Teams ask, "Should we use App Links and Universal Links or move to a third-party platform?" The better question is, "Which trade-off can we live with for the next several product cycles?"
The cleanest framing is simple. You have two paths.
Build with native deep linking primitives
This path uses Android App Links and iOS Universal Links as the foundation. In Flutter, teams often combine that with a package such as app_links or a custom platform bridge, then wire route parsing, attribution handling, and fallback behavior in-house.
Native setups give you control. You decide URL structure, app routing behavior, and how much external SDK dependency you're willing to accept. If your app has strict compliance requirements, a minimal external footprint can be attractive.
The downside is implementation scope. The migration guidance summarized by Choto Link notes that dedicated native setups offer more control but can require 2-3x longer turnaround times and demand custom analytics solutions, while third-party services are faster and include stronger analytics out of the box in this migration comparison.
Move to a managed third-party platform
This path usually means integrating a provider such as Branch, Adjust, AppsFlyer, Airbridge, or another deep-linking platform with Flutter support. The appeal is obvious. You get a package or SDK, dashboard tooling, short-link generation, and built-in reporting sooner.
For product teams with active campaigns, that's often the pragmatic answer. You aren't rebuilding the entire routing and attribution stack yourself.
But managed platforms come with trade-offs:
- SDK dependency: Your app behavior partly depends on another vendor's release cycle and API design.
- Schema adaptation: Existing FDL parameters may not map cleanly to the new provider.
- Cost and lock-in: Convenience now can narrow your options later.
- Data flow review: Security, compliance, and user-data handling need a real review, not a checkbox.
A practical comparison
| Decision area | Native App Links and Universal Links | Third-party provider |
|---|---|---|
| Control | Highest | Shared with vendor |
| Rollout speed | Slower | Faster |
| Deferred-linking behavior | Needs custom design | Often available as a product feature |
| Analytics | You build or integrate it | Usually built in |
| Vendor lock-in | Lower | Higher |
| Maintenance | Internal burden | Split between team and vendor |
How to choose based on your app, not fashion
If you're advising a startup with a lean mobile team, "full control" can be an expensive fantasy. If you're advising a regulated product with long retention windows and strict audit expectations, "fastest integration" can create future headaches.
I use four decision filters.
Team capacity
A senior mobile team with native platform knowledge can implement App Links and Universal Links cleanly. A smaller team that mostly ships Flutter UI may struggle once edge cases appear. The migration stops being about package installation and starts being about ownership of platform-specific behavior.
Feature parity with your current flows
Some apps only need direct-to-screen routing. Others need campaign attribution, invite acceptance, referral context, and post-install continuity. The further you are from plain deep linking, the less likely a bare native setup will feel like a drop-in replacement.
Analytics expectations
Firebase Dynamic Links gave teams a compact set of link-level metrics. If your growth or product team depends on that style of visibility, native-only migration means replacing not just routing but reporting discipline.
Long-term architecture
The wrong migration is often the one that solves the deadline but creates a second migration later. If your app roadmap includes more acquisition channels, more referral logic, or more market segmentation, pick a solution you can still live with after the panic fades.
Choose the system your team can actually operate. The best deep linking stack on paper is useless if nobody owns analytics, QA, and routing rules after launch.
A phased migration beats a big-bang cutover
Whatever option you choose, roll it out in slices. Start with low-risk links, then move critical onboarding and campaign flows after validation. That approach gives you space to compare app behavior, route accuracy, and analytics continuity before the most sensitive traffic moves.
A phased plan usually looks like this:
- Phase one: Export FDL metadata and classify routes.
- Phase two: Recreate a narrow set of non-critical links in the new system.
- Phase three: Validate app opens, fallbacks, and attribution behavior.
- Phase four: Migrate high-value flows such as onboarding, referrals, and paid campaign links.
- Phase five: Retire old generation paths so teams stop creating dependencies on FDL.
What works is disciplined scope. What doesn't work is trying to preserve every historical URL pattern, every campaign naming quirk, and every old edge case in the first pass.
Common Migration Pitfalls and Advanced Considerations


Most migration guides are too optimistic. They compare providers, mention Universal Links and App Links, and stop there. That misses the hard part.
Pain starts when your old firebase dynamic links setup has years of routing assumptions, campaign habits, and custom domain history baked into it. That's why teams that "already chose a provider" can still hit serious delays.
Custom domains are where hidden debt shows up
One of the most under-discussed issues is preserving link equity for custom domains. LeanCode highlights that migration guidance often skips the URL rewriting and gradual traffic migration patterns required to maintain SEO value and user experience in this discussion of custom-domain migration challenges.
That gap matters because custom domains aren't just branding. They may sit inside indexed pages, old newsletters, partner portals, QR codes, support documents, and app-sharing flows users still rely on.
If your team used a custom domain with FDL, ask these questions early:
- Which paths must stay human-readable?
- Which old URLs still need to resolve, even if the backend changes?
- Which redirects should remain permanent versus temporary during transition?
- Who owns the redirect map after mobile engineers finish the migration?
Deferred deep linking is not a simple swap
This is the second place teams get burned. Native deep linking handles installed-app routing well, but the FDL-style post-install handoff isn't automatically equivalent when you move away from Firebase.
Public migration advice often glosses over that difference. The result is a team that thinks it has "replaced deep links" while subtly losing install intent continuity, referral attribution, or campaign context after app install.
For a plain-language explanation of why this distinction matters, this guide to deep linking concepts in mobile apps helps non-specialists on product and hiring teams understand what they are replacing.
Native links and deferred deep links solve related problems. They are not the same product capability.
Parameter mapping becomes messy fast
FDL links often contain habits as much as logic. Over time, teams add UTM parameters, campaign labels, content IDs, referral values, locale hints, and one-off flags. The new provider or native setup may support some directly, some indirectly, and some only through custom handling.
At this stage, migrations often slip. Developers assume parameters can be copied over mechanically, then discover:
- old parameter names are overloaded
- unsupported flags were never documented
- the app depends on values that marketing thought were optional
- fallback pages use assumptions nobody wrote down
A clean migration needs a parameter contract. Decide which values are required, optional, deprecated, or transformed.
Testing often focuses on the wrong path
Teams usually test the happy path first. Install app, tap link, reach screen. That isn't enough.
You need scenario-based tests:
| Scenario | What to verify |
|---|---|
| App installed | Opens to correct in-app content |
| App not installed | Reaches correct store or fallback |
| First launch after install | Intended route or context is preserved |
| Logged-out user | Auth gate preserves destination |
| Unknown route | User lands in a safe fallback flow |
This isn't glamorous work, but it prevents the most expensive class of failure: a migration that looks correct in demos and breaks in actual distribution channels.
Compliance and data handling deserve a direct review
If you move to a third-party platform, review every data element that passes through links or SDK callbacks. Don't assume your previous FDL usage patterns are acceptable everywhere else.
This matters more in regulated environments, but it also matters for any product with sensitive identifiers, account states, or campaign metadata. A shorter path to migration isn't a free pass to move opaque payloads through another vendor without scrutiny.
What works here is restraint. Keep user-facing links minimal, move sensitive logic server-side when possible, and document exactly what the app expects to receive.
FAQ Your Firebase Dynamic Links Migration
Can we keep using old firebase dynamic links after the shutdown date
No. As noted earlier, Firebase Dynamic Links will not keep resolving after the shutdown. Any install flow, referral path, email campaign, QR code, or shared link that still depends on FDL should be treated as a known failure point now, not a future cleanup item.
Should Flutter teams migrate immediately even if the app is stable
Yes.
App stability does not protect a deprecated link layer. I would freeze all new FDL creation first, then move the highest-risk journeys into a replacement path while the current behavior is still easy to compare in QA.
Do we need to replace every old link
No. Replace the links that still drive revenue, activation, support, or retained user traffic. Retire dead campaigns, removed routes, and one-off links nobody can justify maintaining.
Teams waste time when they treat the migration like historical preservation. The better approach is triage.
Is a native-only solution enough for most apps
Sometimes. Android App Links and iOS Universal Links are a good fit if the job is opening installed users into the right screen with a domain you control.
They are usually not enough by themselves if your product depends on deferred deep linking, campaign attribution, link analytics, or preserving context after install. In those cases, native links reduce vendor dependence, but your team has to build or buy the missing pieces.
What's the biggest mistake teams make during migration
They swap SDKs before they define behavior.
The hard part is keeping user intent intact across installed, not installed, logged-out, expired, and malformed-link states. If the route contract, fallback rules, and analytics mapping are fuzzy, a new provider just gives you a new way to ship the same bug.
How should we handle Flutter code during the transition
Keep one routing contract.
Your legacy FDL handler and the replacement path should both feed the same parser and destination resolver. That keeps navigation logic in one place, reduces regression risk, and makes it much easier to compare old and new behavior during phased rollout.
What if marketing still creates new Firebase links by habit
Stop it at the process level. Remove old templates, archive internal docs that tell people to generate FDLs, and shut down any tooling that still exposes those flows.
This is one of the few migration problems that gets worse every week if nobody owns it.
How should recruiters or engineering managers evaluate candidates on this work
Ask for migration judgment, not package familiarity.
A strong Flutter candidate should be able to explain cold-start deep link handling, app-resume behavior, auth-gated destinations, fallback URL design, and the trade-offs between native links and third-party deferred deep linking providers. They should also be able to describe how they would test those paths across Android and iOS without forking app behavior.
What should be done first this week
Start with operational clarity, not tooling debates.
- Export current link metadata, destinations, and any remaining performance history
- List every place new FDLs can still be created
- Mark the user journeys that would cause real business damage if they break
- Choose whether native links cover the requirement or a third-party provider is still needed
- Run the migration in phases, with old and new routing compared in QA before cutover
Teams that skip the inventory step usually argue about vendors before they understand what their app needs.
If you're building or rescuing a Flutter app under real product pressure, Flutter Geek Hub is worth bookmarking. It publishes practical Flutter guidance for engineers, hiring teams, and founders who need clear advice on architecture, tooling, and mobile delivery without the usual fluff.


















