Notification-only message
A message with only a notification block. When the app is in the background or closed, the operating system displays it automatically — your app code does not run until the user taps it. When the app is in the foreground, most platforms do not auto-display it; your app must handle the message and show its own UI.
Data-only message
A message with only a data block and no notification block. FCM never generates any notification UI for this — your app always receives it and decides what to do, whether it is in the foreground, background, or not running. This is the right shape for silent sync, badge updates, or notifications your app wants to build and style itself.
Notification + data message
Both blocks together. The OS displays the notification part automatically when the app is backgrounded, and the data payload is available once the user taps it and the app opens, commonly used to deep-link to a specific screen.
Foreground vs background behavior
This is the detail that catches most people testing FCM for the first time: a notification message that displays perfectly when the app is backgrounded may not show anything when the app is open, because the client SDK delivers it to app code instead of the system tray. If a test send appears to do nothing, check whether the receiving app was in the foreground.
Test each type
Switch to Advanced payload in the FCM notification tester and pick the "Data only" template to see a pure data message, or "Notification + data" to see the combined shape — both are ready-made and editable.