> For the complete documentation index, see [llms.txt](https://docs.codemash.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.codemash.io/cloud/push/integrations/providers/firefox-web.md).

# Firefox Web Push

Connect Firefox Web Push as a Push integration provider.

> Deliver push notifications to people browsing your site in Firefox, even when the tab is closed.

*Last updated 2026-09-11 · Applies to any project with the Push module enabled*

## Why it exists

Web push is a browser standard: a page asks the user for permission, the browser hands back a subscription, and messages sent to that subscription arrive even when the tab is closed. A **VAPID key pair** — one public key, one private key — is what proves to the browser that every message comes from the same sender, which is you.

## When you'd use it

* An online shop tells a Firefox visitor that an item is back in stock.
* A web app warns the user that a background job has failed.
* A newsroom sends a breaking-news alert to readers who opted in.

## Where to find it

Push → Integrations → **Add New Integration** → Firefox Web Push · `/projects/<project>/push/integrations/new/firefox-web`

## Before you start

Requires a role that carries `…:notifications:push:settings:manage` — normally **Owner** or **Admin**. Collect these first:

* A site served over HTTPS with a service worker registered.
* A **VAPID key pair** — generate one with `npx web-push generate-vapid-keys` and keep both halves.
* A contact address for the optional subject field.

## How to connect it

1. Open **Push → Integrations → Add New Integration** and pick **Firefox Web Push**.
2. Fill the fields below. Create and edit use the same form; editing loads the saved values, but secrets are never shown back.
3. Click **Create**.
4. Open the saved integration and choose **Set as default** if this provider should be used when a template names none. Defaults are per environment.
5. Choose **Test**. One real notification is sent; confirm you received it with **I received the push** so the test is recorded as passed.

**What "working" looks like:** the integration is listed as **Enabled**, carries the **Default for \<environment>** badge if you set it, and its last test is recorded as successful.

## Fields

| Field                        | What it means                                                       | Example                      |
| ---------------------------- | ------------------------------------------------------------------- | ---------------------------- |
| **Integration Name**         | The name in your integrations list.                                 | `Firefox web push`           |
| **VAPID Public Key**         | The public half. Your page subscribes the user with the same value. | `BG…`                        |
| **VAPID Private Key**        | The private half. Server side only.                                 | `V…`                         |
| **VAPID Subject (optional)** | A contact address the push service can use if something goes wrong. | `mailto:admin@mycompany.com` |

## Good to know

* The public key on this page and the key your website subscribes with must be **the same**. Change the pair and every existing subscription stops working.
* Never ship the private key to the browser.
* Chrome, Firefox and Edge are separate integrations even when the key pair is shared — that is what lets you disable one browser without touching the others.
* A subscription belongs to one browser on one device. The same person on a laptop and a phone is two subscriptions.

## Do it in code

{% tabs %}
{% tab title="JavaScript / TypeScript" %}

```ts
await norbix.hub.notifications.savePushIntegration({
  projectId: '<your-project-id>',
  integration: {
    provider: 'FirefoxWeb',
    integrationName: 'Firefox web push',
    vapidPublicKey: 'BG…',
    vapidPrivateKey: 'V…',
    subject: 'mailto:admin@mycompany.com',
  },
});
```

{% endtab %}

{% tab title="Python" %}

```python
norbix.notifications.save_push_integration(
    projectId="<your-project-id>",
    integration={"provider": "FirefoxWeb", "integrationName": "Firefox web push"},
)
```

{% endtab %}

{% tab title="Go" %}

```go
var out map[string]any
err := c.Hub.Notifications.SavePushIntegration(ctx, map[string]any{
	"projectId":   "<your-project-id>",
	"integration": map[string]any{"provider": "FirefoxWeb", "integrationName": "Firefox web push"},
}, &out)
```

{% endtab %}

{% tab title=".NET" %}
Not available yet — the .NET SDK has no push client methods. Call the REST endpoint below.
{% endtab %}
{% endtabs %}

The Python and Go snippets are shortened — the remaining credential fields are the same keys shown in the TypeScript one and in the table above.

Reference: [Save Push Integration](/sdks-and-cli/notifications/push/save-push-integration.md) · [Test](/sdks-and-cli/notifications/push/test-push-integration.md) · [Set as default](/sdks-and-cli/notifications/push/set-push-integration-as-default.md) CLI: no integration commands today.

## API reference

Endpoints: [Save Push Integration](/api-reference/notifications/push/save-push-integration.md), [Test Push Integration](/api-reference/notifications/push/test-push-integration.md), [Confirm human delivery](/api-reference/notifications/push/confirm-push-integration-human-delivery.md), [Push](/api-reference/notifications/push.md).

## Related

[Providers](/cloud/push/integrations/providers.md) · [Integrations](/cloud/push/integrations.md) · [Templates](/cloud/push/templates.md)
