Most "how to migrate push notifications" articles end with the same shrug: push subscriptions are tied to the provider that issued them, so you'll have to rebuild your list. That's half-true. Tokens themselves are non-transferable, but the browser permission isn't. And the permission is what actually matters.

If you set things up right, every returning visitor flows into EasyPusher on their next page view — silently, with no prompt, no UI interruption, no extra click from them. This guide explains why that works, and walks through the exact settings you need to change in each major provider.

Why a silent migration works

When a visitor clicks "Allow" on a notification prompt, the browser stores that permission against the origin — your domain — not the SDK or vendor that asked for it. Any service worker on that origin can later call pushManager.subscribe() and get back a fresh subscription with no UI shown. Chrome, Firefox, Safari, and Edge all behave this way; it's defined in the Push API spec.

EasyPusher's SDK takes advantage of this. On every page load, it checks Notification.permission. If it's already "granted" and there's no EasyPusher subscription yet, it registers our service worker and calls pushManager.subscribe({ applicationServerKey: yourVapidKey }) in the background. The visitor sees nothing. We get a new subscription bound to your VAPID key.

The net effect: install EasyPusher, turn off the old provider's opt-in prompt, and your existing audience flows into EasyPusher the next time they visit. The only people you "lose" are subscribers who never come back — and they were dormant either way.

What you don't have to do:

  • Export a subscriber list (you can't — Web Push tokens are provider-bound).
  • Build a custom re-prompt flow.
  • Maintain a "have they migrated?" cookie or local-storage flag.
  • Pay both providers in perpetuity to avoid losing reach.

Step 1: Install EasyPusher alongside your current provider

You don't need to uninstall anything yet. Two push service workers can coexist on the same origin — the browser routes each push event to the subscription that owns it. The old SDK will keep delivering to its existing subscribers while EasyPusher quietly collects new ones.

How to install:

  • WordPress sites: install the EasyPusher plugin from the WordPress repo, paste your API key from the dashboard, save. Done.
  • Custom sites, Shopify, Webflow, anything else: upload ep-sw.js to your site root and paste a one-line snippet before </body>. Full instructions appear on your site's setup page in the EasyPusher dashboard.

Don't have an EasyPusher account yet? Sign up free — the free tier covers up to 20,000 notifications per month with no credit card.

Step 2: Turn off the old provider's opt-in prompt

This is the only step where the specifics matter. You want the old SDK to keep delivering to existing subscribers for now — just stop showing the prompt to new visitors, so they don't get caught on the old platform instead of EasyPusher.

OneSignal

Log into your OneSignal dashboard, pick your app, then:

  • Go to Settings → Web Configuration.
  • Edit your integration (Typical Setup, Custom Code, or WordPress).
  • In the prompt section, untick "Show prompt automatically" (or set Auto-prompt to off in newer dashboards).
  • Save.

If you trigger prompts manually with custom code, also remove the OneSignal.Slidedown.promptPush() calls in your JavaScript, or set autoPrompt: false in the OneSignal init options. Existing subscribers keep getting pushes; new visitors won't be invited to subscribe.

Webpushr

In your Webpushr dashboard:

  • Go to Settings → Web Push Settings → Opt-in Prompt.
  • Set Trigger to Disabled (or push the delay out to a value that never fires — 9999 seconds works).
  • Save.

Webpushr-collected subscribers stay reachable by Webpushr while they re-migrate, so leave the account active for ~30 days before cancelling.

PushEngage

In the PushEngage dashboard:

  • Go to Design → Opt-in Reminders (or Subscription Dialogbox depending on your account).
  • Toggle each active opt-in off.
  • Save.

If you'd rather kill everything in one shot, Settings → Site Settings has a site-wide pause that halts all new subscriptions.

Other providers (iZooto, WonderPush, PushMonkey, Jeeng, Pusher, custom SDKs)

The pattern is identical across providers: find wherever your existing SDK calls Notification.requestPermission() or pushManager.subscribe() on first visit, and disable that prompt. Settings are usually under "Opt-in", "Prompt", "Subscription Dialog", or similar. You're not removing the SDK yet — you're just stopping it from collecting new subscribers.

Step 3: Watch subscribers move over, then cancel the old provider

Open the EasyPusher dashboard and check the subscribers tab. Over the next few days, you should see the count climb as your returning audience hits any page on your site and gets silently re-subscribed. Most active sites see 60–80% of their old list migrate within the first week; the long tail comes in over the next two to three weeks.

We recommend waiting ~30 days before cancelling your old provider, for a few reasons:

  • Infrequent visitors (monthly newsletter readers, dormant account-holders) need at least one visit to re-subscribe. A 30-day window catches almost all of them.
  • You can still send time-sensitive campaigns through the old provider if EasyPusher hasn't picked up a subscriber yet.
  • It's a cheap insurance policy — most providers bill monthly anyway.

After the 30 days are up:

  • Remove the old SDK's snippet from your site (or deactivate the old WordPress plugin).
  • Delete the old service worker file (e.g. OneSignalSDKWorker.js, webpushr-sw.js, service-worker.js for PushEngage).
  • Cancel the paid subscription.

Pro tip — unregister the old service worker for cached browsers. Some browsers will keep a cached copy of the old SW for a while. Deploy a tiny replacement file at the old SW path containing:

self.addEventListener('install', () => self.skipWaiting());
self.addEventListener('activate', () => self.registration.unregister());

Next time the browser fetches it, the service worker uninstalls itself cleanly. After a week or two, you can delete the file entirely.


A few things to know

Subscribers who never visit don't migrate

Silent re-subscription happens on a page visit. If a visitor granted permission six months ago and hasn't been back since, they stay on the old provider until they return. That's the unavoidable trade-off — but it's the same long tail you'd face with any migration strategy, and these subscribers are usually low-value anyway.

VAPID keys are fixed for life

EasyPusher generates a unique VAPID key pair for each site you add, and we never regenerate them. Subscriptions collected today still work in five years. (Push subscriptions are bound to the public key the browser saw at subscribe time. Rotating VAPID keys silently invalidates every existing subscriber — so we make it impossible.)

You can run multiple opt-in prompts during the cutover if you want

If you'd rather move faster than the natural re-visit pace, you can leave EasyPusher's opt-in prompt enabled. Visitors who already granted permission won't see it (their re-subscription is silent regardless); only brand-new visitors will get prompted. The two paths don't conflict.

Need a key-level handoff?

If you previously imported your own VAPID keypair into the old provider and want to keep using those exact keys with EasyPusher — so the old provider's existing subscriptions transfer 1:1 with no re-subscribe step at all — we can do a manual cutover. Email [email protected] with your domain and we'll walk you through it.


Ready to switch?

Create a free EasyPusher account, add your site, follow the setup instructions, and turn off the old prompt. Most teams complete the cutover in under an hour and watch subscribers carry over for free.

Get Started Free More articles