Insights 11 min read

FlutterFlow Push Notifications & Deep Links: Why They Break and How to Fix Them

By Betsy Herrera
March 4, 2026
Share this insight

The Push Notification Problem in FlutterFlow

Push notifications are the most requested - and most broken - feature in FlutterFlow apps. The setup appears straightforward: enable Firebase Cloud Messaging, configure APNs for iOS, and trigger notifications from Cloud Functions. In practice, there are at least 8 places where this chain silently breaks.

Deep links compound the problem. You want tapping a notification to open a specific page in your app. Instead, you get a blank screen, a crash, or the home page. These are debug-resistant issues because they only occur on physical devices, never in the FlutterFlow test mode.

Push Notification Setup That Actually Works

Step 1: FCM Configuration

In FlutterFlow → Settings → Push Notifications → Enable. This auto-configures most settings, but you must manually:

  • Upload your APNs Authentication Key (.p8) from Apple Developer Portal
  • Enter your Apple Team ID and Key ID
  • Test on a physical device - push does NOT work in FlutterFlow's test mode or iOS simulator

Step 2: Request Permission Properly

iOS requires explicit user permission for push. FlutterFlow auto-requests on first launch, but best practice is to delay the request until a meaningful moment (e.g., after onboarding). Use a Custom Action to call FirebaseMessaging.instance.requestPermission() at the right time.

Step 3: Store FCM Tokens

The FCM token changes when the user reinstalls the app, clears data, or restores from backup. You MUST handle token refresh:

FirebaseMessaging.instance.onTokenRefresh.listen((newToken) {
  // Update the user's document in Firestore
  FirebaseFirestore.instance.collection('users')
    .doc(currentUser.uid)
    .update({'fcmToken': newToken});
});

The 6 Most Common Push Failures

1. Notifications Work on Android, Not iOS

Cause: Missing APNs configuration. Unlike Android (which uses FCM directly), iOS requires an additional Apple Push Notification service layer. Without a valid .p8 key or .p12 certificate, iOS push silently fails.

Fix: Apple Developer → Certificates → Keys → Create New Key → Enable "Apple Push Notifications service (APNs)". Upload the .p8 file to Firebase Console → Project Settings → Cloud Messaging → Apple app configuration.

2. Notifications Stop After a Few Days

Cause: FCM token expiration. If you stored the token at registration and never updated it, the token goes stale. Also, if the user hasn't opened the app in 2+ months, the token may be invalidated by FCM.

Fix: Implement onTokenRefresh listener (shown above). Also refresh the token on every app launch by calling getToken() and comparing with the stored value.

3. Deep Link Opens Wrong Page

Cause: FlutterFlow's deep link configuration requires exact route matching. If your notification payload specifies /chatPage?chatId=123 but your FlutterFlow route is /chat-page, the deep link fails silently and opens the home page.

Fix: In FlutterFlow, check the exact route name for each page (Settings → Route Settings). Use that exact route in your notification payload. For active parameters, use the format /pageName?paramName=value.

4. App Crashes on Notification Tap (Cold Start)

Cause: When the app is killed and the user taps a notification, FlutterFlow attempts to navigate to the deep link page before the app is fully initialized. If that page requires auth state or Firestore data, it crashes.

Fix: Add a splash/loading screen that checks initialization before navigating. In your initial notification handler, delay navigation by 2-3 seconds to allow Firebase Auth and Firestore to initialize.

5. Duplicate Notifications

Cause: Multiple FCM tokens stored for the same user (from different devices or app reinstalls). Your Cloud Function sends to ALL stored tokens, including stale ones.

Fix: Store only ONE token per user, or store tokens in an array and clean up stale tokens. When sending, handle the messaging/registration-token-not-registered error by removing the invalid token from Firestore.

6. Notification Payload Data Not Accessible

Cause: Firebase distinguishes between "notification" messages (shown automatically by the OS) and "data" messages (handled by the app). FlutterFlow primarily uses notification messages, which means custom data in the payload may not be accessible when the app is in the background.

Fix: Send data-only messages from your Cloud Function by omitting the notification key and putting everything in the data key. Then handle display via a Custom Action using FlutterLocalNotificationsPlugin.

When to Hire an Expert

Push notifications and deep links in FlutterFlow require device-level testing, Cloud Functions expertise, and platform-specific configuration that the visual builder can't manage. Rehost builds production-grade notification systems for FlutterFlow apps - with segmentation, scheduling, and rich media. Get Expert Rescue →

FAQ

Why don't push notifications work in FlutterFlow test mode?

Push notifications require platform-specific configuration (APNs for iOS, FCM for Android) that only exists on physical devices. FlutterFlow's test mode runs in a web browser which doesn't support push. Always test on a physical device with a published build.

How do I send push notifications to specific users in FlutterFlow?

Store each user's FCM token in their Firestore document. In your Cloud Function, query for the target user's token and send via admin.messaging().send(). For group notifications, query multiple tokens and use admin.messaging().sendMulticast().

Can I schedule push notifications in FlutterFlow?

Not natively. Use Firebase Cloud Functions with a scheduled trigger (pub/sub cron) or a service like OneSignal for scheduled and recurring notifications. Store notification schedules in Firestore and process them via a Cloud Function that runs every minute.

Let us handle it.

Do-It-For-Me

Stop debugging platform limitations. Hand off your application to certified experts. We provide dedicated engineering, ongoing maintenance, and guaranteed SLAs at a set cost basis of $850/month for business and startup applications. Transparent timelines, zero hidden fees.

Simple contract · Cancel anytime

Share this article

Build with us.

Turn insights into action. Let's build something great together.