Flutter Push Notifications Deep Dive: Custom Payloads
Sep 9, 2025



Summary
Summary
Summary
Summary
This tutorial covers configuring Firebase Cloud Messaging in Flutter, crafting custom notification payloads with `notification` and `data` keys, parsing messages in foreground, background, and terminated states, and implementing advanced actions using flutter_local_notifications. It emphasizes best practices, testing strategies, and platform-specific tips to build interactive and reliable push notification experiences.
This tutorial covers configuring Firebase Cloud Messaging in Flutter, crafting custom notification payloads with `notification` and `data` keys, parsing messages in foreground, background, and terminated states, and implementing advanced actions using flutter_local_notifications. It emphasizes best practices, testing strategies, and platform-specific tips to build interactive and reliable push notification experiences.
This tutorial covers configuring Firebase Cloud Messaging in Flutter, crafting custom notification payloads with `notification` and `data` keys, parsing messages in foreground, background, and terminated states, and implementing advanced actions using flutter_local_notifications. It emphasizes best practices, testing strategies, and platform-specific tips to build interactive and reliable push notification experiences.
This tutorial covers configuring Firebase Cloud Messaging in Flutter, crafting custom notification payloads with `notification` and `data` keys, parsing messages in foreground, background, and terminated states, and implementing advanced actions using flutter_local_notifications. It emphasizes best practices, testing strategies, and platform-specific tips to build interactive and reliable push notification experiences.
Key insights:
Key insights:
Key insights:
Key insights:
Setting Up Firebase Cloud Messaging: Initialize Firebase, request permissions, and handle background messages before launching the app.
Crafting Custom Payloads: Combine
notification
for UI anddata
for logic; use simple, flat key–value pairs.Parsing and Handling Payloads in Flutter: Listen to
onMessage
,onBackgroundMessage
, andgetInitialMessage()
to manage state transitions.Advanced Handling and Actions: Use flutter_local_notifications to add action buttons and rich media, handling user responses in callbacks.
Testing and Debugging: Emulate payloads via Firebase Console or Postman, monitor logs, and validate manifest entries and JSON structure.
Introduction
Push notifications are a core engagement tool in mobile development, and Flutter provides seamless integration via Firebase Cloud Messaging (FCM). Beyond simple alerts, custom payloads enable precise control over notification behavior and content. This deep dive explains how to configure FCM in Flutter, craft tailored payloads, parse custom data, and implement advanced handling strategies. Whether you aim to route users to specific screens or trigger background tasks, understanding payload structures and client-side logic is essential.
Setting Up Firebase Cloud Messaging
Begin by adding the firebase_messaging
package to your pubspec.yaml
. In Android, update AndroidManifest.xml
with the com.google.firebase.MESSAGING_EVENT
service, and for iOS, register for remote notifications in AppDelegate.swift
:
Run
flutter pub add firebase_messaging
.Initialize Firebase in
main.dart
beforerunApp()
:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
runApp(MyApp());
}
Request permission on iOS and obtain the device token:
await FirebaseMessaging.instance
.requestPermission(alert: true, badge: true, sound: true);
String? token = await FirebaseMessaging.instance.getToken();
Store this token on your backend to target devices individually.
Crafting Custom Payloads
Custom payloads consist of a notification
key for display properties and a data
key for application-specific fields. Example JSON from your server:
{
"to": "<DEVICE_TOKEN>",
"notification": {
"title": "New Order",
"body": "Tap to view order details"
},
"data": {
"type": "order_update",
"orderId": "12345",
"priority": "high"
}
}
Key points:
The
data
object is always delivered, even when the app is in the background.Stick to alphanumeric keys; avoid nested objects beyond one level to prevent serialization issues.
Use
click_action
on Android to define an intent filter when direct launching is required.
Parsing and Handling Payloads in Flutter
Listen for messages in various app states:
Foreground: Use
FirebaseMessaging.onMessage
.Background: Use
FirebaseMessaging.onBackgroundMessage
handler.Terminated: Fetch the initial message with
getInitialMessage()
.
Example parsing:
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
var data = message.data;
if (data['type'] == 'order_update') {
Navigator.pushNamed(context, '/orders',
arguments: data['orderId']);
}
});
Background handling must be a top-level function. Ensure long-running tasks adhere to platform limitations.
Advanced Handling and Actions
Custom payloads can include action identifiers. For Android, define action buttons in the notification builder on the native side. For iOS, configure UNNotificationAction
in AppDelegate:
Use the flutter_local_notifications
plugin to display rich media and action buttons post-receipt:
var androidDetails = AndroidNotificationDetails(
'channelId', 'channelName',
importance: Importance.max,
priority: Priority.high,
actions: [AndroidNotificationAction('MARK_READ', 'Mark as Read')]
);
await FlutterLocalNotificationsPlugin().show(
message.hashCode,
message.notification?.title,
message.notification?.body,
NotificationDetails(android: androidDetails)
);
Then listen for action taps:
FlutterLocalNotificationsPlugin()
.initialize(..., onDidReceiveNotificationResponse: (response) {
if (response.actionId == 'MARK_READ') {
// Call API to mark as read
}
});
Testing and Debugging
Emulate payloads using the Firebase Console for quick iterations or use curl
/Postman for full payload control. Check logs on Android Studio (Logcat
) and Xcode for errors or dropped messages. Common pitfalls:
Missing permissions or incorrect manifest entries.
Exceeding data size limits (4KB on iOS, 2KB on Android).
Invalid JSON in custom fields.
Logging message reception and data parsing helps pinpoint issues in various app states.
Vibe Studio

Vibe Studio, powered by Steve’s advanced AI agents, is a revolutionary no-code, conversational platform that empowers users to quickly and efficiently create full-stack Flutter applications integrated seamlessly with Firebase backend services. Ideal for solo founders, startups, and agile engineering teams, Vibe Studio allows users to visually manage and deploy Flutter apps, greatly accelerating the development process. The intuitive conversational interface simplifies complex development tasks, making app creation accessible even for non-coders.
Conclusion
Custom payloads transform simple notifications into interactive experiences. By structuring payloads correctly, initializing FCM, parsing data
fields, and integrating action handling via local notifications, you gain full control over notification-driven flows. Rigorously test in all app states and leverage platform-specific features for a polished user experience.
Introduction
Push notifications are a core engagement tool in mobile development, and Flutter provides seamless integration via Firebase Cloud Messaging (FCM). Beyond simple alerts, custom payloads enable precise control over notification behavior and content. This deep dive explains how to configure FCM in Flutter, craft tailored payloads, parse custom data, and implement advanced handling strategies. Whether you aim to route users to specific screens or trigger background tasks, understanding payload structures and client-side logic is essential.
Setting Up Firebase Cloud Messaging
Begin by adding the firebase_messaging
package to your pubspec.yaml
. In Android, update AndroidManifest.xml
with the com.google.firebase.MESSAGING_EVENT
service, and for iOS, register for remote notifications in AppDelegate.swift
:
Run
flutter pub add firebase_messaging
.Initialize Firebase in
main.dart
beforerunApp()
:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
runApp(MyApp());
}
Request permission on iOS and obtain the device token:
await FirebaseMessaging.instance
.requestPermission(alert: true, badge: true, sound: true);
String? token = await FirebaseMessaging.instance.getToken();
Store this token on your backend to target devices individually.
Crafting Custom Payloads
Custom payloads consist of a notification
key for display properties and a data
key for application-specific fields. Example JSON from your server:
{
"to": "<DEVICE_TOKEN>",
"notification": {
"title": "New Order",
"body": "Tap to view order details"
},
"data": {
"type": "order_update",
"orderId": "12345",
"priority": "high"
}
}
Key points:
The
data
object is always delivered, even when the app is in the background.Stick to alphanumeric keys; avoid nested objects beyond one level to prevent serialization issues.
Use
click_action
on Android to define an intent filter when direct launching is required.
Parsing and Handling Payloads in Flutter
Listen for messages in various app states:
Foreground: Use
FirebaseMessaging.onMessage
.Background: Use
FirebaseMessaging.onBackgroundMessage
handler.Terminated: Fetch the initial message with
getInitialMessage()
.
Example parsing:
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
var data = message.data;
if (data['type'] == 'order_update') {
Navigator.pushNamed(context, '/orders',
arguments: data['orderId']);
}
});
Background handling must be a top-level function. Ensure long-running tasks adhere to platform limitations.
Advanced Handling and Actions
Custom payloads can include action identifiers. For Android, define action buttons in the notification builder on the native side. For iOS, configure UNNotificationAction
in AppDelegate:
Use the flutter_local_notifications
plugin to display rich media and action buttons post-receipt:
var androidDetails = AndroidNotificationDetails(
'channelId', 'channelName',
importance: Importance.max,
priority: Priority.high,
actions: [AndroidNotificationAction('MARK_READ', 'Mark as Read')]
);
await FlutterLocalNotificationsPlugin().show(
message.hashCode,
message.notification?.title,
message.notification?.body,
NotificationDetails(android: androidDetails)
);
Then listen for action taps:
FlutterLocalNotificationsPlugin()
.initialize(..., onDidReceiveNotificationResponse: (response) {
if (response.actionId == 'MARK_READ') {
// Call API to mark as read
}
});
Testing and Debugging
Emulate payloads using the Firebase Console for quick iterations or use curl
/Postman for full payload control. Check logs on Android Studio (Logcat
) and Xcode for errors or dropped messages. Common pitfalls:
Missing permissions or incorrect manifest entries.
Exceeding data size limits (4KB on iOS, 2KB on Android).
Invalid JSON in custom fields.
Logging message reception and data parsing helps pinpoint issues in various app states.
Vibe Studio

Vibe Studio, powered by Steve’s advanced AI agents, is a revolutionary no-code, conversational platform that empowers users to quickly and efficiently create full-stack Flutter applications integrated seamlessly with Firebase backend services. Ideal for solo founders, startups, and agile engineering teams, Vibe Studio allows users to visually manage and deploy Flutter apps, greatly accelerating the development process. The intuitive conversational interface simplifies complex development tasks, making app creation accessible even for non-coders.
Conclusion
Custom payloads transform simple notifications into interactive experiences. By structuring payloads correctly, initializing FCM, parsing data
fields, and integrating action handling via local notifications, you gain full control over notification-driven flows. Rigorously test in all app states and leverage platform-specific features for a polished user experience.
Build Flutter Apps Faster with Vibe Studio
Build Flutter Apps Faster with Vibe Studio
Build Flutter Apps Faster with Vibe Studio
Build Flutter Apps Faster with Vibe Studio
Vibe Studio is your AI-powered Flutter development companion. Skip boilerplate, build in real-time, and deploy without hassle. Start creating apps at lightning speed with zero setup.
Vibe Studio is your AI-powered Flutter development companion. Skip boilerplate, build in real-time, and deploy without hassle. Start creating apps at lightning speed with zero setup.
Vibe Studio is your AI-powered Flutter development companion. Skip boilerplate, build in real-time, and deploy without hassle. Start creating apps at lightning speed with zero setup.
Vibe Studio is your AI-powered Flutter development companion. Skip boilerplate, build in real-time, and deploy without hassle. Start creating apps at lightning speed with zero setup.











