Skip to content

Realtime presence has stopped working #1807

Description

@aristotelis96

Bug report

Realtime presence events (sync, join, leave) stopped firing on 05/03/2026 (or maybe 6th). This occurred without any changes to our application code.

Interestingly, the issue does not persist locally (using Supabase CLI/Docker), but it is consistent across our production and staging environments.

  • I confirm this is a bug with Supabase, not with my own application.
  • I confirm I have searched the Docs, GitHub Discussions, and Discord.

Describe the bug

  • The browser Network tab shows incoming WebSocket messages.
  • The Supabase Dashboard logs show presence events being tracked.
  • The high-level SDK listeners (e.g., .on('presence', { event: 'sync' }, ... )) simply never trigger.
  • We can "force" it to work by listening to the internal/undocumented presence_state and presence_diff events directly, though this causes TypeScript errors.

To Reproduce

Steps to reproduce the behavior, please provide code snippets or a repository:

  1. Implement realtime as described in the docs
  2. Try to run it with a deployed supabase instance

Expected behavior

Realtime presence should work according to the docs.

Versions:

We initially observed the issue with version "@supabase/supabase-js": "2.48.4" but we also had the issue with the latest version 2.98.0

Additional context

We are currently forced to use this implementation to keep the app running (ignoring any type errors), which suggests the underlying data is fine, but the SDK's event-matching logic is failing:

   const channelRoom = supabase.channel(channel, {
                config: { presence: { key: "", enabled: true } },
            })
            channelRoom

                .on("presence_state", {}, (event) => {
                    // Initial state
                    const items = Object.values(event)
                    const userIds = items.map((item) => item.metas[0]?.user)
                    userIds.forEach((userId) => dispatch(addUser({ channel, user: userId })))
                })
                .on("presence_diff", {}, (event) => {
                    const joinedUserIds = Object.values(event.joins).map((item) => item.metas[0]?.user)
                    joinedUserIds.forEach((id) => dispatch(addUser({ channel, user: id })))

                    const leftUserIds = Object.values(event.leaves).map((item) => item.metas[0]?.user)
                    leftUserIds.forEach((id) => dispatch(removeUser({ channel, user: id })))
                })
                .subscribe()

            setRoom(channelRoom)
        }
        subscribe()

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions