Skip to main content
Metrics type: Supporting MetricsCategory: Realtime & Auth

At a glance

The rate at which Supabase Realtime clients drop their WebSocket connection, measured in disconnects per minute over a rolling one-hour window. A low, steady rate is normal: clients refresh pages, switch networks, and close tabs all day. The signal that matters is a sustained spike above baseline, which is a disconnect storm. When this card spikes, Realtime is unstable and your users are losing live updates: tickets stop appearing, presence indicators go stale, dashboards freeze. Because the disconnect-then-reconnect cycle keeps the connected-client headcount roughly flat, this is often the only card that reveals the instability.

Calculation

The card plots, per minute, the count of WebSocket disconnect events on the Realtime service, read from the connector’s sb_realtime_disconnect_rate series. Conceptually:
The detail (Disconnect storms = Realtime instability; clients lose live updates) is the whole point of the card, and three properties follow from it:
  • Baseline is project-specific. A project with thousands of mobile clients on flaky networks has a naturally high, noisy baseline; a project with a few hundred desktop consoles has a low, smooth one. That is why the alert is sustained spike > baseline rather than a hard number. Vortex IQ learns the normal band and flags departures from it.
  • Sustained matters more than peak. A one-minute blip (a deploy, a brief network wobble) is not a storm. A spike that holds for several minutes is. The line-chart window exists so you can tell a spike from a step from a ramp.
  • It is blind in the headcount. Because most disconnects are followed by an immediate reconnect, Realtime Connected Clients can stay almost flat through a disconnect storm. The churn is invisible there and visible only here, which is exactly why this is an Alert Rules card.

Worked example

The same platform team from the connected-clients card runs a live support console on Supabase Realtime. Their normal disconnect baseline is 3 to 6 per minute during a shift. On 22 May 26 they ship a back-end change at 11:02 BST. The line chart over the following hour: The team reads the situation as follows:
  1. The headcount lied; the rate told the truth. Across the storm, Realtime Connected Clients barely moved (305 to 312) because every dropped client reconnected within a second or two. A dashboard watching only connected clients would have shown a healthy, full project while agents reported tickets vanishing and reappearing. The disconnect-rate line is the only card that exposed the churn.
  2. Sustained, not spiky, so it is real. The rate held above 28 for nearly half an hour. That rules out a momentary network wobble and points at something the project is doing to its own clients: in this case, the 11:02 deploy changed a Realtime authorisation policy, causing the service to repeatedly reject and re-establish subscriptions.
  3. Recovery confirms the cause. Disconnects fell back to baseline within two minutes of the rollback at 11:32. A clean, fast return to baseline after a specific action is strong evidence the action was the cause, which is what the team needs to write up the post-incident note.
Three takeaways:
  1. This card is a leading indicator of Realtime instability, and often the only one. Treat a sustained spike as an incident-grade signal even when connected clients and uptime look fine.
  2. Tie spikes to deploys. The most common cause of a sudden disconnect storm is a change to Realtime auth/RLS policy, a channel-naming change, or a client library upgrade. Overlay your deploy timeline on this chart.
  3. Set the threshold relative to your own baseline. Because churn is project-specific, tune the Alert threshold to your normal band rather than a generic number, or you will either miss real storms or drown in false alerts.

Sibling cards

Reconciling against the source

Where to look in Supabase’s own tooling:
Project dashboard, then Reports, then Realtime for connection and message charts; compare the disconnect or churn series against the same one-hour window. Project dashboard, then Logs, then Realtime to read individual disconnect events with timestamps, client identifiers, and close reasons. This is where you confirm whether disconnects are clean closes or errors. Your deploy and change log to overlay platform changes on the spike; the most common storm cause is a recent change.
Why our number may legitimately differ from the Supabase dashboard: Cross-connector reconciliation: No Postgres system table records Realtime disconnects, because the Realtime service runs as a separate Elixir process outside Postgres. pg_stat_activity will show Postgres connections opening and closing if your Realtime usage is Postgres-Changes-heavy, which can corroborate a storm, but the authoritative record of WebSocket disconnects is the Supabase Realtime report and logs.

Known limitations / FAQs

My connected-client count looks healthy but this card is spiking. Which do I trust? Trust this card. Most disconnects are immediately followed by a reconnect, so the connected-client headcount stays roughly flat through a storm. The disconnect rate is the only card that exposes the churn, which is exactly why it is an Alert Rules card. If users are reporting flickering live features while the headcount looks fine, this is the metric confirming the problem. Why is there no fixed alert number? Disconnect churn is highly project-specific: a large mobile audience on cellular networks has a naturally high, noisy baseline, while a small desktop audience has a low one. A hard threshold would either miss real storms on busy projects or spam alerts on quiet ones. The alert is sustained spike > baseline, and you tune the band in the Alert Rules tab to your normal traffic. What usually causes a disconnect storm? In order of frequency: (1) a deploy that changed a Realtime authorisation or RLS policy, causing repeated reject-and-reconnect cycles; (2) a client library upgrade or front-end change to channel naming or subscription logic; (3) expired or rotated auth tokens forcing mass re-subscription; (4) a Realtime service restart during maintenance; (5) genuine network problems affecting a large client cohort. Overlay your deploy timeline on the chart to narrow it down fast. Are clean tab closes counted as disconnects? Yes. Any WebSocket close is a disconnect, whether the user intentionally closed the tab or the connection dropped on error. That is why a normal baseline is non-zero. To distinguish clean closes from errors, open the Realtime logs in the Supabase dashboard, which record the close reason per event. The spike lasted one minute then vanished. Is that a storm? No. A single-minute blip is usually a deploy, a brief platform hiccup, or a network wobble, and it is not actionable. The alert looks for a sustained spike (several consecutive minutes above baseline). The line-chart window is there precisely so you can tell a one-minute blip from a sustained step. Does a disconnect storm cost me database load? Only for Postgres Changes workloads. Each reconnect on a Postgres Changes channel re-establishes a database subscription, so a storm can churn Postgres connections and show up on Connections in Use. Broadcast and Presence channels do not touch Postgres, so a storm on those is purely a Realtime-service event. How do I confirm a rollback fixed it? Watch the line return to baseline. A clean, fast drop back to your normal band within a minute or two of a specific action (a rollback, a token rotation, a config change) is strong evidence that action addressed the cause. If the rate stays elevated after the rollback, the cause is elsewhere, often a client-side change that is already deployed to users’ browsers and will only clear as sessions cycle.

Tracked live in Vortex IQ Nerve Centre

Realtime Disconnect Rate (per min) is one of hundreds of KPI pulses Vortex IQ tracks across Supabase and 70+ other ecommerce connectors. Nerve Centre runs the detection layer; Vortex Mind investigates the cause when something moves; Ask Viq lets you interrogate any number in plain English. Start for free or book a demo to see this metric running on your own data.