diff --git a/server-plugins/notification-resources/src/index.ts b/server-plugins/notification-resources/src/index.ts
index 42b48c936e..20b78adcbd 100644
--- a/server-plugins/notification-resources/src/index.ts
+++ b/server-plugins/notification-resources/src/index.ts
@@ -38,6 +38,7 @@ import core, {
   generateId,
   MeasureContext,
   MixinUpdate,
+  RateLimiter,
   Ref,
   RefTo,
   SortingOrder,
@@ -602,9 +603,12 @@ export async function createPushNotification (
   }
 
   webpush.setVapidDetails(subject, publicKey, privateKey)
+  const limiter = new RateLimiter(5)
 
   for (const subscription of userSubscriptions) {
-    void sendPushToSubscription(control, target, subscription, data)
+    await limiter.exec(async () => {
+      await sendPushToSubscription(control, target, subscription, data)
+    })
   }
 }
 
@@ -621,7 +625,7 @@ async function sendPushToSubscription (
   } catch (err) {
     control.ctx.info('Cannot send push notification to', { user: targetUser, err })
     if (err instanceof WebPushError) {
-      if (errorMessages.some((p) => (err as WebPushError).body.includes(p))) {
+      if (errorMessages.some((p) => JSON.stringify((err as WebPushError).body).includes(p))) {
         const tx = control.txFactory.createTxRemoveDoc(subscription._class, subscription.space, subscription._id)
         await control.apply(control.ctx, [tx])
       }