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 and APNs confirm dispatch, never delivery. 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 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. You pay for ingested receipt volume and dashboard features — 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.
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.