Published on

Firebase Dynamic Links Alternatives: How to Use App Links in 2026

Firebase Dynamic Links was officially retired by Google in August 2025, but you can achieve the same deep linking (links that send users to specific content inside an app) results using Firebase Hosting combined with Apple App Links and Android App Links. By setting up a configuration file on your web domain, you can direct users to your app if it’s installed or to the App Store/Play Store if it isn't, usually in under 20 minutes of configuration.

Since the shutdown of the legacy Dynamic Links service, developers now use standard web technologies to handle app routing. The modern approach relies on App Links (for Android) and Universal Links (for iOS), which are more secure because they prove you own both the website and the app.

Instead of a dedicated "Dynamic Links" tab in the Firebase Console, you now use Firebase Hosting to host a small "manifest" (a public list of settings) that tells mobile operating systems which app is allowed to open your links. This shift has made links faster and more reliable since they no longer require a middle-man redirect server.

We've found that this new method actually improves user trust because the links use your own custom brand domain (like links.yourbrand.com) rather than a generic Firebase URL. It’s normal to feel overwhelmed by the change, but the underlying logic of "clicking a link to open an app" remains the same.

What do you need to get started?

Before you start building, make sure you have the following tools and accounts ready. Having everything in one place will make the process much smoother.

  • A Firebase Project: You'll need a project set up at the Firebase Console.
  • A Custom Domain: You need a domain (like example.com) connected to Firebase Hosting.
  • App IDs: You need your Apple Team ID and your Android SHA-256 certificate fingerprint (a unique digital signature for your app).
  • Frameworks: This guide assumes you are using current standards like Next.js 15 or React 19 for your landing pages and Flutter 3.30+ or React Native 0.78+ for your mobile app.

Android App Links allow your app to open specific URLs automatically without asking the user which app to use. This is handled by a file called assetlinks.json.

Step 1: Create the association file Create a folder named .well-known in the public directory of your web project. Inside that folder, create a file named assetlinks.json.

Step 2: Add your app details Paste the following code into your assetlinks.json file, replacing the placeholders with your actual app data.

[
  {
    "relation": ["delegate_permission/common.handle_all_urls"],
    "target": {
      "namespace": "android_app",
      "package_name": "com.yourcompany.app", // Your unique app ID
      "sha256_cert_fingerprints": [
        "00:11:22:AA:BB..." // Your app's unique digital signature
      ]
    }
  }
]

Step 3: Deploy to Firebase Hosting Run the command firebase deploy --only hosting in your terminal. You should be able to navigate to https://yourdomain.com/.well-known/assetlinks.json in your browser and see your code.

iOS uses a similar system called Universal Links. Instead of a JSON file, Apple looks for a file called apple-app-site-association (AASA).

Step 1: Create the AASA file In the same .well-known folder you created earlier, create a file named apple-app-site-association. Do not add a file extension (like .json or .txt) to this filename.

Step 2: Define your app behavior Add the following configuration to define which parts of your website should open the app.

{
  "applinks": {
    "details": [
      {
        "appIDs": [
          "TEAMID.com.yourcompany.app" // Your Apple Team ID + Bundle ID
        ],
        "components": [
          {
            "/": "/products/*", // This opens the app for any product link
            "comment": "Matches any URL starting with /products/"
          }
        ]
      }
    ]
  }
}

Step 3: Verify the deployment Deploy your site again with the Firebase CLI (Command Line Interface). Apple's servers will periodically check this URL to verify that your website "trusts" your mobile app.

How does the app know which page to open?

Once the link opens your app, you need to write a small amount of code to "read" the URL and navigate the user to the right screen. This is called Deep Link Routing.

If you are using a modern AI model like Claude Sonnet 4 or GPT-5 to help write your routing logic, you can ask it to "generate a deep link listener for React Native using Expo Router."

Here is a simple example of how your app handles an incoming link in JavaScript:

import * as Linking from 'expo-linking';

// This function runs when the app is opened via a link
function handleDeepLink() {
  const url = Linking.useURL(); // Gets the URL that opened the app

  if (url) {
    const { hostname, path, queryParams } = Linking.parse(url);
    console.log(`User wants to see ${path} with ID ${queryParams.id}`);
    // You would then use a router to navigate to that screen
  }
}

What you should see: When you click a link like https://yourdomain.com/products/123 on a phone, the app should launch immediately and log the path to the console.

What are the common gotchas to avoid?

Setting up deep links can be tricky because small mistakes prevent the whole system from working. Don't worry if it doesn't work on the first try; it's normal to spend some time debugging.

  • The HTTPS Requirement: Universal Links and App Links will only work over HTTPS (Hypertext Transfer Protocol Secure). Fortunately, Firebase Hosting provides this by default.
  • File Location: The .well-known folder must be at the very root of your domain. If your file is at yourdomain.com/static/.well-known/, the phone will never find it.
  • The AASA Extension: A common mistake is naming the Apple file apple-app-site-association.json. Apple specifically requires that the file has no extension at all.
  • Caching: Browsers and operating systems often cache (save a temporary copy of) these files. If you change your settings, it might take a few hours for your phone to "see" the update.

Testing is the most important part of the process. You don't need to publish your app to the store to see if your links work.

  1. Android Debug Bridge (ADB): You can use a command-line tool to "force" a link to open on an Android emulator. This confirms your assetlinks.json is correct.
  2. iOS Simulator: In Xcode, you can run a command to simulate a "Universal Link" click.
  3. Branch.io or AppsFlyer: If your needs are very complex—like tracking exactly which social media ad resulted in an app install—we suggest looking at third-party tools. While Firebase Hosting handles the "linking," these tools provide advanced analytics that Firebase Dynamic Links used to offer.

By following these steps, you've moved past the retired Dynamic Links system and implemented the modern 2026 standard for mobile growth. You are now ready to send users exactly where they need to go.

Next Steps

Now that you have your links working, you should look into Firebase App Check. This service ensures that only your genuine app can access your backend resources, adding an extra layer of security to your new deep linking setup. You might also want to explore Next.js 15 server actions to create even faster redirect pages for users who don't have your app installed yet.

For more detailed technical specifications, check out the official Firebase Hosting documentation.


Read the Firebase Documentation