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.

Power usersSegment
  • whereplanispro
  • andcountryinDE, FR, NL
  • andlast seenwithin7 days
Matches≈ 2,431 users

Targeting

Reach exactly the right people

Broadcast to everyone, or target user ids, tags and rule-based segments.

server.ts

const userToken = sign(

privateKey, user.id

);

user_8f2k verified

Privacy

Signed identities

Your server signs each user id with a secret only you hold, so users only ever read their own inbox.

en

Welcome aboard, Ada 👋

Your organization is ready.

de

Willkommen an Bord, Ada 👋

Deine Organisation ist bereit.

ja

ようこそ、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.

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.

Learn more about sdks for every surface

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.

Learn more about looks native to your app

Precise targeting

Send to everyone, specific user ids, users with any/all tags, or rule-based segments over profile fields and custom attributes.

Learn more about precise targeting

Localization built in

Write content per locale. Each user gets the best match for their language, with a sensible fallback chain.

Learn more about localization built in

Templates & personalization

Insert user attributes with {{user.attributes.name | there}}-style tokens, rendered safely per user at read time.

Learn more about templates & personalization

Scheduling & expiry

Publish now, schedule for later or save drafts. Expire time-sensitive messages so they vanish on their own.

Learn more about scheduling & expiry

REST API & OpenAPI

Everything in the dashboard is available over a clean, versioned REST API with idempotency keys and an OpenAPI spec.

Learn more about rest api & openapi

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.

Learn more about privacy by default

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.

Learn more about fast and frugal on the edge

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 popular

For 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.

Contact us

All plans include a 3-day free trial. Prices in USD; taxes calculated at checkout. Cancel anytime.

Compare all plan features

Frequently asked questions

How long does it take to integrate?
Most teams ship a working bell in under 15 minutes: install the SDK, pass your publishable key and a user token signed by your backend, and render the feed with your own components. Targeting can be refined later from the dashboard.
Do you support mobile apps?
Yes. The React Native SDK has the same hooks as the React one, so you build the bell and feed with your own native components. Notifications are in-app (shown inside your app), not OS push notifications.
How are my users authenticated?
Your backend signs a short-lived token (an ES256 JWT) for each user with your project's private signing key. The SDK sends it with every request, and we verify it with the public key, so users can only ever read their own notifications.
What do I pay for?
API requests from our SDKs: feed checks, read or click updates and profile syncs. Every plan includes unlimited notifications, and a typical user makes about 400 requests a month.
Can I send notifications from my backend?
Absolutely. Use the REST API with a secret key, or the Node SDK. Requests support idempotency keys so retries never create duplicates.
What happens after the free trial?
After 3 days your selected plan starts automatically and your payment method is charged. Cancel before the trial ends and you pay nothing; you can also change plans or cancel any time later from the billing page.