Skip to main content

Push notifications

Push notifications reach contacts on their devices even when they are not reading email. Sequenzy sends three kinds of push from one place: Push is included in every plan. Sending a push does not use email credits. A device receives push only after the person allowed notifications in their browser or in your app. Each allowed browser or app install is a device linked to a contact. Push is independent of email: a contact who unsubscribed from email still receives push on their devices, and a contact with no email address can still be reached. A device stops receiving push when:
  • The person unsubscribes the browser or you unregister the device.
  • The push service reports the token as expired or uninstalled. Sequenzy marks the device invalid automatically.
  • The contact is signed out on a shared browser (see Linking browsers to contacts).

Web push

Set it up with an AI coding tool

In Settings -> Push -> Web, choose Copy prompt. The prompt contains your site key, the service worker file, the subscribe button and the sign-in steps, with your values filled in. Paste it into Cursor, Claude Code, or Codex, or send it to your developer. The iOS and Android tabs have the same button for your apps.

1. Turn on web push

Go to Settings -> Push -> Web and turn on web push. Sequenzy generates your workspace’s VAPID keys. If you have no web tracking key yet and your company website is set, Sequenzy also creates a site key allowed for that website (and its www or apex twin), so the snippet is ready to paste. Turning web push on through the API, CLI, or MCP does the same and returns the key and snippet. Turning web push off later keeps the keys, so existing subscribers keep working when you turn it back on. Notifications use your company logo as the icon. Change it under Notification icon if you want a different one.

2. Install the tracking snippet

Push uses the same browser SDK and publishable key as web tracking. If the snippet is already on your site, skip this step.

3. Add the service worker file

Browsers only run service workers from the site that asks for permission. Serve a file at /sequenzy-sw.js on your domain containing:
The settings page has a Download sequenzy-sw.js button. Put the file in the folder served from your site root, such as public/ in Next.js, Vite, Astro, or Nuxt. The file never needs updating: the hosted worker shows Sequenzy notifications, reports when they are displayed and clicked, and opens the link. It ignores pushes from other senders. If your site already has a service worker at its root (for example a PWA or Workbox setup), add the importScripts line to that worker instead of serving /sequenzy-sw.js. A site has one service worker per scope, so the SDK subscribes through the worker that already controls your pages, and pushes arrive there.

4. Add a subscribe button

Browsers block permission prompts that the visitor did not trigger, and a declined prompt cannot be shown again. Add a button with the data-sequenzy-push attribute:
No script is needed. Once the SDK loads, it shows the button only in browsers that can subscribe, asks for permission when it is clicked, and hides it again once the browser is subscribed, blocked, or web push is off. Buttons rendered later by a single-page app work too. To build your own flow instead, call subscribeToPush() from a click. The tracking snippet loads the SDK asynchronously, so push methods only work after the page’s load event:
With a bundler:
isPushSupported() and getPushPermission() let you decide whether to show the button at all. Pass { serviceWorkerPath: "/path/to/sw.js" } if your worker lives somewhere other than /sequenzy-sw.js.

Linking browsers to contacts

A browser that subscribes before the visitor signs in is anonymous and does not receive campaigns yet. When your site calls sequenzy.identify(email, identityToken) (see web tracking), the SDK re-registers the subscription with that identity and the device is linked to the contact. The SDK also refreshes the registration once a day and whenever the browser’s push endpoint changes. When a visitor signs out, call sequenzy.reset(). The SDK unregisters the browser and drops the contact link, so the next person on a shared computer does not receive the previous person’s notifications.

iOS and Android apps

Credentials

In the iOS and Android tabs of Settings -> Push, Copy prompt gives your AI coding tool or developer the app-side steps below with your bundle ID or Firebase project filled in. Then add credentials:
  • iOS: upload the .p8 auth key from Apple Developer (Keys, with Apple Push Notifications service enabled) and enter the key ID, team ID, and bundle ID. Choose Sandbox for Xcode development builds and Production for App Store and TestFlight builds.
  • Android: upload the service account JSON from Firebase project settings (Service accounts, Generate new private key). The account needs the Firebase Cloud Messaging API Admin role.
Keys are encrypted and never shown again. If Apple or Google rejects them, the settings page shows the error until a send succeeds or you replace the key.

Register device tokens

Your app gets a token from APNs or Firebase Messaging. Send it to your backend and register it with Register a push device:
Register the token again whenever the app receives a new one; the same token is updated rather than duplicated, and moves to the contact you pass. When a person signs out of your app, call Unsubscribe a push device. Each contact keeps up to 20 active devices; older ones are retired automatically.

What your app receives

Each notification carries a sequenzy object: in the APNs payload next to aps, and as string fields in the FCM data map.
  • Open url when the person taps the notification. It can be an https link or one of your app’s deep links.
  • iOS shows images only through a Notification Service Extension that downloads imageUrl. Sequenzy sets mutable-content whenever an image is present.
  • To report opens, POST to eventsUrl from the app:
Use "type": "delivered" from a Notification Service Extension (iOS) or when your Android app handles the message, to count displays. The token authenticates the report, so no API key belongs in your app.

Writing a push

Merge tags work in the title, message, and link, for example Hi {{FIRST_NAME|there}}. If a merged message grows past the 4 KB limit push services accept, Sequenzy shortens the message rather than failing the send.

Push campaigns

Open Campaigns, switch to Push, and choose New Push Campaign. Write the notification, pick the audience, then send now or schedule it. Only contacts with an active device on a selected platform receive the campaign; the recipients step shows how many that is. The audience is re-evaluated when delivery starts, so contacts who subscribe before a scheduled send are included. A contact receives one notification per active device. If a push service is temporarily unavailable, Sequenzy retries only the devices that have not accepted the message yet.

Segments

Push filters appear in the segment builder once any platform is set up: pushDevice (has an active device, on any platform or a specific one) and pushSent, pushDelivered, and pushClicked with a time window such as 30d or all. For example, combine pushDevice is ios with pushClicked is_not 30d to find iOS users who stopped opening your notifications. See segment filters.

Push steps in sequences

Add a Send Push step anywhere in a sequence. If the contact has no active device, the step is skipped by default; set If the contact has no push device to Exit the sequence to stop the journey instead. A workspace without push set up always skips the step, so a missing key never exits contacts in bulk.

Stats

Test sends are excluded from stats and from contact activity.

Test sends

Settings -> Push -> Send a test push sends to one device or to every device of a contact. You can send 200 test pushes per workspace in a rolling 24 hours.

API, CLI, and MCP

Everything in the dashboard is also available programmatically:
  • API: push settings, web, iOS, and Android credentials, devices, test sends, and push campaigns. Sequence steps use type: "push" in Create a sequence.
  • CLI: sequenzy push settings, push web --enable, push ios set, push android set, push devices list|register|remove, push send-test, and push campaigns estimate|create|update|send|cancel|stats.
  • MCP: get_push_settings, register_push_device, send_test_push, create_push_campaign, send_push_campaign, and the other push tools listed in MCP.
Push campaign scopes reuse the campaign API key scopes (campaigns:read, campaigns:write, campaigns:send); test sends need campaigns:send; devices use subscribers:read and subscribers:write; reading push settings needs account:read and changing credentials needs integrations:manage.

Browser endpoints

The web SDK calls these public endpoints with your publishable key and the allowed origins configured on it. You only need them if you build your own subscription flow: Send bodies as JSON with Content-Type: text/plain to avoid a CORS preflight.

Troubleshooting

  • Nobody is eligible: check Settings -> Push for device counts. Browsers that subscribed before sign-in stay anonymous until your site calls identify.
  • iOS sends fail with “Key rejected”: the key ID, team ID, bundle ID, or environment does not match the app build. Development builds need Sandbox.
  • Android sends fail with “Key rejected”: the service account is missing the Firebase Cloud Messaging API Admin role, or the key was deleted in Google Cloud.
  • A browser never prompts: subscribeToPush() must run from a click, the page must be https, and the visitor must not have blocked notifications for your site.