Pusher Alternative. Same Protocol. Cloudflare's Edge.

Vask is a Pusher-protocol-compatible WebSocket service, re-architected for Cloudflare's edge in 330+ cities. Your sockets terminate at the closest edge instead of one home region, while your existing Pusher-protocol SDKs keep the same channel and event model. The bill changes because Vask prices broadcasts instead of subscriber copies.

Get started

Realtime made simple.

Free Tier: 500K broadcasts/mo and 100 concurrent across unlimited apps. $10/mo when you outgrow it.

Why developers leave Pusher

The reason is rarely latency. It is rarely uptime. It is the bill, and the bill has a specific mechanism that nobody warns you about until you cross a threshold. The mechanism is the per-fan-out multiplier.

Here is how it works in plain terms. You publish one message to a channel. That channel has 50 subscribers. The pricing model counts the broadcast as 51 messages: one publish, 50 deliveries. Add another subscriber and it becomes 52. Run a notifications channel with 1,000 connected users and a single broadcast becomes 1,001 billable messages. Run a typing-indicator over a busy room and you can rack up tens of thousands of billable messages from a single user pressing a key.

This is not a quirk. It is documented in the protocol vendor's own engineering reference:

if one message is published on my-channel and 50 clients are subscribed to that channel then the message count will be 51

pusher-docs

So the bill scales with the thing you cannot control (the number of people listening) rather than the thing you can control (how often you publish). The category has a name for the workload: "fan-out." We call the surcharge attached to it the fan-out tax. Pricing pages do not say "fan-out tax" because pricing pages do not name the mechanism. The mechanism is the product.

There are three predictable moments when developers feel this and start shopping for an alternative:

  1. The viral moment. A feature works. Subscribers grow ten times overnight. The bill grows a hundred times overnight because every existing broadcast now fans out across ten times the audience and the per-message overage rate stacks on top.
  2. The product change. Someone ships presence indicators, typing indicators, online-status dots, or live cursor positions. Each of these emits broadcasts at human-keystroke or human-mouse-move frequency, fanned out across every viewer. Costs per active user can rise by an order of magnitude in a week.
  3. The audit. Finance pulls a year of invoices, asks why the line item doubles every quarter, and the engineering lead has to explain that "broadcasting to your own users is the priced unit, and the price scales with success."

We don't think any of this is a moral failing of the incumbent. It is just a billing model from a previous era of real-time, when broadcasts were rare and connections were the scarce resource. What changed is the work pattern. Modern apps fan out constantly. The model has not caught up.

How Vask is different

Three pieces of mechanism, no marketing varnish.

The Pusher protocol, kept on purpose. The Pusher wire protocol is one of the cleanest channel-based real-time protocols in the wild. It has good SDKs in every language a working developer is likely to use. It has well-defined semantics for public channels, private channels, presence channels, and channel auth. We did not invent a competing protocol because there is no reason to invent one. We kept the protocol. Your client SDKs work unchanged. Your server SDKs work unchanged. Laravel Echo, pusher-js, pusher-php-server, pusher-http-ruby, pusher-http-python: all of them connect to Vask the same way they connect today.

Cloudflare's edge instead of a selected region. Connections terminate on Cloudflare's edge network, not a single home region. There is no separate "global" tier to upgrade to and no per-region charge.

Flat broadcast billing. A broadcast to a channel is one broadcast on the bill, regardless of how many subscribers are on it. There is no per-fan-out multiplier. There is no surcharge for presence channels with thousands of members. There is no surprise line item for the typing indicator that ships in a sprint. We don't throttle, drop, or charge for fan-out.

The receipts:

  • Cloudflare-edge delivery in 330+ cities
  • Pusher protocol drop-in. No SDK swap, no event-name rewrite, no auth rewrite
  • Broadcast-priced billing. The calculator on this page shows the math against your own inputs, which can land higher or lower
  • Host and credential swap for Pusher-compatible apps
  • Built by people who ship. Answered by the same people.

Side-by-side

ComparisonVaskPusher Channels
Headline workload2,000 concurrent · 10M broadcasts/moIndie · $20/moPro · $99/mo
Free tierSandbox onlyFree Tier · 500K broadcasts/mo, 100 concurrent100 connections · 200K messages/day
Entry paid tier500 conn · 1M msgs/daySide · $10/moStartup · $49/mo
Mid tier2K conn · 4M msgs/dayIndie · $20/moPro · $99/mo
High tier5K conn · 10M msgs/dayTeam · $50/moBusiness · $299/mo
Top published tier30K conn · 90M msgs/dayBusiness · $100/moGrowth Plus · $1,199/mo
Billing mechanicPay for broadcasts you send, not who is listeningSubscriber × message — fanout multiplies cost
Free for local devFree Tier: 500K broadcasts/mo and 100 concurrent across unlimited appsLimited (Sandbox app counts toward quota)
Connection limitsSoft caps tied to plan; lift on requestDaily caps per tier
Self-hostReverb-compatible; bring your own infraNo
Protocol compatibilityDrop-in via Pusher protocol — same client SDKsNative (Pusher Channels protocol)
SupportDirect founder support on every paid tierTiered (chat/email by plan)

Pusher Channels pricing reflects published list rates as of 2026-04. Workloads above the top tier require contacting Pusher sales.

The table renders from a dated competitor fixture, so the numbers reflect published pricing as of the last verification stamp on the row. If a tier has shifted since then, the timestamp tells you so. Refresh, do not trust.

What the migration looks like

The wedge is the protocol. Because Vask speaks the Pusher Channels protocol, you do not rewrite channel names, event names, payload shapes, presence semantics, or channel auth.

The change is at the configuration layer. Point your existing real-time client and server SDK at the Vask host and supply Vask credentials. The Laravel example below is illustrative; there are also framework-specific recipes for Laravel, Rails, Next.js, and Django.

Pusher → Vask · Laravel
Index: app/Broadcasting.php
===================================================================
--- app/Broadcasting.php
+++ app/Broadcasting.php
@@ -1,7 +1,5 @@
 use Illuminate\Support\Facades\Broadcast;
 
-// Pusher client setup
-$pusher = new \Pusher\Pusher(env('PUSHER_KEY'), [
-    'cluster' => env('PUSHER_CLUSTER', 'mt1'),
-]);
-$pusher->trigger('orders', 'created', $payload);
+// Vask drop-in via Laravel broadcasting
+Broadcast::channel('orders', fn () => true);
+broadcast(new OrderCreated($payload))->toOthers();

A few things worth saying out loud:

  • Nothing breaks at the SDK layer. The Pusher protocol is the contract. The protocol does not know which host is on the other end of the WebSocket.
  • Presence channels work. Private channels work. Channel auth works. We use the same auth pattern.
  • You can run both endpoints in parallel during the cutover. Spin up a feature flag, send a percentage of traffic to Vask, and verify the bill against your existing one in flight. Roll back at any time by flipping the env var.
  • If the migration runs into an edge case in your stack, email [email protected] and you will get an answer from someone who can read the diff.

Run the numbers on your own bill

The frame above is the argument. The number is what closes it. Plug in your concurrent users, your broadcasts per minute, and the average subscribers per channel, and the calculator will show you what the per-fan-out multiplier is doing to your current bill, and what it would look like without it.

What you'd actually pay.

Pick the shape of your workload. We'll match it to the right Vask tier - and to whatever Pusher would charge for the same headroom.

Peak concurrent connections2,000
Server broadcasts / month5.0M
Avg. subscribers per broadcast10

Vask Cost

$20/mo

Pusher's Cost

$99/mo

5x cheaper on Vask's Indie plan

That’s $79/mo back in your pocket.

Loading verification...

Pusher limits are daily; estimate assumes even usage over a 30-day month.

If you want a written breakdown for your team or your finance lead, the calculator will email you a formatted report keyed to your inputs. Same numbers, different format. Use it as the supporting doc for the switch decision.

When NOT to switch

Honesty is a load-bearing part of an alternatives page. Vask is not the right fit for everyone, and we would rather you stay on what you have than pay for something you do not need. The cases below are the ones where we would tell you not to switch:

  • You are below the free tier and paying nothing. If your concurrent connection count and message volume sit comfortably inside the incumbent's free plan, switching does not save money. It costs you migration time you could spend on the product. Come back when the bill shows up.
  • You are running Supabase as a bundle. If you are using Supabase auth + Postgres + storage + realtime as one stack and the bundled real-time channel is fine for what you are doing, the value is in the bundle. Pulling realtime out alone breaks the integration math and replaces a single bill with two. Don't.
  • You are running Laravel Reverb in-process for a small app, and the ops are fine. Reverb is a solid first-party Laravel option that runs alongside your app server, with no per-message billing and no extra vendor in the stack. If your traffic fits inside one server, your team is comfortable operating it, and you do not need multi-region edge presence, Reverb is the right answer for you. Vask is the hosted Pusher-protocol option for teams that want the protocol without operating their own WebSocket server, or that need edge delivery beyond what an in-process server can give them.
  • You are evaluating real-time as a science project, not for production. If the goal is "I want to learn how WebSockets work end-to-end," Vask is not the teaching surface. Read the protocol spec, run a server locally, then come back when the question is "what hosts this in production."
  • You need a non-Pusher protocol on the wire. If your existing system is on Ably's protocol, MQTT, or a proprietary contract you cannot change, the protocol-compatibility wedge is not a wedge for you. The Pusher protocol is the through-line of the migration story.

If none of those apply, the math will work in your favor. Run the calculator above and check.

Is Vask actually Pusher-protocol-compatible?
Yes. Same wire protocol, same client SDKs, same channel and event semantics. Point your existing app at Vask by changing the host and using Vask credentials. No SDK swap, no event-name rewrite, no auth model rewrite.
What does Vask's broadcast billing save on a typical Pusher workload?
It depends on your fan-out factor and broadcast volume. The reason savings can be large is mechanical: Pusher-style per-message billing counts subscriber copies, while Vask bills the broadcast once. Use the calculator on this page with your own numbers instead of trusting an average.
What does the migration actually look like?
It is a configuration-layer migration for apps already using the Pusher protocol. You point the client and server SDKs at Vask, use the Vask key and secret, and keep your channel names, events, payloads, private channels, presence channels, and auth flow. Some SDKs still require an app_id or cluster option; for Vask, app_id is the Vask key and cluster is only a compatibility placeholder.
Will my Pusher client SDKs and integrations break?
No. The Pusher protocol is the contract. Your pusher-js, laravel-echo, pusher-php-server, pusher-http-ruby, pusher-http-python and similar integrations connect to Vask without code changes. Presence channels, private channels and channel auth all work the same way.
What's the latency story compared to a centralized real-time service?
Vask runs on Cloudflare's edge network, so connections terminate close to users instead of one selected Pusher region. Treat latency as something to measure against your own user geography rather than a generic benchmark.
How does Vask price broadcasts?
Per broadcast, not per fan-out copy. If you publish one broadcast to a channel with 10,000 subscribers, that is one broadcast on the bill. Within your tier, we don't throttle, drop messages, or charge per subscriber copy. If you cross your plan limits we give you a grace period to adjust before caps kick in. Tier limits are published openly. The Free Tier covers 100 concurrent connections and 500,000 broadcasts per month, shared across unlimited apps - no credit card required. Paid tiers run from $10/mo (Side: 500 concurrent, 2M broadcasts) up to $100/mo (Business: 10K concurrent, 100M broadcasts). The recommended tier for most production apps is Indie at $20/mo: 2K concurrent connections and 10M broadcasts per month.
When should I NOT switch to Vask?
If you are below the Pusher free tier and not paying anything, you do not need us yet. If you are already on Supabase using auth, database and realtime as a single bundle, the bundle is the value. Switching realtime alone breaks the math. If you are running Laravel Reverb in-process for a small app and the ops are fine, Reverb is a great first-party fit; we are the option when you need hosted Pusher-protocol on the edge.

Get going

Same protocol. Different bill. Use Vask credentials, keep your existing SDKs, and remove the per-fan-out multiplier from your invoice.

Make the switch

Keep the protocol. Change the bill.

Swap the host, use Vask credentials, and keep your existing SDKs.