# 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.

- 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

Source: https://straitlink.in/docs/migrate-from-firebase/one-step/

## 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](https://straitlink.in/docs/migrate-from-firebase/page-link/)).
- **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](https://straitlink.in/docs/migrate-from-firebase/page-link/).

**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](https://straitlink.in/docs/migrate-from-firebase/page-link/): keep old links opening your app.
- [Import and cut over](https://straitlink.in/docs/migrate-from-firebase/cutover/): switch your backend to Strait and test on a real phone.
