diff --git a/services/tunnelbroker/rust-notifications/src/fcm.rs b/services/tunnelbroker/rust-notifications/src/fcm.rs
--- a/services/tunnelbroker/rust-notifications/src/fcm.rs
+++ b/services/tunnelbroker/rust-notifications/src/fcm.rs
@@ -1,24 +1,48 @@
+use crate::ffi::fcm_status;
 use anyhow::{anyhow, Result};
-use fcm::{Client, MessageBuilder, NotificationBuilder};
+use fcm::{
+  response::ErrorReason::{InvalidRegistration, NotRegistered},
+  Client, MessageBuilder, NotificationBuilder,
+};
 
 pub async fn send_by_fcm_client(
   fcm_api_key: &str,
   device_registration_id: &str,
   message_title: &str,
   message_body: &str,
-) -> Result<u64> {
+) -> Result<fcm_status> {
   let client = Client::new();
   let mut notification_builder = NotificationBuilder::new();
   notification_builder.title(message_title);
   notification_builder.body(message_body);
-
   let notification = notification_builder.finalize();
+
   let mut message_builder =
     MessageBuilder::new(fcm_api_key, device_registration_id);
   message_builder.notification(notification);
+
   let result = client.send(message_builder.finalize()).await?;
-  match result.message_id {
-    Some(message_id) => Ok(message_id),
-    None => Err(anyhow!("FCM client returned an empty message id")),
+  match result.results {
+    Some(results) => {
+      if results.len() == 0 {
+        return Err(anyhow!("FCM client returned zero size results"));
+      }
+      if let Some(result_error) = results[0].error {
+        match result_error {
+          // We are returning `Ok` with the error types here to distinguish the exact
+          // error type in a C++ side
+          InvalidRegistration => return Ok(fcm_status::InvalidRegistration),
+          NotRegistered => return Ok(fcm_status::NotRegistered),
+          _ => {
+            return Err(anyhow!(
+              "Notification was not accepted by FCM, reason: {:?}",
+              result_error
+            ))
+          }
+        }
+      }
+    }
+    None => return Err(anyhow!("FCM client has no results set")),
   }
+  Ok(fcm_status::Ok)
 }
diff --git a/services/tunnelbroker/rust-notifications/src/lib.rs b/services/tunnelbroker/rust-notifications/src/lib.rs
--- a/services/tunnelbroker/rust-notifications/src/lib.rs
+++ b/services/tunnelbroker/rust-notifications/src/lib.rs
@@ -1,4 +1,4 @@
-use crate::ffi::apns_status;
+use crate::ffi::{apns_status, fcm_status};
 use anyhow::Result;
 use env_logger;
 use lazy_static::lazy_static;
@@ -15,6 +15,12 @@
     Unregistered,
     BadDeviceToken,
   }
+  #[cxx_name = "fcmReturnStatus"]
+  enum fcm_status {
+    Ok,
+    InvalidRegistration,
+    NotRegistered,
+  }
   extern "Rust" {
     #[cxx_name = "sendNotifToAPNS"]
     fn send_notif_to_apns(
@@ -32,7 +38,7 @@
       device_registration_id: &str,
       message_title: &str,
       message_body: &str,
-    ) -> Result<u64>;
+    ) -> Result<fcm_status>;
   }
 }
 
@@ -67,7 +73,7 @@
   device_registration_id: &str,
   message_title: &str,
   message_body: &str,
-) -> Result<u64> {
+) -> Result<fcm_status> {
   RUNTIME.block_on(fcm::send_by_fcm_client(
     fcm_api_key,
     device_registration_id,