Skip to content
Growth · 9 min read

Push notification deliverability: what really affects delivery

“Sent” doesn’t mean “seen”. Between your server and a screen sit push services, sleeping devices, OS settings and a service worker. Here’s what can go wrong and how to keep delivery healthy.

Updated By the Pusharoo team
In short
  • Expired subscriptions (HTTP 404/410 from the push service) must be removed — Pusharoo does it automatically.
  • Offline devices receive messages later only if the time-to-live (TTL) hasn’t run out.
  • OS settings — Focus, Do Not Disturb, battery savers — can hide or delay notifications you delivered correctly.
  • A broken or cached service worker is the most common self-inflicted delivery problem.

The delivery path

How a web push notification travelsYour website asks permission; the browser creates a subscription; Pusharoo stores it; when you send, Pusharoo hands an encrypted message to the browser vendor push service, which delivers it to the device even when your site is closed.🌐Your websitesw.js + one script tagasks🧭Visitor’s browsertaps Allow → subscriptionsaves🦘Pusharoostores endpoint, signs with VAPIDencrypts📡Browser push serviceGoogle · Mozilla · Apple · Microsoft🔔 Lands on their screendesktop, Android, iPhone Home Screen appYou do steps 1–2 once. Everything after“You hit Send” is automatic.How a web push notification travelsYour website asks permission; the browser creates a subscription; Pusharoo stores it; when you send, Pusharoo hands an encrypted message to the browser vendor push service, which delivers it to the device even when your site is closed.🌐Your websitesw.js + one script tagasks🧭Visitor’s browsertaps Allow → subscription🦘Pusharoostores it, signs with VAPID📡Browser push serviceGoogle · Mozilla · Apple🔔 Lands on their screen
The full journey of one notification. Only the first two boxes live on your site.

Your sender encrypts the message and posts it to the subscription’s push service (Google’s for Chrome, Mozilla’s for Firefox, Apple’s for Safari, Microsoft’s for Edge). The push service stores it until the device is reachable, then wakes the service worker, which shows the notification. Every step has its own failure mode.

Failure modes and fixes

What happensWhyFix
Push service returns 404 or 410Subscription expired: browser data cleared, browser uninstalled, permission revokedDelete it immediately; never retry. Automatic in Pusharoo.
Push service returns 429Too many requests too fastBack off and retry later
Accepted but never shownDevice offline beyond the TTLUse a longer TTL for evergreen content
Shown silently / not as a bannerFocus, Do Not Disturb, notification summaryNothing to fix server-side; it’s in the notification centre
Delayed on AndroidBattery optimisation on some brandsNormal; use higher urgency only for genuinely urgent messages
Never reaches the workerOld or broken sw.js, CDN caching, two workers competingServe sw.js uncached; one worker per scope

TTL and urgency

Every Web Push request carries a TTL header — how many seconds the push service should keep trying if the device is offline. A flash sale ending tonight deserves a short TTL so nobody gets it tomorrow; a new article can live for days. The optional Urgency header (very-low to high) lets devices save battery on low-priority messages. Both come from RFC 8030, covered in the Web Push protocol.

Service worker health

  • https://yoursite.com/sw.js opens and returns JavaScript (not an HTML error page).
  • It isn’t cached for long at your CDN — see Cloudflare notes in the docs.
  • Only one service worker controls the page; merge others with importScripts.
  • On Safari and iPhone, every push must show a notification or the subscription can be revoked.

Troubleshooting steps are in push notifications not working.

Stay on the right side of browser policies

Browsers act against abusive notifications — misleading permission requests, fake system alerts, phishing or malware. Chrome can switch an abusive site to quiet permission UI. Keep your prompt honest, your content genuine and your links pointing to your own site, and this never becomes a concern.

List hygiene

An honest subscriber count only includes people you can reach. Pusharoo removes subscriptions as soon as a push service reports them gone and purges them automatically, so “sent” reflects live browsers. If you migrate from a tool that counted every subscription ever collected, expect a smaller but more accurate number (switching providers).

Questions

What is a good push notification delivery rate?

Healthy lists see the vast majority of sends accepted by push services; the rest are mostly expired subscriptions that should be removed. Display rates are lower because devices are offline or in Focus modes.

Why did my subscriber count drop after a campaign?

Sending reveals expired subscriptions — the push service returns 404/410 and they are removed. That’s cleanup, not people unsubscribing because of your message.

Do web push notifications arrive when the browser is closed?

On Android and macOS/Windows, usually yes while the OS keeps the browser’s background process alive; Chrome on desktop may need to be running in the background. Messages wait at the push service until the TTL expires.

Do push services filter spam like email?

Not in the same way, but browsers quiet prompts for sites many users block, and users can block or silence you instantly. Relevance is your deliverability.

Why are some notifications delayed?

Offline devices, battery savers, Doze on Android and low urgency settings can delay delivery until the device wakes or reconnects.

More in Growth: The push opt-in prompt, done right · Push notifications for online stores · Push notification opt-in rate: measure it, then raise it · Push notification analytics that actually answer questions · How to get more push notification subscribers · Switching web push providers: a practical migration plan · Win-back push notifications that bring people back · Push notifications vs. pop-ups · All guides

Free for life. No limits.

Unlimited subscribers, campaigns and automations. No badges. About five minutes to install.