
Ably wins for production realtime in 2026 if you need guaranteed message ordering, exactly-once delivery, and global edge presence with strong SLAs. Pusher wins for the fastest "ship a feature today" path: cheap, simple Channels API, dead-simple SDKs. PubNub wins when you need turnkey extras (presence, push, functions, signals) bundled into one platform and don't want to assemble them yourself.
Most teams overspend on realtime because they pick the platform that markets best, not the one matched to their message pattern. This post breaks down the three vendors on the dimensions that actually decide infra cost: presence semantics, channel limits, message rate ceilings, edge geography, durability, replay, and the real price at 1M, 10M, and 100M monthly messages.
Ably is a realtime data delivery network founded in 2015, headquartered in London, with a strong engineering reputation for protocol-level correctness. Their pitch is the "four pillars" of realtime: ordering, delivery, integrity, performance. Ably publishes formal definitions of each and backs them with a 99.999% uptime SLA on enterprise plans.
Pusher Channels (acquired by MessageBird, now Bird) is the OG of "websockets as a service," launched in 2011. It is the simplest API of the three: subscribe to a channel, receive events, done. Pusher Beams (push notifications) is a separate product. Most posts comparing the three really mean Channels.
PubNub launched in 2010 and has the broadest product surface of the three: pub/sub, presence, message persistence, functions (edge code), push notifications, mobile-push, app context (key-value), and access manager. It markets as a "platform" rather than a transport.
| Use case | Pick |
|---|---|
| Live cursors, low-stakes presence | Pusher |
| In-app notifications, activity feeds | Pusher or Ably |
| Multiplayer collaborative editing | Ably |
| Financial dashboards, trading UIs | Ably |
| Live sports / betting tickers | Ably |
| Chat with built-in moderation, push, history | PubNub |
| IoT telemetry at scale | PubNub or Ably |
| Replacing a Socket.IO server you regret | Pusher (Channels Lite) |
| You need exactly-once + ordering guarantees | Ably (only one that promises it) |
For most early-stage SaaS adding realtime to a dashboard, Pusher remains the right call. Our earlier Pusher review goes deeper on why it still ships features fastest in 2026.
Presence (knowing who is connected to a channel) is where the three platforms diverge most.
user_id and arbitrary user_info (JSON). You pay per-presence-member-per-month on higher plans. State is in-memory only; if a process crashes, members re-sync on reconnect, and you can see brief duplicate joins.enter, update, leave, and a server-side presence-set you can fetch at any time. Ably persists presence state inside the cluster, so reconnects rehydrate cleanly. It also exposes presence.history() so you can audit who was online when.join, leave, timeout, state-change, and interval events. Heartbeat timeouts are configurable down to 20s.The practical takeaway: if presence drives billing or compliance (paid seats in a doc, regulated chat rooms), use Ably or PubNub. If presence is cosmetic (avatars on a doc), Pusher is fine.
This is where you get surprised on your second invoice.
| Limit | Pusher Channels | Ably | PubNub |
|---|---|---|---|
| Max channels per app | Unlimited (soft) | Unlimited | Unlimited |
| Max subscribers per channel | 100 (Free) to unlimited (Enterprise) | 200 default, 1M with shared subs | Unlimited |
| Max message size | 10 KB | 64 KB default, 1 MB max | 32 KB default, configurable to 32 KB |
| Max messages per second per channel | 100 default | 100 default, raisable | 100 default |
| Presence members per channel | 100 (Startup) to 10k+ (Enterprise) | 200 default, raisable | Unlimited (paid) |
| Durability / replay window | 24h on Channels Pro+ | 24h to 72h (Reach plan: persisted) | 7 days (Message Persistence add-on) |
The most common gotcha: Pusher's 10 KB message size. If you are syncing CRDT deltas, JSON payloads with rich text, or anything with embedded base64, you outgrow Pusher faster than your message count suggests. Ably's 64 KB default and 1 MB ceiling is the most forgiving.
Latency-sensitive apps care about edge geography.
For a US-only product, all three feel the same. For global products (anything with European GDPR users plus US plus Asia), Pusher's single-cluster model is a real constraint: a Tokyo user on a us-east-1 Pusher app gets ~140ms round trips that Ably and PubNub deliver in ~30ms.
What happens if a subscriber disconnects for 30 seconds and reconnects?
history() API to query any range up to your retention.fetchMessages API pulls up to 100 messages per channel, with paging.If your product is collaborative editing or anything where missed messages mean lost data, Ably's rewind model is the cleanest. PubNub's persistence is the deepest if you want messages as a system of record.
Subjective, but here is how each feels in practice.
Pusher Channels SDK is the smallest API surface. Three calls and you are subscribed:
const pusher = new Pusher(KEY, { cluster: 'eu' })
const channel = pusher.subscribe('orders')
channel.bind('order.created', (data) => console.log(data))
Pusher's docs are short because there is not much to learn. This is the platform's biggest strength and biggest weakness. It is a transport, not a platform.
Ably SDK is more verbose because it exposes more semantics: connection state machine, channel attach/detach, presence, history, encryption, push, and Spaces (their collaborative-edit primitives). The TypeScript types are excellent. Connection recovery is automatic and configurable.
const ably = new Ably.Realtime({ key: KEY })
const channel = ably.channels.get('orders')
await channel.subscribe('order.created', (msg) => console.log(msg.data))
await channel.presence.enter({ user: 'bhavya' })
PubNub SDK feels like the oldest of the three because it is. The API uses a publishKey/subscribeKey pair and a listener-based model that can feel boilerplate-heavy. The React Native and Unity SDKs are strong; the modern TypeScript surface less so.
const pubnub = new PubNub({ publishKey, subscribeKey, uuid: userId })
pubnub.addListener({ message: (m) => console.log(m.message) })
pubnub.subscribe({ channels: ['orders'] })
For an experienced TypeScript team, Ably feels best. For shipping in an afternoon, Pusher wins. For mobile-first or game-engine apps, PubNub's SDK breadth is unmatched.
| Free tier | Pusher Channels | Ably | PubNub |
|---|---|---|---|
| Connections | 100 concurrent | 200 concurrent | 200 daily active devices |
| Messages | 200k/day | 6M/month | 1M transactions/month |
| Presence members | 100 | included in connections | included |
| Apps | 1 | unlimited | 1 keyset |
| Cluster choice | 1 cluster | global | global |
| Card required to start | No | No | No |
| Support | Community | Community | Community |
For a hackathon or weekend project, all three free tiers are workable. PubNub's "transactions" billing makes their free tier harder to reason about because every API call (publish, subscribe message, presence event, history fetch) counts as a transaction.
Approximate list pricing as of mid-2026. Real enterprise contracts negotiate down 20-40%.
| Monthly volume | Pusher Channels | Ably | PubNub |
|---|---|---|---|
| 1M messages, 500 concurrent | ~$49/mo (Startup) | ~$29/mo (paid plan) | ~$49/mo (Starter) |
| 10M messages, 2k concurrent | ~$299/mo (Growth) | ~$185/mo | ~$299/mo |
| 100M messages, 10k concurrent | ~$1,499/mo (Business+) | ~$960/mo | ~$1,200-1,800/mo (depends on add-ons) |
| 1B messages, 50k concurrent | Enterprise quote | ~$5-8k/mo | ~$8-15k/mo |
Ably consistently lands as the cheapest of the three at 10M+ messages because they bill on a single "message" unit rather than splitting transactions, presence events, and connections into separate meters. PubNub's add-on model (persistence, presence, app context, push, functions all separate) makes the bill less predictable.
Pusher's pricing is the most predictable because the product is the simplest. You know what you owe before you ship.
Pick Ably when:
Pick Pusher Channels when:
Pick PubNub when:
Most realtime-migration headaches we see at Cadence are not platform choice. They are reconnect logic, auth-token rotation, and message ordering bugs that show up only under packet loss. All three platforms handle the happy path; the difference is what happens at 2am when AWS loses a zone.
This is also where the build-vs-buy debate comes back. Self-hosting Socket.IO or Centrifugo looks cheap until you hit your first multi-region outage. The right framing is usually: use Pusher or Ably until you are spending $4k/month on realtime, then revisit self-hosting with a senior engineer who has done it before. Our best deployment platforms for startups guide covers the infra side of that decision.
For founders evaluating realtime tools as part of a broader stack review, our Resend transactional email review and best AI agent platforms for developers round out the modern AI-native infra picture.
If you are choosing for the first time:
If you are migrating from a vendor you regret, the realistic effort is 1 to 2 weeks for a small product, 3 to 6 weeks for anything with custom presence logic. Every engineer on Cadence is AI-native by default, vetted on Cursor, Claude Code, and Copilot fluency before they unlock bookings, so realtime migrations land closer to the 1-week end of that range.
A senior engineer at $1,500/week can usually deliver an Ably or Pusher migration end to end in a single booking, including reconnect tests, presence state, and replay window validation. If you are still scoping, you can audit your tooling honestly before committing to a vendor swap.
Below 1M messages a month, Pusher and Ably are within $20/mo of each other and the free tiers are similar. Above 10M messages, Ably is usually 30-40% cheaper because they bill a single message unit rather than splitting connections, presence, and messages into separate meters. Pusher gets relatively expensive at scale.
No. All three are managed services. The closest open-source equivalents are Centrifugo (Pusher-like API), Soketi (Pusher-protocol compatible), and Socket.IO with Redis adapter. Self-hosting saves money above $4k/month spend but adds on-call burden and multi-region complexity.
All three publish first-class JS SDKs. Ably has the strongest typed-TypeScript surface and a dedicated React hook library (@ably/react). PubNub has React hooks too. Pusher's pusher-js is plain JS with TypeScript types added; community React wrappers are good but not first-party.
Socket.IO is a library, not a hosted service. You run it yourself on your own servers (Node, with Redis or Postgres for multi-instance pub/sub). It is the right call when you have a strong infra team and want full control. Pusher, Ably, and PubNub exist for teams that want to skip that operational work.
Yes, but narrower than before. PubNub wins for chat platforms, gaming, and IoT where their bundled extras (App Context, Access Manager, Functions, push) save you stitching together separate vendors. For generic websockets or pub/sub on a SaaS dashboard, Ably or Pusher will be cheaper and simpler.
Supabase Realtime is Postgres-driven (you get realtime updates on database row changes). Convex is a full backend that includes realtime. Both are excellent if you are already in their ecosystem. None replace Ably, Pusher, or PubNub for cases where you need pure pub/sub without a database round trip per message.