> This page is part of the [Customer.io documentation](https://docs.customer.io). For the complete index, see [llms.txt](https://docs.customer.io/llms.txt).
> Last updated: October 28, 2026
> To take actions in Customer.io from an agent, use the [Customer.io CLI](https://docs.customer.io/ai/cli/get-started.md) or the [MCP server](https://docs.customer.io/ai/mcp/get-started.md).

# Data, consent, and removal

See what data web push collects when a browser subscribes, who is responsible for consent, how people opt out, and how to turn web push off or remove it from your website.

Contact us to turn on web push

Web push is in alpha. If you don’t see a **Web** tab under [**Settings > Push**](https://fly.customer.io/env/last/settings/actions/push/web), contact us to turn it on for your account.

This page tells you what web push collects, where consent comes from, and how to undo each part of [setting up web push](https://docs.customer.io/messaging/channels/web-push/set-up/).

## What web push collects

Web push adds data from three places: your JavaScript source, the web push plugin, and the service worker.

**The JavaScript source.** The plugin works with the [JavaScript source](https://docs.customer.io/integrations/data-in/connections/javascript/js-source/) you already use, so the source’s usual data applies. That includes the page and `identify` calls your site sends, and the location that Customer.io derives from the IP address of those requests, which can appear on the person’s profile. Web push doesn’t change that.

**The web push plugin.** When a visitor allows notifications and your site has identified them, the plugin adds a web device to their profile with a **Device Created or Updated** event. The device has these fields:

Field

What it is

Device token

The browser’s push endpoint, an `https://` address that the browser’s push service issues.

`webpush_p256dh` and `webpush_auth`

The subscription’s encryption keys. Customer.io uses them to encrypt each notification for that browser. The product hides them.

`webpush_expiration_time`

When the browser’s push service says the subscription expires, if it gives one.

`user_agent`

The browser’s user agent string, from `navigator.userAgent`.

`browser`, `browser_version`, and `os`

The browser’s name, its major version, and its operating system, read from the browser. They’re deliberately coarse: no device model or full version.

`origin`

The website the browser subscribed on, like `https://www.yourbrand.com`. The product shows it as **Site**.

Loading the plugin never asks for permission or registers a new service worker. If the browser has no subscription, loading creates no device. If the browser is already subscribed and the person is identified, the plugin can add or update that browser’s device when the page loads or when you call `identify`, without another prompt. If a visitor subscribes before you identify them, Customer.io doesn’t add the device until you call `identify`. See [ask for permission in a click](https://docs.customer.io/messaging/channels/web-push/set-up/#subscribe-in-a-click).

**The service worker.** When the service worker shows a notification, it reports a *delivered* metric to your `trackUrl`. When someone clicks the notification, it reports an *opened* metric, and includes the button’s identifier if they clicked a button. Each report carries the delivery and device identifiers from the notification, and nothing about the visitor’s activity on your site. If a report fails, the service worker keeps it in the browser’s storage and sends it again later. See [set up the plugin](https://docs.customer.io/messaging/channels/web-push/set-up/#add-the-plugin) for `trackUrl`.

## Consent

The permission prompt belongs to the browser. It reads like “*your-site.com* wants to Show notifications,” with **Block** and **Allow**. Customer.io doesn’t change the wording and doesn’t show a prompt of its own. In the setup example, the browser asks after the visitor clicks your button. The plugin doesn’t check for a click, so call `subscribe()` only from an intentional user action, like that button. A subscription only exists if they choose **Allow**.

You are responsible for the consent that your audience gives, and for the privacy notice and legal basis that your own policies and local laws require. Customer.io doesn’t decide that for you, and this page isn’t legal advice. For background on how Customer.io handles personal data, see [Customer.io, GDPR, and you](https://docs.customer.io/accounts/security/gdpr-faq/).

Before you ask, explain in your own words what people get, like **Turn on booking alerts**, and show the button only to signed-in visitors.

## Opt out and unsubscribe

People can stop web push in these ways:

*   **In your page.** Call `cioanalytics.webPush.unsubscribe()` from a button, like the one in [step 4 of setup](https://docs.customer.io/messaging/channels/web-push/set-up/#subscribe-in-a-click). It unsubscribes the browser and removes the web device from the person’s profile.
*   **In the browser.** The visitor can block notifications for your site in their browser’s settings. See [notifications are blocked](https://docs.customer.io/messaging/channels/web-push/troubleshooting/#blocked).
*   **In the subscription center.** Web push follows the same [global unsubscribe and topic preferences](https://docs.customer.io/messaging/channels/subscriptions/overview/) as other push notifications. If your [subscription center](https://docs.customer.io/messaging/channels/subscriptions/center/) has a **Web browsers** channel, a Web Push action respects that channel, and every other push action respects the **Push** channel. A person can opt out of **Web browsers** without opting out of push to their phones, and the other way around. Without a **Web browsers** channel, the **Push** channel decides for web push as well. The channel only applies while web push is turned on for your account.

## Undo web push

Pick the scope that matches what you want to undo.

To…

Do this

What happens

**Turn web push off for your workspace**

Go to [**Settings > Push > Web**](https://fly.customer.io/env/last/settings/actions/push/web) and click **Disable…**.

Customer.io deletes your web push keys. Existing subscriptions stop working, and active Web Push messages fail until you [generate new keys](https://docs.customer.io/messaging/channels/web-push/set-up/#generate-keys) and your subscribers visit your site and subscribe again.

**Delete one device**

Open the person’s profile, go to **Devices**, select the web device, and delete it.

Customer.io stops sending to that device. The browser itself stays subscribed with its push service until the browser or your site unsubscribes it, and the plugin can add the device back the next time the person visits your site identified, for example after they clear site data, sign in as someone else, or update their browser. To stop for good, unsubscribe the browser in code, as in the next row.

**Unsubscribe a person in code**

Call `cioanalytics.webPush.unsubscribe()` in the person’s browser.

The browser unsubscribes and the device leaves the person’s profile. The service worker stays registered, and the person’s notification permission stays as it was.

**Remove web push from your website**

Remove the plugin from your page, then unregister the service worker (below).

Removing the snippet alone doesn’t unsubscribe visitors or remove the service worker.

### Remove web push from your website

The service worker and the browser’s subscription live in each visitor’s browser, so deleting the snippet and the `cio-webpush-sw.js` file from your server doesn’t remove them from browsers that already subscribed. To remove web push cleanly:

1.  Before you remove the plugin, have signed-in visitors’ browsers run `cioanalytics.webPush.unsubscribe()` if you can, for example from a button or a script that runs once for each visitor. This removes each browser’s device from its person’s profile.

2.  Remove the web push plugin from your pages, then the `cio-webpush-sw.js` file from your website.

3.  Unregister the Customer.io service worker in each browser. Run this on your site, in the page’s JavaScript console or in a script that you ship:

    ```
    (async () => {
      const registrations = await navigator.serviceWorker.getRegistrations();
      for (const registration of registrations) {
        // Match your `serviceWorkerUrl`, which defaults to /cio-webpush-sw.js.
        const worker = registration.active || registration.waiting || registration.installing;
        if (worker && new URL(worker.scriptURL).pathname.endsWith('cio-webpush-sw.js')) {
          await registration.unregister();
        }
      }
    })();
    ```

    If you use a different filename, match that path instead. If you import our worker into your own, unregister only if you also want to remove your worker.

4.  If you turned off web push for the whole workspace, click **Disable…** under **Settings > Push > Web**.

A visitor’s notification permission stays as **Allow** in their browser until they change it or clear the site’s data; unregistering the service worker doesn’t change it. Without a service worker and a device on a profile, Customer.io can’t send them notifications.

## When a send doesn’t arrive after someone blocks notifications

When a visitor blocks notifications after they subscribed, the browser deactivates their push subscription, as the [Push API permission section ↗](https://www.w3.org/TR/push-api/#permission) describes. Until the browser’s push service drops the subscription, a send to that browser can show **Sent** and never show **Delivered**, because the browser doesn’t show the notification and the service worker never reports it. That state doesn’t last. When the push service drops the subscription, the next send fails with `WEBPUSH_UNREGISTERED` and Customer.io removes the device from the person’s profile. See [failure reasons](https://docs.customer.io/messaging/channels/web-push/troubleshooting/#failure-reasons).

Allowing notifications again doesn’t bring the device back. The person needs to subscribe again on your site, so ask them to allow notifications and click your button again. See [troubleshooting](https://docs.customer.io/messaging/channels/web-push/troubleshooting/#blocked).
