Without device-level confirmation
- No reliable device-side receipt
- Impossible to measure delivery rate
- Third-party solutions billed by MAU
- Locked-in SDK and dashboard
Device-level delivery confirmation: iOS and Android. FCM (Google) and APNs (Apple) confirm that notifications were sent, but never that they were received on the device. PushProof fills this gap, without changing your sending stack!
npm install @pushproof/capacitor
When you send a push, you know at best that it was accepted for distribution. Never that it reached the phone.
A reusable native SDK, a backend that aggregates and displays the results, and a pricing model aligned with actual usage.
An iOS extension (NSE) and Android service capture delivery on the device (including when the app is closed). Each push carries a notif_id to correlate send and receipt.
Billing by ingested receipt volume. Your active users don't inflate the bill.
The native SDK (Swift + Kotlin) and wrappers are MIT-licensed. You pay for ingestion, aggregation and the dashboard.
Add a user_id when sending: "did this user receive this notification?", list received/missing recipients per campaign. Pushproof does not know your users' real identity (hashed at ingestion).
You send notifications, Pushproof receives receipts and calculates rates.
Your backend injects a notif_id (UUID) into the payload — and optionally a user_id for Pro tracking
iOS NSE or Android FirebaseMessagingService intercepts the push
POST to api.pushproof.dev/v1/receipts with the ingestion key
Delivered/sent rate available in the dashboard by app, platform and campaign
No MAU billing. One account = one app — invite as many teammates who can view the dashboard as you want, all at no extra cost! You pay based on ingested receipt volume; your data is retained, with no tier-based purge.
to validate
€0
to launch
€9/month
to scale
€29/month
user_id)large apps
€79/month
user_id)No. They confirm acceptance for distribution by the Apple or Google relay. The notification may never reach the device — and you won't know.
On iOS, a Notification Service Extension (NSE) is woken when a push arrives, before it's displayed. On Android, a FirebaseMessagingService intercepts data messages. In both cases, a request is sent to our system containing the notif_id and the user_id if present in the payload.
This Pro plan feature activates automatically when you add an opaque user_id to the payload (your app's internal identifier — never email or phone). You can then answer "did this user receive this notification?" and list received or missing recipients for a campaign, via the dashboard or API. Pushproof stores a hash — not the identifier in plain text.
Yes — on all plans, including Free. Invite as many colleagues as you want to view the dashboard in read-only mode, at no extra cost. Only the account owner manages billing and API keys.
No, and we don't promise it. iOS may suspend the NSE (delivery confirmation) under memory or battery pressure. The displayed rate is a lower bound of the actual rate. This is exactly the same bias as commercial solutions: OneSignal, Airship.
These platforms solve confirmation but bill by MAU (monthly active users) and place the feature behind paid tiers. Pushproof bills only by ingested receipt volume.
The native SDK (Swift + Kotlin) is framework-agnostic. The first wrapper shipped is @pushproof/capacitor (Ionic/Capacitor). React Native and Flutter will follow based on demand — the backend serves all ecosystems via the same protocol.