diff --git a/services/tunnelbroker/src/notifs/apns/mod.rs b/services/tunnelbroker/src/notifs/apns/mod.rs
--- a/services/tunnelbroker/src/notifs/apns/mod.rs
+++ b/services/tunnelbroker/src/notifs/apns/mod.rs
@@ -1,4 +1,4 @@
-use crate::constants::PUSH_SERVICE_REQUEST_TIMEOUT;
+use crate::constants::{error_types, PUSH_SERVICE_REQUEST_TIMEOUT};
 use crate::notifs::apns::config::APNsConfig;
 use crate::notifs::apns::error::Error::ResponseError;
 use crate::notifs::apns::headers::{NotificationHeaders, PushType};
@@ -8,7 +8,7 @@
 use reqwest::StatusCode;
 use serde::{Deserialize, Serialize};
 use std::time::Duration;
-use tracing::debug;
+use tracing::{debug, error};
 
 pub mod config;
 pub mod error;
@@ -132,6 +132,16 @@
       StatusCode::OK => Ok(()),
       _ => {
         let error_body: ErrorBody = response.json().await?;
+
+        if !error_body.reason.should_invalidate_token() {
+          error!(
+            errorType = error_types::APNS_ERROR,
+            "Failed sending APNs notification to: {}. Body: {}",
+            notif.device_token,
+            error_body,
+          );
+        }
+
         Err(ResponseError(error_body))
       }
     }
diff --git a/services/tunnelbroker/src/notifs/apns/response.rs b/services/tunnelbroker/src/notifs/apns/response.rs
--- a/services/tunnelbroker/src/notifs/apns/response.rs
+++ b/services/tunnelbroker/src/notifs/apns/response.rs
@@ -117,3 +117,14 @@
   /// The server is shutting down.
   Shutdown,
 }
+
+impl ErrorReason {
+  pub fn should_invalidate_token(&self) -> bool {
+    matches!(
+      self,
+      ErrorReason::BadDeviceToken
+        | ErrorReason::Unregistered
+        | ErrorReason::ExpiredToken
+    )
+  }
+}
diff --git a/services/tunnelbroker/src/websockets/session.rs b/services/tunnelbroker/src/websockets/session.rs
--- a/services/tunnelbroker/src/websockets/session.rs
+++ b/services/tunnelbroker/src/websockets/session.rs
@@ -34,8 +34,6 @@
 };
 use web_push::WebPushError;
 
-use crate::notifs::apns::response::ErrorReason;
-
 use crate::database::{self, DatabaseClient, MessageToDeviceExt};
 use crate::notifs::apns::headers::NotificationHeaders;
 use crate::notifs::apns::APNsNotif;
@@ -527,12 +525,7 @@
         if let Some(apns) = self.notif_client.apns.clone() {
           let response = apns.send(apns_notif).await;
           if let Err(apns::error::Error::ResponseError(body)) = &response {
-            if matches!(
-              body.reason,
-              ErrorReason::BadDeviceToken
-                | ErrorReason::Unregistered
-                | ErrorReason::ExpiredToken
-            ) {
+            if body.reason.should_invalidate_token() {
               if let Err(e) = self
                 .invalidate_device_token(notif.device_id, device_token.clone())
                 .await
@@ -671,6 +664,13 @@
                 "Error invalidating device token {}: {:?}", device_token, e
               );
             };
+          } else {
+            error!(
+              errorType = error_types::WEB_PUSH_ERROR,
+              "Failed sending Web Push notification to: {}. Error: {}",
+              device_token,
+              web_push_error
+            );
           }
         }
         Some(