Firebase Dynamic Links has shut down: how to move your links in an afternoon
Google shut down Firebase Dynamic Links on 25 August 2025. Links on page.link domains stopped resolving, and apps that relied on them for deferred deep linking — sending a new user to the right screen after they install — lost that flow overnight.
If you are still cleaning up, this guide walks through a migration that most teams finish in an afternoon.
What you actually need to replace
Dynamic Links did four jobs. Make sure your replacement covers all of them:
- Open the app when it is installed — Universal Links on iOS, App Links on Android.
- Send people to the store when it isn't — with a web fallback on desktop.
- Remember the link through the install — so the first open lands on the right screen with the right parameters (deferred deep linking).
- Count it — clicks, installs and opens per link and per campaign.
Plain Universal Links and App Links only do the first job. The other three need a service in the middle.
Step 1: Export your existing links
In the Firebase console, export your Dynamic Links as CSV. Keep the long-link parameters (link, apn, ibi, ofl and the social preview fields) — they map directly onto AppLinks.
Step 2: Create your app and a link domain
In CodeOnAir, create an app. You immediately get a free link domain such as yourapp.codeonair.com, and the apple-app-site-association and assetlinks.json files are generated and hosted for you. On a paid plan you can use your own domain, such as link.yourbrand.com, instead.
Step 3: Import the CSV
Open AppLinks → Import CSV and choose the URL prefix to import into. Each link keeps its path, its parameters and its social preview, so the content you shared before still makes sense when it is opened.
Step 4: Add the SDK
Put your App ID in the native config — that is the only value the app needs, there is no secret key in the app:
<!-- AndroidManifest.xml, inside <application> -->
<meta-data android:name="com.codeonair.APP_ID" android:value="proj_…" />
<!-- Info.plist -->
<key>CodeOnAirAppId</key>
<string>proj_…</string>
Then initialise it once and listen for links:
import DeepLink from "@codeonair/deeplink-react-native";
DeepLink.init();
DeepLink.onLink((link) => navigation.navigate(link.path, link.params));
onLink fires both for a normal open and for the first open after an install, so you handle both cases in one place.
Step 5: Turn on the native link settings
Add your link domain to Associated Domains on iOS and an autoVerify intent filter on Android. The dashboard's app setup screen shows the exact lines for your app, and the Expo config plugin can add them for you.
How deferred deep linking works after the install
- Android: the Play install referrer carries the link through the store, so the match is exact.
- iOS: a privacy-safe fingerprint (hashed, never the raw IP) matches the first open to the click, within the link's attribution window.
A short checklist before you switch traffic
- Open a link with the app installed — it should open the right screen.
- Uninstall, open a link, install from the store, open the app — it should land on the same screen.
- Open a link on desktop — it should go to your web fallback.
- Share a link in WhatsApp or Instagram and check the preview.
That's it. Once the checklist passes, update the links in your app, emails and campaigns to the new domain.
Ready to move? Every app starts on the free plan, with 10,000 link clicks a month.