Firebase Dynamic Links sunset
Google is sunsetting Firebase Dynamic Links in favor of Google Play Instant. If you're using FDL for deferred deep linking, install attribution, or link shortening, Redirectly is a direct replacement. You can keep using Firebase for authentication, Firestore, Cloud Storage, and Analytics—just swap the deep linking layer to Redirectly.
What's changing
- Firebase Dynamic Links (FDL): Sunsetting, no new features
- Google Play Instant: Replacement, but different use case (instant apps, not deep linking)
- Impact: Existing FDL links stop working after sunset date
- Action needed: Migrate to a new deep linking solution before sunset
Why choose Redirectly
- Pure focus: Deep linking is our only job, we do it well
- Transparent pricing: $0–$80/month, no enterprise sales
- Works with Firebase: Use both together seamlessly
- Better SDKs: Pure Dart for Flutter, no native code
Using Redirectly + Firebase together
Redirectly and Firebase serve different purposes. Keep Firebase for what it's great at—and use Redirectly for pure deep linking.
Architecture diagram
User clicks link
↓ Redirectly URL (myapp.redirectly.app/...)
Redirectly resolves
↓ Gets initial deep link parameters, tracks install
App opens with deep link
↓ App navigates to correct screen
Your app (using Firebase)
↓ Firebase Auth, Firestore, Analytics
What to use where
Redirectly handles
- Deep link URLs
- Deferred deep linking
- Install attribution
- Link shortening
- Campaign attribution
Firebase keeps handling
- User authentication
- Database (Firestore)
- Cloud Storage
- Analytics events
- Cloud Functions
Migrate from Firebase Dynamic Links
If you're currently using Firebase Dynamic Links, migration to Redirectly is straightforward.
// OLD: Firebase Dynamic Links
import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'
Future<String> createFDL(String deepLink) async {
final parameters = DynamicLinkParameters(
uriPrefix: 'https://myapp.page.link',
link: Uri.parse('https://myapp.com/product/123'),
androidParameters: AndroidParameters(
packageName: 'com.example.myapp',
),
iosParameters: IosParameters(
bundleId: 'com.example.myapp',
),
)
final link = await FirebaseDynamicLinks.instance.buildLink(parameters)
return link.shortUrl.toString()
}
// NEW: Redirectly
import 'package:redirectly/redirectly.dart'
Future<String> createRedirectlyLink(String path) async {
final link = await Redirectly.createLink(
path: path,
params: {
'campaign': 'summer_2024',
'source': 'email',
},
)
return link
}
// Usage is simpler!
// FDL: Complex setup with Firebase configuration
// Redirectly: One API call, transparent pricing, no Firebase dependency
The key differences:
1. No Firebase dependency required
You can use Redirectly independently. Keep Firebase for auth and database, use Redirectly only for deep linking.
2. Simpler API
FDL requires complex DynamicLinkParameters setup. Redirectly just needs a path and optional parameters.
3. Easier link handling
Both listen for deep links in the same way, so updating your deep link handler is minimal.
4. No vendor lock-in
Redirectly uses standard URL schemes. If you ever switch services, you just update your domain.
Keep using Firebase services
Your Firebase setup stays exactly the same. You're just replacing the deep linking layer.
// lib/services/app_service.dart
import 'package:firebase_auth/firebase_auth.dart'
import 'package:cloud_firestore/cloud_firestore.dart'
import 'package:redirectly/redirectly.dart'
class AppService {
final auth = FirebaseAuth.instance
final firestore = FirebaseFirestore.instance
Future<void> initialize() async {
// Firebase still handles auth
if (auth.currentUser != null) {
print('User logged in: ${auth.currentUser!.email}')
}
// Redirectly handles deep linking
await Redirectly.initialize(apiKey: 'your_key')
// Listen for deep links
Redirectly.onDeepLink.listen((link) {
if (link.path == 'product/123') {
// Still use Firestore to load product
final doc = await firestore
.collection('products')
.doc('123')
.get()
// Navigate with product data
navigateTo('/product', arguments: doc.data())
}
})
}
Future<void> createProductLink(String productId) async {
// Use Redirectly to create shareable link
final link = await Redirectly.createLink(
path: 'product/$productId',
params: {'campaign': 'share'},
)
// Then share or send via Firebase Cloud Messaging
await sendShareLink(link)
}
Future<void> sendShareLink(String link) async {
// Still use Firebase Cloud Messaging for push notifications
// Or any other Firebase service
}
}
FDL vs Redirectly comparison
| Feature | FDL | Redirectly |
|---|---|---|
| Deep linking | Yes | Yes |
| Deferred deep linking | Yes | Yes |
| Install attribution | Yes | Yes |
| Still active/maintained | No | Yes |
| Simple API | No | Yes |
| Transparent pricing | No | Yes |
| Free tier | No | Yes |
| Pure Flutter/Dart SDK | No | Yes |
| Works without Firebase | No | Yes |
| Custom subdomains | Yes | Yes |
| Real-time analytics | Yes | Yes |
Next steps
Migrate from Firebase Dynamic Links to Redirectly: