# User Presence

User presence allows you to show when a user was last active and if they are online right now. This feature can be enabled or disabled per channel type in the [channel type settings](https://getstream.io/chat/docs/unreal/channel-features/).

## Listening to Presence Changes

To receive presence updates, you need to watch a channel or query channels with `presence: true`. This allows you to show a user as offline when they leave and update their status in real time.

```cpp label="Unreal"
// You need to be watching some channels/queries to be able to get presence events.
// Here are two different ways of doing that:

// 1. Watch a single channel with presence = true set
constexpr EChannelFlags AllFlags = EChannelFlags::Watch | EChannelFlags::State | EChannelFlags::Presence;
const FChannelProperties Properties{TEXT("messaging"), TEXT("unrealdevs")};
Client->QueryChannel(Properties, AllFlags);

// 2. Query some channels with 'presence' set
Client->QueryChannels(
  FFilter::Equal(TEXT("type"), TEXT("messaging")),  // Channel filter
  {},                         // Sort options
  AllFlags                      // Flags
);

// Finally, subscribe to presence to events
Client->On<FUserPresenceChangedEvent>(
  [](const FUserPresenceChangedEvent& Event)
  {
    // Handle change
  });
```

A users online status change can be handled via event delegation by subscribing to the `user.presence.changed` event the same you do for any other event.

## Presence Data Format

Whenever you read a user the presence data will look like this:

```js label="JavaScript"
{
  id: 'unique_user_id',
  online: true,
  status: 'Eating a veggie burger...',
  last_active: '2019-01-07T13:17:42.375Z'
}
```

<Admonition type="info">

The online field indicates if the user is online. The status field stores text indicating the current user status.

</Admonition>

<Admonition type="info">

The last_active field is updated when a user connects and then refreshed every 15 minutes.

</Admonition>

## Invisible

To mark your user as invisible, you can update your user to set the invisible property to _true_. Your user will remain invisible even if you disconnect and reconnect. You must explicitly set invisible to _false_ in order to become visible again.

```js label="Node.js"
// become invisible
await client.upsertUser({
  id: "unique_user_id",
  invisible: true,
});

// become visible
await client.upsertUser({
  id: "unique_user_id",
  invisible: false,
});
```

You can also set your user to invisible when connecting by setting the invisible property to _true_. You can also set a custom status message at the same time:

```cpp label="Unreal"
FUser User{TEXT("user-id")};
User.bInvisible = true;
const FString Token{TEXT("{{ chat_user_token }}")};
Client->ConnectUser( User, Token);
```

<Admonition type="info">

When invisible is set to _true,_ the current user will appear as offline to other users.

</Admonition>


---

This page was last updated at 2026-08-11T17:19:24.451Z.

For the most recent version of this documentation, visit [https://getstream.io/chat/docs/unreal/presence-format/](https://getstream.io/chat/docs/unreal/presence-format/).