Native in-app notifications, shipped in minutes
Give your product the notification bell and inbox your users already know from the apps they love. Build them with your own components on our SDKs, and reach the right people with localized, personalized messages.
Built for product teams
Why NotificationStream?
Headless SDKs
The bell your users already know
Unseen and unread counts, read and archive state and pagination from the SDK, rendered with your own components.
- whereplanispro
- andcountryinDE, FR, NL
- andlast seenwithin7 days
Targeting
Reach exactly the right people
Broadcast to everyone, or target user ids, tags and rule-based segments.
const userToken = sign(
privateKey, user.id
);
Privacy
Signed identities
Your server signs each user id with a secret only you hold, so users only ever read their own inbox.
Welcome aboard, Ada 👋
Your organization is ready.
Willkommen an Bord, Ada 👋
Deine Organisation ist bereit.
ようこそ、Ada さん 👋
組織の準備ができました。
Localization
Every user in their own language
Write content per locale and personalize it with profile data. Each user gets the best match.
Developer first
A few lines of code. No backend to build.
Pick your stack and paste the snippet: you get a live feed that polls for new notifications and backs off while nothing changes, or updates in realtime on Growth and up. Your components render it.
- Start your trial.
- Create an account and start a 3-day free trial. Cancel anytime.
- Create a project.
- Each app or environment gets its own publishable key and signing keys.
- Install the SDK.
- Wire your own bell to the SDK with a few lines of React, React Native, or plain HTML and a script tag.
- Send notifications.
- Compose in the dashboard or call the REST API from your backend. Users get them on their next poll, or within 30 seconds with realtime.
<button id="bell">Notifications <span id="badge" hidden></span></button>
<script type="module">
import { createNotificationClient } from "https://cdn.jsdelivr.net/npm/@notificationstream/js/+esm";
const client = createNotificationClient({
publishableKey: "pk_live_8fK2…",
user: { locale: "en" },
// A short-lived token signed by your backend, fetched again when it expires
token: () => fetch("/api/notifications/token").then((r) => r.text()),
});
// Render your own bell and inbox from the live state
const badge = document.getElementById("badge");
client.subscribe((state) => {
badge.hidden = state.unseenCount === 0;
badge.textContent = state.unseenCount;
renderList(state.items);
});
// Check every minute, backing off while nothing changes
client.poll(60_000);
</script>Use cases
See it in a real product
What users see in your app, who creates each notification and where, and the code behind it.
Product launches
A launch screen for your early adopters
Show a full-screen announcement in your mobile app to users tagged as early adopters, the next time they open it.
Created by Your product team, in the dashboard
Read the use case
Maintenance in progress. Uploads are paused until 02:30 UTC.
ends in 18 minMaintenance & incidents
Maintenance notices that come and go on time
Warn users the day before, show a banner during the window, and take everything back with one cancel.
Created by Your team in the dashboard, or your incident tooling over the API
Read the use case
Activity feeds
A social-style activity feed
Friend requests with Confirm and Delete buttons, likes, comments and shares in the feed your users already know.
Created by Your backend, automatically on each event
Read the use case
Everything you need
The polish of an in-house inbox
Everything a big product team would build, without the months of work.
- SDKs for every surface
Hooks for React and React Native, a TypeScript client for any other framework, plus a typed Node.js SDK for your backend.
- Looks native to your app
The SDKs are headless: they keep the feed, counts and read state in sync, and you render them with your own components and design system.
- Precise targeting
Send to everyone, specific user ids, users with any/all tags, or rule-based segments over profile fields and custom attributes.
- Localization built in
Write content per locale. Each user gets the best match for their language, with a sensible fallback chain.
- Templates & personalization
Insert user attributes with {{user.attributes.name | there}}-style tokens, rendered safely per user at read time.
- Scheduling & expiry
Publish now, schedule for later or save drafts. Expire time-sensitive messages so they vanish on their own.
- REST API & OpenAPI
Everything in the dashboard is available over a clean, versioned REST API with idempotency keys and an OpenAPI spec.
- Privacy by default
Your server signs a short-lived token for each user with a private key only you hold. We store just the public key, so nobody can read someone else's inbox.
- Fast and frugal on the edge
Served from Cloudflare's global network. Broadcasts are a single write, polling is one tiny request, unchanged feeds are a body-less 304, and realtime updates on Growth and up arrive within seconds.
Pricing that grows with you
Pay for API requests, not for notifications sent. Every plan starts with a free trial.
Starter
For side projects and early-stage products.
$12/month
Billed monthly
- 500K API requests / month≈ 1,250 users
- 1 project
- Web and mobile SDKs
- Broadcasts & user targeting
- 30-day retention
Growth
Most popularFor growing products that need personalization.
$29/month
Billed monthly
- 5M API requests / month≈ 12,500 users
- 5 projects
- Realtime updates
- Tags & segments
- Localization & templates
- Scheduled notifications
- 90-day retention
Scale
For high-traffic apps and teams.
$99/month
Billed monthly
- 30M API requests / month≈ 75,000 users
- Unlimited projects
- Everything in Growth
- 1-year retention
- Priority support
Custom
Need custom volume discounts or longer data retention? Let's put together a plan that fits.
All plans include a 3-day free trial. Prices in USD; taxes calculated at checkout. Cancel anytime.