Deferred Deep Linking in FlutterFlow Without Branch

FlutterFlow's built in Dynamic Links support depended on Firebase Dynamic Links, which Google shut down on August 25, 2025. FlutterFlow's docs now point to Branch, which is priced for large teams. This guide shows how to get the same result in a FlutterFlow project with Flinku: one custom action, one Android snippet, one iOS entitlement.

What you get

A user taps a link such as https://yourapp.flku.dev/summer-promo.

If your app is installed, it opens directly. If it is not, the user goes to the App Store or Play Store, installs, and on first open your app still receives the link's parameters, so you can send them to the right page instead of the home screen.

Step 1: Create a Flinku project

  1. Sign up free at app.flinku.dev and create a project.
  2. Enter your iOS bundle ID and Team ID, and your Android package name and SHA256 fingerprint. Use the fingerprint from Play Console under App signing if you use Play App Signing.
  3. Note your project URL, for example https://yourapp.flku.dev.

Flinku serves your apple-app-site-association and assetlinks.json files automatically.

Step 2: Add the custom action

In FlutterFlow, open Custom Code, add a Custom Action named flinkuMatch, and add this pubspec dependency to it:

flinku_sdk: ^0.7.3

Set the return type to JSON (nullable) and add one argument baseUrl of type String. Paste:

import 'package:flinku_sdk/flinku_sdk.dart';

Future<dynamic> flinkuMatch(String baseUrl) async {
  Flinku.configure(baseUrl: baseUrl);
  final link = await Flinku.match();
  if (link == null) return null;

  final result = <String, dynamic>{
    'deepLink': link.deepLink,
    'params': link.params ?? <String, dynamic>{},
  };

  // match() caches a successful result and returns it on every launch.
  // Clearing the match cache here means your app routes to it only once.
  await Flinku.reset();
  return result;
}

Step 3: Call it on app start

On your first page (or splash page), add an On Page Load action:

  1. Run the custom action flinkuMatch with baseUrl set to your project URL, and store the output in a page state variable, for example flinkuResult.
  2. Add a Conditional Action that checks whether flinkuResult is set.
  3. Read values with JSON paths such as $.params.page and $.params.id, and use Navigate To to open the matching page with those values as parameters.

In the Flinku dashboard, give each link custom params that your app understands, for example page = product and id = 123.

Step 4: Android App Links

In Custom Code > Configuration Files > AndroidManifest.xml, add an Activity tag snippet:

<intent-filter android:autoVerify="true">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="https" android:host="yourapp.flku.dev" />
</intent-filter>

Step 5: iOS Universal Links

In Custom Code > Configuration Files > Entitlements.plist, add:

<key>com.apple.developer.associated-domains</key>
<array>
  <string>applinks:yourapp.flku.dev</string>
</array>

Enable the Associated Domains capability for your App ID in your Apple Developer account.

Step 6: Test on a real device

Deferred deep linking cannot be tested in FlutterFlow's web preview.

  1. Uninstall the app from the test device.
  2. Tap your Flinku link on that device.
  3. Install the build and open it. The app should open the page from the link's params.

If nothing matches, check the Flinku dashboard analytics for the click, and confirm the bundle ID, Team ID and fingerprint in your project settings.

Pricing

Flinku's free plan includes 3 projects, 300 links a month and 10,000 clicks a month, with deferred deep linking and referral tracking included. Paid plans are $12 and $39 a month, priced on links and clicks rather than monthly active users.

Start free · Flutter SDK docs