The Pusher alternative that bills per message, not per delivery
Thunderclap is a managed realtime service with the channel model you know from Pusher: public, private and presence channels, published from your backend and delivered over WebSockets. It differs in what you pay for, where your users connect and what a client knows after a reconnect. And because it understands Pusher's protocol, moving over starts with changing a host.
Prices checked on 1 November 2026.
Why teams look for a Pusher alternative
- The bill grows with every recipient. Pusher counts a publish and each delivery as messages, so one message to a 30-person room counts as 31. Thunderclap counts it once.
- Your busiest day sets your plan. Pusher's message allowance is per day; Thunderclap's is per month, and connections are billed at the 95th percentile of hourly peaks, so a launch-day spike doesn't decide the month.
- Growing means changing plan. On Pusher, going past a tier means upgrading to the next one. On any paid Thunderclap plan you keep going and pay for what's over: $2 per 1,000 connections and $4 per million messages.
- One region per app. A Pusher app lives in one cluster, and every user crosses the world to reach it. Thunderclap connects each user to the nearest edge location.
- Missed events are silent. A Pusher client that drops for a few seconds doesn't know what it missed. Thunderclap numbers every event in a channel and tells the client which range to fetch.
Thunderclap vs Pusher
| Pusher | Thunderclap | |
|---|---|---|
| A publish to 50 subscribers counts as | 51 messages | 1 message |
| Message allowance | Per day | Per month |
| Connections billed at | The plan's maximum | The 95th percentile of hourly peaks |
| Going over | Upgrade to the next tier | Pay-as-you-go on every paid plan |
| Free plan | 100 connections | 200 connections, 2M messages a month |
| $49 / $29 entry plan | 500 connections, 1M messages a day | 5,000 connections, 8M messages a month |
| $99 plan | 2,000 connections, 4M messages a day | 25,000 connections, 25M messages a month |
| Where users connect | One region per app | The nearest edge location |
| Knowing what a client missed | No | Sequence numbers and gap events |
| Authorizing private channels | One request per channel | One token can grant many channels |
| Webhook signatures | One secret | Every active secret, so they keep verifying during a rotation |
What it costs for your traffic
Pick a workload and drag to your size. The chart counts messages the way each service bills them, at list prices.
Monthly cost
30-person rooms, one message a minute per user.
7.7×cheaper
List prices on 1 November 2026. Thunderclap tested up to 50,000 connections; larger sizes are extrapolated.
The more your messages fan out, the wider the gap: about 1.5× for one notification per user, 7–8× for chat rooms, and a public price instead of a sales call for a live audience. The workloads are described in Pusher, Soketi and Thunderclap compared, and every plan is on the pricing page.
Clients that know what they missed
Every event in a channel carries a sequence number, assigned by the one actor that orders that channel. After a network drop, thunderclapJS reports the exact range a client missed, so you fetch it from your own database instead of reloading everything or hoping nothing happened:
import { Thunderclap } from "@thunderclapjs/client";
const thunderclap = new Thunderclap({ key: process.env.NEXT_PUBLIC_THUNDERCLAP_KEY });
const room = thunderclap.subscribe("room-42");
room.bind("message", (data, meta) => show(data, meta.seq));
room.onGap((gap) => {
if (gap.reset) reloadRecentHistory();
else fetchMissed({ from: gap.from, to: gap.to });
});Publishing from your backend is one call:
import { ThunderclapServer } from "@thunderclapjs/server";
const thunderclap = new ThunderclapServer({
appId: process.env.THUNDERCLAP_APP_ID,
secret: process.env.THUNDERCLAP_SECRET,
});
await thunderclap.publish({ channel: "room-42", event: "message", data: { text: "Hello!" } });Switching takes two steps
- Change the host. Thunderclap understands Pusher's protocol and REST API, so the libraries you use today keep working against it: public, private, presence, encrypted and cache channels, client events, batch triggers, channel authorization, channel queries and user sign-in. Your authorization endpoint and webhook handler keep working too.
- Move to Thunderclap's SDKs at your own pace. thunderclapJS and
@thunderclapjs/serveradd sequence numbers, gap detection and connection tokens. Clients on either library share the same channels, so you can move one page or one service at a time.
The migration guide has the settings for step 1 and the equivalents for step 2. To try it locally first, Thunderclap Local runs the engine in Docker for development, tests and CI.
When Pusher is still the better choice
- You need native iOS or Android SDKs today. Thunderclap's client is JavaScript and TypeScript (browsers, React Native, Node.js, Deno, Bun).
- Your backend isn't JavaScript. The server SDK is for Node.js and edge runtimes; PHP, Python, Ruby and Go are next. Until then, Pusher's server libraries for those languages work against Thunderclap by changing the host.
- You use Pusher's push notifications product. Thunderclap delivers to connected clients only.
- You list every channel in an app. Thunderclap answers queries about a channel by name, but not "list all channels": channels are independent, which is what lets them scale.
Common questions
Is Thunderclap compatible with Pusher? With its protocol and REST API, yes: Pusher's client and server libraries connect by changing the host. Thunderclap's own SDKs are where new features land.
Do presence channels work the same way? Yes: members join with an id and info, and everyone sees who's there, up to 100 members per channel, as on Pusher.
Can I run both during the move? Yes. Clients on Pusher's library and on thunderclapJS subscribe to the same channels and receive the same events.
Is there a free plan? Spark is free, with no card: 200 connections and 2 million messages a month. Paid plans start at $29.
Pusher's prices are from pusher.com/channels/pricing, read on 1 November 2026. Pusher is a trademark of its respective owner. Thunderclap is not affiliated with it.