FAQ
Is it really free?
The software is. You pay for a server — a 2 vCPU VPS carries tens of thousands of subscribers. The server is AGPL-3.0; the SDKs are MIT so they can live in closed-source apps.
Does iOS go through Firebase?
No. iOS talks to APNs directly with your .p8 key. There is no Firebase iOS SDK in any of our SDKs. Android uses Firebase Cloud Messaging because that is the only transport Android has.
Why data-only messages on Android?
So the SDK draws the notification and can report delivered, show images, buttons and groups. An FCM notification block would have Android draw it while your app sleeps and your code never runs.
Can I import my OneSignal subscribers?
iOS and Android tokens, yes. Web push subscriptions, no — they are bound to OneSignal's VAPID key. See the migration guide.
Can I change the VAPID key?
Not without losing every web subscriber. It is generated once per app and the dashboard will not regenerate it.
Why is my open rate lower than the other tool showed?
We divide opens by delivered; most tools divide by sent. Ours is the honest number. Delivery problems show up in delivery rate, not hidden inside engagement.
Is there a scheduler service to run?
No. Scheduled campaigns are delayed BullMQ jobs in Redis. Keep Redis persistent (the compose file does) and they survive restarts.
Can several apps share one instance?
Yes — that is the design. Every row carries an appId, every query is scoped, every API key is bound to one app. Use one app per product and one per environment.
How do I send from my backend?
POST /v1/notifications with the secret key — Sending. For scheduled, segmented sends use POST /v1/campaigns.
Where are the tokens?
In MongoDB, and only there. Never in logs, never in Redis job payloads (jobs carry a subscriptionId), never in exports, never returned by an API (masked in /v1/users).
What happens to dead tokens?
410 / Unregistered / UNREGISTERED invalidates the subscription on the spot, writes a failed event and a subscription.invalidated webhook. Nothing retries a dead token. A 90-day inactivity sweep opts out the rest.
Do I need the Notification Service Extension?
For iOS delivered events, images and buttons — yes. Without it you still get sends and opens.
How big can a push be?
4 KB on every platform. Web push is the strictest (3 993 bytes of plaintext). Keep data small; fetch the rest on open.
Can I run the dashboard on a different host than the API?
Yes. It only needs API_URL to reach the API and the shared ADMIN_API_TOKEN. The browser never talks to the API for admin pages.
Is there a hosted version?
No. Self-hosted only, by design.