diff --git a/services/tunnelbroker/src/config.rs b/services/tunnelbroker/src/config.rs
--- a/services/tunnelbroker/src/config.rs
+++ b/services/tunnelbroker/src/config.rs
@@ -1,6 +1,7 @@
 use crate::constants;
-use crate::constants::ENV_APNS_CONFIG;
+use crate::constants::{ENV_APNS_CONFIG, ENV_FCM_CONFIG};
 use crate::notifs::apns::config::APNsConfig;
+use crate::notifs::fcm::config::FCMConfig;
 use anyhow::{ensure, Result};
 use clap::Parser;
 use comm_lib::aws;
@@ -32,6 +33,10 @@
   #[arg(env = ENV_APNS_CONFIG)]
   #[arg(long)]
   pub apns_config: Option<APNsConfig>,
+  /// FCM secrets
+  #[arg(env = ENV_FCM_CONFIG)]
+  #[arg(long)]
+  pub fcm_config: Option<FCMConfig>,
 }
 
 /// Stores configuration parsed from command-line arguments
diff --git a/services/tunnelbroker/src/main.rs b/services/tunnelbroker/src/main.rs
--- a/services/tunnelbroker/src/main.rs
+++ b/services/tunnelbroker/src/main.rs
@@ -8,8 +8,6 @@
 pub mod notifs;
 pub mod websockets;
 
-use crate::constants::ENV_APNS_CONFIG;
-use crate::notifs::apns::config::APNsConfig;
 use crate::notifs::apns::APNsClient;
 use crate::notifs::NotifClient;
 use anyhow::{anyhow, Result};
@@ -53,7 +51,9 @@
     }
   };
 
-  let notif_client = NotifClient { apns };
+  let fcm_config = CONFIG.fcm_config.clone();
+
+  let notif_client = NotifClient { apns, fcm: None };
 
   let grpc_server = grpc::run_server(db_client.clone(), &amqp_connection);
   let websocket_server = websockets::run_server(
diff --git a/services/tunnelbroker/src/notifs/fcm/config.rs b/services/tunnelbroker/src/notifs/fcm/config.rs
new file mode 100644
--- /dev/null
+++ b/services/tunnelbroker/src/notifs/fcm/config.rs
@@ -0,0 +1,23 @@
+use serde::{Deserialize, Serialize};
+use std::str::FromStr;
+
+#[derive(clap::Args, Clone, Debug, Deserialize, Serialize)]
+pub struct FCMConfig {
+  pub account_type: String,
+  pub project_id: String,
+  pub private_key_id: String,
+  pub private_key: String,
+  pub client_email: String,
+  pub client_id: String,
+  pub auth_uri: String,
+  pub token_uri: String,
+  pub auth_provider_x509_cert_url: String,
+  pub client_x509_cert_url: String,
+}
+
+impl FromStr for FCMConfig {
+  type Err = serde_json::Error;
+  fn from_str(s: &str) -> Result<Self, Self::Err> {
+    serde_json::from_str(s)
+  }
+}
diff --git a/services/tunnelbroker/src/notifs/fcm/mod.rs b/services/tunnelbroker/src/notifs/fcm/mod.rs
new file mode 100644
--- /dev/null
+++ b/services/tunnelbroker/src/notifs/fcm/mod.rs
@@ -0,0 +1,6 @@
+pub mod config;
+
+#[derive(Clone)]
+pub struct FCMClient {
+  http2_client: reqwest::Client,
+}
diff --git a/services/tunnelbroker/src/notifs/mod.rs b/services/tunnelbroker/src/notifs/mod.rs
--- a/services/tunnelbroker/src/notifs/mod.rs
+++ b/services/tunnelbroker/src/notifs/mod.rs
@@ -1,8 +1,11 @@
 use crate::notifs::apns::APNsClient;
+use crate::notifs::fcm::FCMClient;
 
 pub mod apns;
+pub mod fcm;
 
 #[derive(Clone)]
 pub struct NotifClient {
   pub(crate) apns: Option<APNsClient>,
+  pub(crate) fcm: Option<FCMClient>,
 }