> ## Documentation Index
> Fetch the complete documentation index at: https://docs.senderz.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Web push

> Self-hosted browser push notifications with per-endpoint subscriptions and automatic revocation.

Web push lets you reach subscribers in their browser — no app required. Senderz self-hosts push using the W3C Push API and platform VAPID keys; there's no third-party push vendor and no per-message carrier cost.

## How subscribers opt in

A visitor subscribes from a **popup** on your storefront. The popup's "Get browser notifications" element requests permission, registers a service worker, and stores the subscription.

<Info>
  The push service worker must be served same-origin to the storefront. It's
  proxied per platform: Shopify via the app proxy
  (`/apps/senderz/push-sw.js`), WooCommerce via the plugin
  (`/senderz-push-sw.js`). Konimbo has no same-origin static path in v1, so
  push renders inert there.
</Info>

## Per-endpoint model

Push consent is tracked **per browser endpoint** (a hash of the subscription URL), not per email or phone. A contact can subscribe from several browsers; revoking one doesn't affect the rest.

<CardGroup cols={2}>
  <Card title="Fan-out" icon="arrows-split-up-and-left">
    A push send fans out across every live subscription for the contact.
  </Card>

  <Card title="Auto-revoke" icon="trash">
    A provider `410 Gone` / `404` marks that one subscription revoked and
    suppresses its endpoint. If it was the contact's last live one, push
    consent drops to unsubscribed.
  </Card>
</CardGroup>

## Compliance & pipeline

Marketing push runs through the same gates as SMS **minus the wallet** — there's no per-message cost:

* per-endpoint suppression,
* push consent,
* frequency caps,
* Israeli quiet hours and Shabbat (marketing push is blocked the same way marketing SMS is).

## Templates & payload

Push templates carry a `title`, `body` and `url`. Payloads are capped at \~3,500 bytes and rejected before the network call if larger.

## Test sends

Send a test push to a specific contact from the contact's profile. Test sends still apply per-endpoint suppression; consent, caps and quiet hours are skipped because you're previewing your own content.

<Note>
  Silent endpoint rotation (`pushsubscriptionchange`) is handled lazily — the
  next send that returns `410` revokes the stale endpoint, and the visitor
  re-opts in via the popup next time it shows.
</Note>
