Quickstart: web push in ~10 minutes

By the end of this page a real notification from your Notibase app will land on your own screen. Web push first because it needs no app store, mobile is a credential upload away (Android, iOS, Flutter, React Native).

Push is not the only channel. Email and SMS go through your own mail server and your own gateway, and are addressed to a person rather than a device — so they reach people who never installed anything, which is most of a list migrated from somewhere else.

1 · Create an app & keys

Sign in at the dashboard (GitHub or Google), create an organization and an app, then in Setup:

Generate VAPID keysNotibase manages web-push crypto per app. You never touch it.
Mint a client key ck_live_…Ships in your frontend. It can register devices and track events. It cannot send or read. Public by design.
Mint a server key sk_live_…Full power. Server-side only, treated like a password. Shown once.

2 · Serve the service worker

Put this file at https://yoursite.com/sw.js (root path matters for scope):

importScripts("https://api.notibase.com/sdk/sw.js");

Notibase hosts the worker logic, so fixes reach you without redeploys.

3 · Subscribe the browser

<script src="https://api.notibase.com/sdk/notibase.js" defer></script>
<script>
  window.notibaseDeferred = window.notibaseDeferred || [];
  notibaseDeferred.push(function (nb) {
    nb.init({ clientKey: "ck_live_..." });   // the PUBLIC key
  });
</script>

No VAPID key in your page. That comes from your app's configuration. Prefer npm? new Notibase({ clientKey }) then await nb.init().

By default the SDK shows its own soft prompt first and only asks the browser once the visitor agrees, browsers punish sites that fire the native permission dialog on load, and a block is permanent. Style, copy and timing are yours to set in Web configuration.

4 · Identify the user (recommended)

On your server, sign the user id; in the browser, attach it:

// server (Node):
import { signIdentify } from "@notibase/node";
const signature = signIdentify(process.env.NOTIBASE_IDENTIFY_SECRET, user.id);

// browser:
await nb.identify(user.id, { signature, attributes: { plan: "pro" } });

Generate the identify secret in Setup → Identity verification. Why this matters →

5 · Send

curl -X POST https://api.notibase.com/v1/messages \
  -H "authorization: Bearer sk_live_..." \
  -H "content-type: application/json" \
  -H "idempotency-key: first-send-1" \
  -d '{"audience": {"all": true},
       "content": {"title": "Hello {{first_name | default: 'there'}} 👋",
                    "body": "Sent through your own Notibase.",
                    "url": "https://yoursite.com"}}'

The response includes a message id and a delivery report. Pull the per-device timeline, with the raw push-service response, any time:

curl https://api.notibase.com/v1/messages/<id>/deliveries \
  -H "authorization: Bearer sk_live_..."

Where next

Node SDKTyped client, idempotent by default, every channel.
User attributesWhat to send for name, email, phone, gender, country — and what we store.
Audience filtersTarget by country, attributes, activity, with live counts.
AndroidKotlin SDK, Firebase setup, automatic click tracking.
iOSSwift SDK, APNs .p8 setup, click tracking.
FlutterPure-Dart SDK beside firebase_messaging.
React NativePure-TypeScript SDK beside expo-notifications or react-native-firebase. No native module, so nothing to link.
Firebase (FCM)Full project setup, service-account key, FCM error reference.
EmailYour own SMTP server, senders, SPF/DKIM/DMARC, one-click unsubscribe.
SMSYour own gateway — Twilio, MSG91, Sinch, AakashSMS or any HTTPS endpoint.
Scheduling & time zonesSend later, send at a wall-clock time, or at 9 AM wherever they are.
AI featuresDraft copy, build audiences in English, explain failures.