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
- Sign up at app.useclippr.xyz
- Create an organization
- Create an app with your iOS/Android configuration
- 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
Remove Firebase:
ruby
# Podfile - Remove these
pod 'FirebaseDynamicLinks'
Add Clippr:
ruby
pod 'ClipprSDK', '~> 0.0.4'
Or via SPM, remove FirebaseDynamicLinks and add:
https://github.com/nexlabstudio/clippr-ios.git
Remove Firebase:
kotlin
// build.gradle.kts - Remove
implementation("com.google.firebase:firebase-dynamic-links-ktx")
Add Clippr:
kotlin
implementation("xyz.useclippr: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 (Firebase):
swift
import FirebaseDynamicLinks
FirebaseApp.configure()
After (Clippr):
swift
import ClipprSDK
Clippr.initialize(apiKey: "YOUR_API_KEY")
Before (Firebase):
kotlin
// Firebase initializes automatically
After (Clippr):
kotlin
import xyz.useclippr.sdk.Clippr
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
Clippr.initialize(this, "YOUR_API_KEY")
}
}
Getting Initial Link
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:
swift
DynamicLinks.dynamicLinks().handleUniversalLink(url) { link, error in
guard let link = link else { return }
// Handle link
}
After:
swift
if let link = await Clippr.getInitialLink() {
let path = link.path
// Handle link
}
Before:
kotlin
Firebase.dynamicLinks.getDynamicLink(intent)
.addOnSuccessListener { pendingData ->
val deepLink = pendingData?.link
// Handle link
}
After:
kotlin
val link = Clippr.getInitialLink()
if (link != null) {
val path = link.path
// Handle link
}
Listening for Links
Before:
dart
FirebaseDynamicLinks.instance.onLink.listen((dynamicLinkData) {
final Uri deepLink = dynamicLinkData.link;
});
After:
dart
Clippr.onLink = (link) {
final path = link.path;
};
After:
swift
Clippr.onLink = { link in
let path = link.path
}
After:
kotlin
Clippr.onLink = { link ->
val path = link.path
}
Creating Links
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"/>
Step 5: Migrate Links
Option A: Recreate Links
For most cases, recreate your links in Clippr:
- Export your Firebase links
- Create equivalent links in Clippr dashboard
- Update any hardcoded links in marketing materials
Option B: Redirect Old Links
If you have many links in circulation:
- Set up a redirect from your Firebase domain
- Redirect to equivalent Clippr links
- Gradually phase out old links
Step 6: Testing
- Test direct links: Click link with app installed
- Test deferred links: Uninstall, click link, install, open
- Test attribution: Verify campaign/source/medium data
- 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
Clippr ClipprLink
dart
// Clippr
link.path // String path
link.attribution // campaign, source, medium
link.metadata // Custom data
link.matchType // How it was matched
Timeline
- Now: Start migration, run both in parallel
- Before Aug 2025: Complete migration
- Aug 25, 2025: Firebase Dynamic Links shuts down