Move your Firebase links in one step
After this page, you will have your old Firebase links rebuilt on Strait with their old codes, and a short list of any that need a destination from you.
On this page 8
- Time
- About 5 minutes of your time; the rebuild runs on its own
- You need
- Firebase's export of your links (Google Takeout), or any list, CSV or JSON export of them you have. Without one, your old link domain and your iOS Team ID + bundle ID or Android package in Apps & stores
- Works on
- Android, iPhone
In plain words
Google shut Firebase Dynamic Links down on 25 August 2025. The reliable source for your old links is your own export, so start there:
- Add your export. Firebase's Google Takeout export is a zip with one CSV per link domain: unzip it and add each CSV as it is. A list, your own CSV or a JSON export works too.
- We rebuild each link with the same code, destination, fallbacks, preview and
utm_tags, so an app build that keeps your old domain opens the right place (how). - No export? Try your old domain. It may find only some links: some old page.link links still answer for now. We find archived links in the Internet Archive and ask Google where each pointed. This can stop at any time.
- We tell you what's left. Links nobody can recover are listed with the reason; you type the destination in.
You can close the page; if it pauses, it restarts by itself.
New workspace? It can create 25 links in its first 24 hours. If your export has more, the page says so first: the rest are rebuilt by themselves when the 24 hours end. Need it all today? Write to support@straitlink.in.
1. Add your export
Do this: in the dashboard, open Import → Move from Firebase. Under Your Firebase export, upload each CSV from the Takeout zip (or paste it, up to 5 MB). No export? Open No export? Try your old link domain and type your old domain, for example yourapp.page.link. Press Bring my links over.
You should see: "Rebuilding… 12 of 40 done." with a progress bar, then "Done. All 40 old links rebuilt."
2. Fill in the links that need you
Do this: when the bar reaches the end, look at the Needs you list. It shows each old link we couldn't rebuild, and why. Type its web address and press Rebuild with this. For many, press Download the ones to fill in (CSV), add the destinations in a spreadsheet, and upload the file in step 1 again.
You should see: "Done. All 40 old links rebuilt." or "Done. 38 rebuilt, 2 need you." Rebuilt links are on your Links page with their old code as the path.
3. Keep old links opening your app
Do this: for people who already have your app, keep the page.link domain in your next app build and add it to linkHosts: Open your app from old page.link links.
You should see: on a phone with your new build, tapping https://yourapp.page.link/<code> opens the screen the old link opened.
When it pauses
| Message | Why | What happens |
|---|---|---|
| Today's reads from Google are used | We read Google about once a second and at most 500 times a day per workspace | It resumes by itself at 00:00 UTC |
| Add your iOS Team ID + bundle ID or Android package | We only read a domain whose app-link files name your app | It continues by itself once they're saved |
| Your plan's link limit is reached | New links need room on your plan | We try again every hour |
| New workspaces can create a limited number of links in their first 24 hours | 25 links in a workspace's first day | It continues by itself when the 24 hours end |
For developers: what the engine does
Sources. Each old link is one item keyed by workspace, host and code. Input can be the Google Takeout CSV (Short link, Deep link, Android fallback link…), a list of links or bare codes, any CSV with a short-link column and FDL parameter columns (afl, ifl, ofl, st, sd, si, utm_*), or JSON (dynamicLinkInfo objects or shortLink/longLink pairs). Long links (/?link=…) are skipped (the SDK reads them). Up to 20,000 links per run.
Discovery. With a domain, the engine checks that the domain's app-link files name your app, then reads the Internet Archive's public index for that host.
Reading destinations. For page.link links without a destination, the engine reads Google's undocumented debug page (?d=1); it works only while Google still answers. Up to 3 tries per link; about 1 read a second and 500 a day per workspace, shared with the page.link recovery.
Rebuilding. Each link is created with the same rules and safety check as POST /v1/links, with legacyHost + legacyCode set. The path is the old code (. and ~ become -); if that path is taken, it becomes code-2, and the old code still resolves in your app. Fallbacks, preview and utm_ tags carry over.
Statuses. queued, rebuilt or needs_attention with one reason: google_no_record, google_unreadable, google_unavailable, not_your_app, no_destination (a custom domain link without a destination: only page.link can be read from Google), bad_destination, destination_blocked, slug_unavailable or error.
Re-runs. Running it again never makes a link twice; a restart picks up where it stopped.
Common errors
- "This old domain doesn't name your app". The Team ID, bundle ID or package in Apps & stores doesn't match what Google serves for that domain. Fix them there, then press Try again where it can help.
- Only a few links found. The Internet Archive saved only some of them. Add your export in step 1; nothing is duplicated.
- A custom domain's links all need you. Google's debug page only exists for page.link. Upload a file with destinations for those links.
Next steps
- Open your app from old page.link links: keep old links opening your app.
- Import and cut over: switch your backend to Strait and test on a real phone.