How to replace Firebase Dynamic Links

Firebase Dynamic Links stopped working on 25 August 2025. Not every Dynamic Link did the same job, so the replacement depends on what each one was for. This is a plan for sorting them and moving each kind.

For a side-by-side table of what SetLinks replaces and what it does not, see the Firebase Dynamic Links comparison. This guide is the practical part: how to find every link and move it.

Step 1: find every Dynamic Link you still use

Old links hide in more places than the Firebase console. Search the code and the material you have published:

Terminal
# Links and SDK calls in your repositories
grep -rn 'page.link\|FirebaseDynamicLinks\|firebase-dynamic-links' .

# Custom domains you set up for Dynamic Links
grep -rn 'dynamicLinksDomain\|DynamicLinks' .

Step 2: sort them by what they did

Each Dynamic Link did one of three jobs. Write the job next to every link you found.

What the old link parameters become

A long Dynamic Link carried its settings as parameters. Most have a direct counterpart in a SetLinks link’s destinations:

Step 3: replace the store links

  1. Create a SetLinks link per Dynamic Link, with the same App Store, Google Play and fallback addresses. Add AppGallery or RuStore if your app is there — Dynamic Links never supported them.
  2. Many links? Create them through the REST API from a script instead of by hand. The API is on plans that include it, listed on the pricing page.
  3. Swap the addresses in emails, bios, your site and running ads.
  4. Reprint the QR codes. This is the one reprint you pay for: a SetLinks code keeps its address when the destinations change, so later changes never need one.

Links on *.page.link belonged to Google, and nobody can make them work again. If you used a domain of your own for Dynamic Links — links.example.com — you still control its DNS. Connect that subdomain to SetLinks as a custom domain and recreate the paths you printed, and the old addresses work again. SetLinks addresses are lowercase letters, digits and hyphens, at least three characters, so only paths of that shape can be recreated as they were.

Step 4: replace links into the app

Opening an installed app from a link is a platform feature now: Universal Links on iOS, App Links on Android. They need no SDK — a file on the link’s domain names your app, and the app declares the domain. SetLinks publishes those files for your links. On iPhone this works on setlinks.io and on your own domain; on Android only on your own domain, because on a shared domain one app could claim other people’s links. The universal links and App Links guide has the full setup.

In the app, remove the Dynamic Links SDK and handle the incoming URL with the platform API: onOpenURL or scene(_:continue:) on iOS, the intent data in your activity on Android. The path of the URL is the link’s address, so the app can route on it.

Step 5: decide about deferred deep links

If a link must survive the install — a referral code, an invite to a specific team — you need an attribution SDK in the app. SetLinks has no SDK and does not do this. Branch, AppsFlyer and Adjust do; so can your own backend if you are willing to match installs yourself. Be honest about how many links need it: in most apps it is a handful, while the hundreds of store links need nothing in the app.

Step 6: check analytics and clean up

Questions

Can I redirect my old page.link URLs?

No. The page.link domains belong to Google and stopped resolving with the shutdown. Only links on a domain you own can be brought back.

Do I need an SDK to replace Dynamic Links?

Not for store links or for opening an installed app — those need no SDK. Only deferred deep links, which carry a link through the install, need one.

Make your app link

One link and a QR code for every store. Free to start, no card required.

Create a link