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 keys | Notibase 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().
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 SDK | Typed client, idempotent by default, every channel. |
| User attributes | What to send for name, email, phone, gender, country — and what we store. |
| Audience filters | Target by country, attributes, activity, with live counts. |
| Android | Kotlin SDK, Firebase setup, automatic click tracking. |
| iOS | Swift SDK, APNs .p8 setup, click tracking. |
| Flutter | Pure-Dart SDK beside firebase_messaging. |
| React Native | Pure-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. |
| Your own SMTP server, senders, SPF/DKIM/DMARC, one-click unsubscribe. | |
| SMS | Your own gateway — Twilio, MSG91, Sinch, AakashSMS or any HTTPS endpoint. |
| Scheduling & time zones | Send later, send at a wall-clock time, or at 9 AM wherever they are. |
| AI features | Draft copy, build audiences in English, explain failures. |