FlutterFlow Dynamic Links
FlutterFlow Dynamic Links are short web links, such as https://your-project-id.fflink.app/Ab3dE7x, that open a specific page in your app. When someone opens a link on a device that doesn't have your app, the link sends them to the App Store, Google Play, or your web app instead. FlutterFlow Dynamic Links replace Firebase Dynamic Links, which shut down in August 2025.
With FlutterFlow Dynamic Links, you can do the following:
- Create links in FlutterFlow to share in emails, ads, or social posts.
- Let your app create links, so that users can share the page they're on.
- Set the title, description, and image that chat and social apps show for a shared link.
- Track clicks, app opens, and campaigns for each link.
Deep links that use your app's URL scheme, such as myapp://myapp.com/profile, keep working when you turn on FlutterFlow Dynamic Links. For more information about deep links, see Deep & Dynamic Linking.
Before you begin
Make sure that your project meets the following requirements:
- Deep linking is on. It's on by default, so most projects don't show a switch for it. If App Details shows an Enable Deep Linking switch, turn it on.
- The pages that you want links to open have a route. To set a page's route, select the page, and then open Route Settings in the properties panel.
- Your project has a Dynamic Links add-on unit. For more information, see Add the Dynamic Links add-on.
You also need the following information for each platform that you enable:
- Android: the SHA-256 fingerprint of the key that signs your app. For an app on Google Play, use the app signing key from Play Console > Test and release > App integrity, not your local upload key.
- iOS and macOS: your 10-character Apple Team ID, from the Membership section of the Apple Developer portal. If your app is on the App Store, also have its App Store ID, a 9- or 10-digit number.
- Web: the URL of your web app, if you host it somewhere other than your FlutterFlow web publishing address.
Add the Dynamic Links add-on
FlutterFlow Dynamic Links is a paid add-on. Each project that uses it needs one Dynamic Links unit, which costs $10 per month or $96 per year. The team plan pays for units used by team projects, and the project owner's plan pays for units used by personal projects.
Only a team owner or the owner of a personal project can buy a unit. You also need a paid team plan or a paid personal plan. If you collaborate on someone else's personal project, ask its owner to change the Enable FlutterFlow Dynamic Links switch. You can't see the owner's plan, so the switch is unavailable to you, and a tooltip next to it explains why.
To buy a unit, do the following:
- Go to Settings and Integrations > Dynamic Links > Setup.
- Click Add-on next to Enable FlutterFlow Dynamic Links, and then follow the prompts.
The Add-on button appears only when the project's plan has no Dynamic Links unit and the feature is off. While FlutterFlow checks your plan, the switch is unavailable and the page shows Checking your plan…. On the desktop app, the button opens your account or team page in a browser, where you complete the purchase.
FlutterFlow assigns a unit to your project when you register your app, not when you buy the unit. Registering again after a failed attempt reuses the project's unit instead of taking another one.
When you turn off FlutterFlow Dynamic Links in a project that is registered, FlutterFlow asks you to confirm in a Turn off Dynamic Links? dialog. If you click Turn off, the project releases its unit, and you can use the unit in another project. To create links in the project again, turn the switch back on and register your app again.
If a project is already using FlutterFlow Dynamic Links but its plan has no unit for it, the project keeps working. Turning the switch off shows a warning that you need the add-on to turn it on again.
A project releases its unit in the following cases:
- You turn off FlutterFlow Dynamic Links.
- You move the project between a personal account and a team, or to a different team.
- The owner of a personal project changes.
- The plan that pays for the unit no longer includes it, such as after a downgrade or cancellation.
If a project no longer has a unit, the Setup and Links tabs show a message that names the cause and explains how to get a unit back. The links that you already created keep working, and your app still builds. You can't create new links, either in FlutterFlow or from your app. On the Links tab, Create a link is unavailable. On the Setup tab, the button that sends your settings reads Register app instead of Update. Click it to register your app again with an available unit.
A project's unit belongs to the plan that pays for it, so the unit doesn't move with the project. When you share a project with a team, stop sharing it, switch its team, or transfer ownership of a personal project, and the project uses FlutterFlow Dynamic Links, the confirmation includes a Dynamic Links note that the project releases its unit. After the change, register your app again with a unit from the plan that the project now bills to.
Set up FlutterFlow Dynamic Links
To set up FlutterFlow Dynamic Links, do the following:
-
Go to Settings and Integrations > Dynamic Links > Setup.
You can also click Set up Dynamic Links in the Routing & Deep Linking section of Settings and Integrations > General > App Details.
-
Turn on Enable FlutterFlow Dynamic Links.
-
Under Platforms, enable each platform where you want links to open your app, and then complete its fields. A link opens in a browser on any platform that you leave off.
- Android: under SHA-256 fingerprints, click Add fingerprint, and then enter the fingerprint of the key that signs your app. To let more than one build open your links, such as a test build signed with a different key, add a fingerprint for each key. FlutterFlow saves a new row only after you enter a value, so an empty row doesn't block your builds. To remove a fingerprint, click the Remove icon next to it, or clear its field.
- iOS: in Apple Team ID, enter your Team ID. If your app is on the App Store, enter its ID in App Store ID (optional). Without an App Store ID, people who open a link on iOS without your app see your web app or a preview page instead of the App Store.
- macOS: turn this on to let your Mac app open links. It uses the same Apple Team ID as iOS. This option appears only if your project builds for macOS. Only release builds open links. For more information, see Build for macOS.
- Web: in Web app URL, check the address of your web app. FlutterFlow fills it in from your published web address. Links open here on Windows, Linux, and other devices that can't open your app.
The Package name and Bundle ID come from App Details. To change them, edit them there.
-
Click Register app.
FlutterFlow assigns your project's link domain and shows it in Link domain. Each project gets its own domain, based on its project ID, such as your-project-id.fflink.app. You can't change the domain or use a custom domain.
FlutterFlow adds the settings that Android, iOS, and macOS need to open your links in your app, so you don't need to edit any native files. Wait a few minutes before you test your links. On iOS and macOS, reinstall your app first, because the app checks which links it can open only when it's installed.
Register your app before you build it, because builds need the link domain.
Registering is the only step that you do by hand. After that, FlutterFlow sends changes to your app's link settings automatically a few moments after they save. This includes a new SHA-256 fingerprint, Apple Team ID, App Store ID, web app URL, Package name, Bundle ID, or platform, and it includes changes that the AI agent makes. If your links don't reflect a change, click Update to send it again. FlutterFlow doesn't send settings that are incomplete, such as iOS turned on without a Team ID, until you fill in the missing fields.
If Android opens your links in the browser instead of your app, check the SHA-256 fingerprint first. A fingerprint from the upload key instead of the Play App Signing key is the most common cause.
Build for macOS
On macOS, only release builds open links in your Mac app. FlutterFlow signs release builds with the Apple Team ID that you entered, so build them on a Mac that is signed in to that team, such as in Xcode. Debug builds, including Local Run, sign locally and open links in the browser. They build on any Mac.
If you turn on macOS without a valid 10-character Apple Team ID, your Mac app doesn't claim your link domain, so links don't open it.
Use custom Runner.entitlements code on iOS
If your custom code for Runner.entitlements already declares com.apple.developer.associated-domains, such as for a domain from another link service, FlutterFlow adds your link domain to your list. Your entries stay as they are, and your link domain is added once.
If your code sets that key to something other than an <array> of <string> entries, FlutterFlow can't add the link domain, and your app would open links in the browser. In that case, the project shows an error that tells you to change the value to an array. If FlutterFlow can't read your code, the project shows a warning instead. For more information about custom entitlements, see Configuration Files.
Deploy to the App Store
When iOS is on, your app signs the Associated Domains capability. If you deploy your app with the one-click App Store deployment, FlutterFlow turns on Associated Domains for your App ID before it creates the signing files, so you don't need to turn it on in the Apple Developer portal. If FlutterFlow can't turn it on, the build log says so. In that case, turn on Associated Domains for your App ID under Certificates, Identifiers & Profiles in the portal. For more information about deploying, see Apple App Store Deployment.
Open the right page in your app
When someone opens a link and your app is installed, the app opens on the page that the link points to, with the link's page parameters. This works whether the app is already running or starts because of the link. If the linked page requires authentication, users must sign in before viewing it.
To run more actions after the page opens, such as logging which campaign brought the user in, select an Action Block in When a link opens the app on the Setup tab. The Action Block can take any of the following parameters. FlutterFlow matches them by name.
| Parameter | Type | Value |
|---|---|---|
routePath | String | The route of the page that the link opened. |
routeParameters | JSON | The page parameters that the link carried. |
campaignSource | String | The link's campaign source. |
campaignMedium | String | The link's campaign medium. |
campaignName | String | The link's campaign name. |
campaignTerm | String | The link's campaign term. |
campaignContent | String | The link's campaign content. |
An Action Block parameter with any other name causes a build error. The Action Block doesn't run in web apps. On the web, a link opens its page in your web app directly.
Create links
You can create links in FlutterFlow or let your app create them while it runs. Register your app on the Setup tab before you create links.
Create a link in FlutterFlow
Create a link in FlutterFlow when you want to share the same link with many people, such as in a newsletter or an ad.
- Go to Settings and Integrations > Dynamic Links > Links.
- Click Create a link.
- In Name, enter a name that helps you find the link later. People who open the link don't see the name.
- In Destination, choose the page that the link opens. Only pages with a route appear.
- Under Parameters, set the values of the page's parameters.
- Optional: under Preview when shared, enter the title and description that chat and social apps show for the link.
- Optional: under Campaign tracking (optional), enter Source, Medium, Campaign, Term, and Content values to identify traffic from this link in the Analytics tab.
- Click Create link.
To copy a link, click the Copy link icon next to it in the list.
Create links from your app
To let users share links, add the Generate Current Page Link action to your app.
What happens when someone opens a link
| Where the link opens | With your app installed | Without your app |
|---|---|---|
| iOS | Your app opens on the link's page. In a browser that doesn't hand the link to your app, such as the in-app browser in Instagram, Facebook, TikTok, or LinkedIn, or Safari after someone pastes the link, people see the page described after this table. | A page with Open in app and Get the app buttons. Get the app leads to the App Store. With Skip Preview Page on, the link goes straight to the App Store. Without an App Store ID, the link opens your web app, or shows a page with Open in app if you don't have a web app. |
| Android | Your app opens on the link's page. | An Open the app page that leads to Google Play. |
| macOS | Your Mac app opens on the link's page, if you turned on macOS and the app is a release build. Debug builds open the link in the browser. | Your web app opens on the link's page. |
| Windows, Linux, and other devices | Not applicable. | Your web app opens on the link's page, with the link's campaign values as utm_ parameters. Without a web app URL, a preview page appears. |
When someone shares a link in a chat or social app, that app shows the link's preview title, description, and image.
Open links on iOS from in-app browsers
On iOS, an installed app opens a link only when iOS handles the tap itself. Some in-app browsers load the link in their own web view instead, and Safari doesn't open the app for a link that someone types or pastes. In these cases, people who have your app still see a page, so the page offers both choices instead of sending everyone to the App Store:
- Open in app opens your app on the link's page.
- Get the app opens your app's page in the App Store.
The page shows the link's preview image, title, and description. It doesn't redirect on its own, so people have to tap a button. If someone taps Open in app on a device without your app, Safari shows an error that it can't open the page.
To skip this page and send iPhone visitors straight to the App Store, turn on Skip Preview Page. Leave it off if people open your links inside social apps, because the App Store listing can't open your app on the linked page.
The Open in app button appears after you click Update on the Setup tab. Apps that you already published don't need a rebuild. Until you click Update, the page shows only Get the app.
Because the app can't tell that someone tapped Open in app, those visits count as fallbacks in the Analytics tab, not as opens.
Manage links
On the Links tab, each link shows its destination and how many times people clicked it and opened your app from it. For each link, you can do the following:
- To change a link's name, destination, preview, or campaign, click the Edit link icon.
- To copy a link, click the Copy link icon.
- To stop a link from working, click the Deactivate icon, and then confirm in the Deactivate this link? dialog.
- To turn a deactivated link back on, click the Reactivate icon. The link works again with the same short code.
After you deactivate a link, it stops working everywhere that you shared it, including printed QR codes, emails, and posts. Anyone who opens it sees a Link not found page until you reactivate it.
Reactivating a link doesn't need a Dynamic Links unit, because it doesn't create a new link.
View analytics
The Settings and Integrations > Dynamic Links > Analytics tab shows the following for your project's links:
- Clicks: how many times people opened your links in the last 30 days.
- Opens: how many times your app reported opening from a link.
- Fallbacks and Fallback rate: the number and percentage of visitors who went to an app store page or a preview page because your app didn't open.
- A daily chart for the last 30 days, in UTC, and breakdowns by platform and by link.
Previews that chat and social apps load when someone shares a link don't count as clicks.
If fallbacks rise on one platform, links on that platform have probably stopped opening your app. Check that platform's settings on the Setup tab, such as the Android SHA-256 fingerprint.
Move from Firebase Dynamic Links
Firebase Dynamic Links has been retired, and FlutterFlow no longer generates Firebase Dynamic Links code for your app. If your project saved the Firebase setting earlier, Settings and Integrations > General > App Details still shows it as Firebase Dynamic Links (retired), and the Dynamic Links tab in App Settings explains that the setting no longer enables the service. The setting doesn't stop you from configuring FlutterFlow Dynamic Links.
To move a project from Firebase Dynamic Links, do the following:
- In App Details, turn off Firebase Dynamic Links (retired). The switch is available only to turn the setting off.
- Follow the steps in Set up FlutterFlow Dynamic Links.
Until you configure FlutterFlow Dynamic Links, existing Generate Current Page Link actions that have Generate Short Link off return ordinary app deep links, and actions that have it on show a project error. After you configure FlutterFlow Dynamic Links, the actions create FlutterFlow Dynamic Links. Links that Firebase created don't move to FlutterFlow Dynamic Links, so create new links to replace any that you shared.
Custom code that imports the Firebase Dynamic Links package no longer builds, because the package is removed from generated apps. Update that code to use another link solution.
Limits
FlutterFlow Dynamic Links have the following limits for each project:
- Your app can create up to 60 links per minute and 1,000 links per day, and up to 10 links per minute from any one IP address. Links that you create on the Links tab don't count toward these limits.
- Your links can receive up to about 600 clicks per minute.
- Links don't expire. To stop a link from working, deactivate it.