Bug report
A hosted Pro project's client opens a Realtime websocket and sends phx_join with a postgres_changes config, but the Realtime service never registers the subscription server-side. realtime.subscription stays empty and no logical replication slot is ever created, even while a client is actively subscribed on screen. Live updates never arrive; the app has to fall back to polling.
This looks like the same class of issue as #1747 (closed, "intermittent subscribe failures after idle / replication slot missing") and the still-open #1414 ("CHANNEL_ERROR after a few hours"), but here the subscription is never successfully established, not just intermittently.
Environment
Supabase hosted, Pro plan
Postgres-side fully configured and verified (see diagnostics)
Client: Phoenix v2 websocket protocol, phx_join with postgres_changes (event: UPDATE, schema: public, table: posts), heartbeat + exponential-backoff reconnect
Postgres-side diagnostics (all correct)
-- wal_level = logical
-- max_replication_slots = 5, max_wal_senders = 5 (0 in use)
SELECT name, setting FROM pg_settings
WHERE name IN ('wal_level','max_replication_slots','max_wal_senders');
-- publication: pubinsert/pubupdate/pubdelete all true, 8 tables
SELECT pubname, pubinsert, pubupdate, pubdelete FROM pg_publication
WHERE pubname='supabase_realtime';
-- every published table: REPLICA IDENTITY FULL + RLS enabled ✓
-- realtime schema healthy, migrations current, message partitions
-- auto-provisioned for upcoming days (Realtime infra is reaching the DB)
SELECT max(version) FROM realtime.schema_migrations;
The problem — measured while a client is actively subscribed on screen:
SELECT
(SELECT count() FROM realtime.subscription) AS active_subscriptions, -- 0
(SELECT count() FROM pg_replication_slots WHERE slot_name LIKE 'supabase_realtime%') AS rt_slots, -- 0
(SELECT count() FROM pg_stat_replication) AS walsenders, -- 0
(SELECT count() FROM pg_stat_activity WHERE backend_type='walsender') AS walsender_backends; -- 0
realtime.subscription = 0 and pg_replication_slots = 0 every time, regardless of which screen/channel is open. Earlier, two supabase_realtime% slots were briefly observed active=true for a couple of minutes, then disappeared with no client change — i.e. the channel works occasionally then stops, and now does not register at all.
Expected
When a client successfully joins a postgres_changes channel, realtime.subscription should have a row for that subscription and a logical replication slot should be created/active for as long as the client is subscribed.
Actual
The websocket connects, phx_join is sent, but no subscription row and no replication slot are ever created. No client-side error is reliably surfaced (no CHANNEL_ERROR), it simply never goes live.
Questions
Is this a recurrence/regression of #1747, or a separate failure mode where phx_join for postgres_changes is accepted at the socket level but never materializes a realtime.subscription / replication slot?
What server-side state should we capture during a failed join to give you something actionable (relevant realtime.* tables, logs to request from support)?
Is there a known condition where the Realtime node accepts the websocket but fails to create the subscription/slot silently (no CHANNEL_ERROR to the client)?
Happy to provide more diagnostics or logs on request.
Thanks in advance
Describe the bug
A clear and concise description of what the bug is.
To Reproduce
Steps to reproduce the behavior, please provide code snippets or a repository:
- Go to '…'
- Click on '…'
- Scroll down to '…'
- See error
Expected behavior
A clear and concise description of what you expected to happen.
Screenshots
If applicable, add screenshots to help explain your problem.
System information
- OS: [e.g. macOS, Windows]
- Browser (if applies) [e.g. chrome, safari]
- Version of supabase-js: [e.g. 6.0.2]
- Version of Node.js: [e.g. 10.10.0]
Additional context
Add any other context about the problem here.
Bug report
A hosted Pro project's client opens a Realtime websocket and sends phx_join with a postgres_changes config, but the Realtime service never registers the subscription server-side. realtime.subscription stays empty and no logical replication slot is ever created, even while a client is actively subscribed on screen. Live updates never arrive; the app has to fall back to polling.
This looks like the same class of issue as #1747 (closed, "intermittent subscribe failures after idle / replication slot missing") and the still-open #1414 ("CHANNEL_ERROR after a few hours"), but here the subscription is never successfully established, not just intermittently.
Environment
Supabase hosted, Pro plan
Postgres-side fully configured and verified (see diagnostics)
Client: Phoenix v2 websocket protocol, phx_join with postgres_changes (event: UPDATE, schema: public, table: posts), heartbeat + exponential-backoff reconnect
Postgres-side diagnostics (all correct)
-- wal_level = logical
-- max_replication_slots = 5, max_wal_senders = 5 (0 in use)
SELECT name, setting FROM pg_settings
WHERE name IN ('wal_level','max_replication_slots','max_wal_senders');
-- publication: pubinsert/pubupdate/pubdelete all true, 8 tables
SELECT pubname, pubinsert, pubupdate, pubdelete FROM pg_publication
WHERE pubname='supabase_realtime';
-- every published table: REPLICA IDENTITY FULL + RLS enabled ✓
-- realtime schema healthy, migrations current, message partitions
-- auto-provisioned for upcoming days (Realtime infra is reaching the DB)
SELECT max(version) FROM realtime.schema_migrations;
The problem — measured while a client is actively subscribed on screen:
SELECT
(SELECT count() FROM realtime.subscription) AS active_subscriptions, -- 0
(SELECT count() FROM pg_replication_slots WHERE slot_name LIKE 'supabase_realtime%') AS rt_slots, -- 0
(SELECT count() FROM pg_stat_replication) AS walsenders, -- 0
(SELECT count() FROM pg_stat_activity WHERE backend_type='walsender') AS walsender_backends; -- 0
realtime.subscription = 0 and pg_replication_slots = 0 every time, regardless of which screen/channel is open. Earlier, two supabase_realtime% slots were briefly observed active=true for a couple of minutes, then disappeared with no client change — i.e. the channel works occasionally then stops, and now does not register at all.
Expected
When a client successfully joins a postgres_changes channel, realtime.subscription should have a row for that subscription and a logical replication slot should be created/active for as long as the client is subscribed.
Actual
The websocket connects, phx_join is sent, but no subscription row and no replication slot are ever created. No client-side error is reliably surfaced (no CHANNEL_ERROR), it simply never goes live.
Questions
Is this a recurrence/regression of #1747, or a separate failure mode where phx_join for postgres_changes is accepted at the socket level but never materializes a realtime.subscription / replication slot?
What server-side state should we capture during a failed join to give you something actionable (relevant realtime.* tables, logs to request from support)?
Is there a known condition where the Realtime node accepts the websocket but fails to create the subscription/slot silently (no CHANNEL_ERROR to the client)?
Happy to provide more diagnostics or logs on request.
Thanks in advance
Describe the bug
A clear and concise description of what the bug is.
To Reproduce
Steps to reproduce the behavior, please provide code snippets or a repository:
Expected behavior
A clear and concise description of what you expected to happen.
Screenshots
If applicable, add screenshots to help explain your problem.
System information
Additional context
Add any other context about the problem here.