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

Thunderclap vs Pusher

PusherThunderclap
A publish to 50 subscribers counts as51 messages1 message
Message allowancePer dayPer month
Connections billed atThe plan's maximumThe 95th percentile of hourly peaks
Going overUpgrade to the next tierPay-as-you-go on every paid plan
Free plan100 connections200 connections, 2M messages a month
$49 / $29 entry plan500 connections, 1M messages a day5,000 connections, 8M messages a month
$99 plan2,000 connections, 4M messages a day25,000 connections, 25M messages a month
Where users connectOne region per appThe nearest edge location
Knowing what a client missedNoSequence numbers and gap events
Authorizing private channelsOne request per channelOne token can grant many channels
Webhook signaturesOne secretEvery 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.

10,000
Messages a day (Pusher's count)14.9M

7.7×cheaper

Pusher
Pusher$499
Thunderclap
Thunderclap$65

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:

client.ts
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:

server.ts
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

  1. 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.
  2. Move to Thunderclap's SDKs at your own pace. thunderclapJS and @thunderclapjs/server add 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

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.

Start building in minutes.

Sign in with your email: no password, no card. Your first organisation starts on Spark, the free plan, with an app and keys ready to use.