Firebase Dynamic Links Migration

Firebase Dynamic Links is deprecated and will shut down on August 25, 2025. This guide helps you migrate to Clippr with minimal disruption.

Why Migrate to Clippr?

  • Similar API: Designed to feel familiar to Firebase users
  • Better attribution: Install Referrer support for 100% accuracy on Android
  • Modern architecture: Built for scale and reliability
  • Active development: New features and improvements
  • Fair pricing: Generous free tier and transparent pricing

Migration Overview

1. Create Clippr account and app
2. Update SDK dependencies
3. Update code (minimal changes)
4. Update Universal Links / App Links configuration
5. Create new links in Clippr
6. Redirect old links (optional)
7. Test and deploy

Step 1: Create Clippr Account

  1. Sign up at app.useclippr.xyz
  2. Create an organization
  3. Create an app with your iOS/Android configuration
  4. Copy your API key

Step 2: Update Dependencies

Remove Firebase:

yaml
# pubspec.yaml - Remove these
dependencies:
firebase_dynamic_links: ^5.0.0  # Remove

Add Clippr:

yaml
dependencies:
clippr: ^0.0.4

Step 3: Update Code

Initialization

Before (Firebase):

dart
import 'package:firebase_dynamic_links/firebase_dynamic_links.dart';

void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}

After (Clippr):

dart
import 'package:clippr/clippr.dart';

void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Clippr.initialize(apiKey: 'YOUR_API_KEY');
runApp(MyApp());
}

Before:

dart
final PendingDynamicLinkData? data =
  await FirebaseDynamicLinks.instance.getInitialLink();
if (data != null) {
final Uri deepLink = data.link;
// Handle link
}

After:

dart
final link = await Clippr.getInitialLink();
if (link != null) {
final path = link.path; // e.g., "/product/123"
// Handle link
}

Before:

dart
FirebaseDynamicLinks.instance.onLink.listen((dynamicLinkData) {
final Uri deepLink = dynamicLinkData.link;
});

After:

dart
Clippr.onLink = (link) {
final path = link.path;
};

Before:

dart
final dynamicLinkParams = DynamicLinkParameters(
link: Uri.parse('https://example.com/product/123'),
uriPrefix: 'https://example.page.link',
androidParameters: AndroidParameters(packageName: 'com.example.app'),
iosParameters: IOSParameters(bundleId: 'com.example.app'),
);
final link = await FirebaseDynamicLinks.instance.buildShortLink(dynamicLinkParams);

After:

dart
final params = LinkParameters(
path: '/product/123',
campaign: 'my_campaign',
);
final shortLink = await Clippr.createLink(params);
// shortLink.url contains the short URL

Step 4: Update Platform Configuration

iOS - Associated Domains

Before:

applinks:example.page.link

After:

applinks:yourapp.clppr.xyz

Android - Intent Filter

Before:

xml
<data android:host="example.page.link" android:scheme="https"/>

After:

xml
<data android:host="yourapp.clppr.xyz" android:scheme="https"/>

For most cases, recreate your links in Clippr:

  1. Export your Firebase links
  2. Create equivalent links in Clippr dashboard
  3. Update any hardcoded links in marketing materials

If you have many links in circulation:

  1. Set up a redirect from your Firebase domain
  2. Redirect to equivalent Clippr links
  3. Gradually phase out old links

Step 6: Testing

  1. Test direct links: Click link with app installed
  2. Test deferred links: Uninstall, click link, install, open
  3. Test attribution: Verify campaign/source/medium data
  4. Test all platforms: iOS, Android, web fallback

API Comparison Table

Firebase Dynamic Links Clippr Notes
getInitialLink() getInitialLink() Same concept
onLink stream onLink callback Similar pattern
DynamicLinkParameters LinkParameters Simpler structure
buildShortLink() createLink() Same result
link.link (Uri) link.path (String) Path only, simpler

Data Model Changes

Firebase PendingDynamicLinkData

dart
// Firebase
data.link              // Full URI
data.utmParameters     // Map
dart
// Clippr
link.path              // String path
link.attribution       // campaign, source, medium
link.metadata          // Custom data
link.matchType         // How it was matched

Timeline

  1. Now: Start migration, run both in parallel
  2. Before Aug 2025: Complete migration
  3. Aug 25, 2025: Firebase Dynamic Links shuts down

Need Help?