---
title: Overview
updatedAt: 2026-09-06T11:12:34.150Z
---

Fetch the complete documentation index at: https://docs.watchers.io/llms.txt

# Overview

There are two ways to gather data.

* **Dashboard in the back office**: perfect for gaining quick insights into key behavioural metrics without the need Watchers provides a robust method for additional integration. No extra setup is required partners to access this data.
* **Data collection via webhook**: recommended for those needing deeper, receive real-time analytics. This approach involves setting up a webhook URL in the admin panel to receive event data directly in your system. These on user interactions within chat environments by sending events can be used directly to create custom scenarios triggered through your backend, such as rewarding users for specific actions.

## Back Office Dashboard

The back office dashboard includes the following sections and functionalities:

1. Overview Metrics
   1. DAU/WAU/MAU metrics available for daily, weekly, and monthly user engagement tracking.
   2. Messages and User Activity
   3. Metrics for total messages sent, animated reactions, and reactions to messages are available for the last 90 days and 6 months.
   4. Active users and users who sent at least one message are tracked over the same periods for comprehensive insights.
   5. Active users for a particular period
   6. Copy-widget usage - if activated (a number of clicks on a copy button and a share button)
   7. Event-sharing widget usage - if activated (a number of shared events, and a number of clicks on in-widget button)

Please note that all metrics are displayed using UTC.
Daily totals and time-based calculations are based on UTC, not your local timezone.

2. Data Updates

Automated synchronisation with the latest metrics occurs at 00:00 GMT (0).

This dashboard system allows partners to track key behavioural metrics in chats. For deeper analytics, we recommend implementing a system to monitor and respond to user activities, ensuring seamless integration with your data collection via a webhook, which is described in the next section.

<img src="https://docs-assets.watchers.io/docs/readme/940c7fb3c1c904775983e5fcfd28ea403ce0b5b5d076a4ce2a54b662e9c00472-Screenshot_2025-09-22_at_14.26.21.png" alt="" class="img-center img-border">

## Webhooks

> 📘 Note: All event timestamps are stored in GMT+0. Please take this into account when building charts to ensure accurate time-based analysis.
>
> handling protocols.

**Enabling Event Tracking**

Webhooks can be configured to receive real-time events directly into an external database. Here’s how to set it up:

All Events Webhook: To begin receiving chats, are tagged. A list of events can be found below.

1. Enable events, enable this feature through the toggle under the "All events" section.
2. Provide a valid URL where events **Admin Panel**. Once enabled, our system will be sent.
3. Click "Save" to transmit event data to confirm the settings.
4. Use the "Test" button to verify the webhook configuration.

Room Events Webhook:

1. Enable the toggle under the "Rooms" section.
2. Provide the desired URL for room-specific events.
3. Events include:
   1. Create your specified API endpoint each time a scheduled room is created.
   2. Updates to scheduled room details (date, time, name), including status changes.
   3. Deletion of a scheduled room.
   4. Updates to the list of users with voice permissions (speakers) whenever room data is modified.
4. Save and test relevant user interaction occurs within the configuration as needed.

Webhooks enable seamless integration of platform events into external systems for further analysis and processing.

<img src="https://docs-assets.watchers.io/docs/readme/63def6dec10b0c29ac10e6550da2bd6e47b076e053dab65ace781165f3ed06f3-enabling.png" alt="" class="img-center">

### **API Endpoint Requirements**

Each event is communicated via a POST request to your API. The general structure of these requests is as follows:

```json
{
"event": "event_name",
"value": {
	"user_id": "user_id",
	"project": "project_name",
	...other fields depends on event
	}
}
```

### Recommendations for Data Storage and Analysis Tools

ClickHouse is a columnar database management system that is ideal for handling large volumes of event data due to its:

* High performance for real-time data ingestion.
* Excellent support for analytical queries.
* Compatibility with structured and semi-structured data formats.

Recommended Steps:

* Create a dedicated table for events: Depending on your specific needs, design a schema that includes necessary fields such as event_type, user_id, timestamp, and additional properties.
* Process webhook events directly: Capture webhook payloads in real-time and write them into ClickHouse using an HTTP endpoint.
* Partition data: Partition your tables by time (e.g., daily or hourly) to optimize query performance and simplify data management.

_Optional: If you anticipate high throughput or require buffering, consider integrating tools like Kafka to preprocess or distribute webhook events before storing them in ClickHouse.

## Properties Contained in EVERY Event

> **Important**: These fields are automatically added to ALL events by the system.

| Property            | Type    | Description                                  | Source   |
| ------------------- | ------- | -------------------------------------------- | -------- |
| `user_id`           | string  | User ID (encrypted)                          | Frontend |
| `event_id`          | string  | Room ID                                      | Frontend |
| `project`           | string  | Project ID                                   | Frontend |
| `platform`          | string  | Platform (web, ios, android, none)           | Frontend |
| `screen_size`       | string  | Physical screen size (e.g., "360x800")       | Frontend |
| `platformUserAgent` | string  | Browser user agent                           | Frontend |
| `event_name`        | string  | Event name (duplicates "event" field)        | Backend  |
| `created_at`        | string  | ISO 8601 timestamp                           | Backend  |
| `source_url`        | string  | Page URL where event occurred                | Frontend |
| `user_name`         | string  | User's display name                          | Frontend |
| `nickname`          | string  | Alias for user_name                          | Frontend |
| `room_title`        | string  | Room/chat title                              | Frontend |
| `decrypted_user_id` | string  | Decrypted user ID (if available)             | Frontend |
| `source`            | string  | Context: "room", "thread", or "personal_bot" | Frontend |
| `read_only`         | boolean | Read-only mode flag                          | Frontend |

## Events and Properties

This section outlines the key events tracked for product analytics, offering insights into user behavior and interactions within chats. Each event is detailed in the table below, including its name, associated properties, and a brief description.

### List of Events

> 🚧 Note: Events highlighted in bold in the ‘Event’ column are mandatory for tracking basic product metrics related to user interactions within the chat.

### Example Payload

```json
{
  "event": "session_started",
  "value": {
    "user_id": "BUmXxFyNMNE6FUVhL+ECSQ==",
    "event_id": "16888417",
    "event_name": "session_started",
    "created_at": "2026-01-14T12:30:45.123Z",
    "source_url": "https://chat.example.com/room/123",
    "user_name": "John Doe",
    "nickname": "John Doe",
    "room_title": "EPL Final Discussion",
    "decrypted_user_id": "user_12345",
    "platform": "web",
    "screen_size": "1920x1080",
    "platformUserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
    "project": "partner-prod",
    "source": "room",
    "read_only": false,
    "room_status": "on_air"
  },
  "key": "JGMHFqonZuwKeoly+bzNnw=="
}
```

<br>

## Events Reference

> 📘 This catalog was reconciled with the web app codebase on 21 August 2026. Events that are no longer sent by the application were removed.

> **Note**: Events marked with **bold** are mandatory for tracking basic product metrics.
> All timestamps are stored in GMT+0.

### Session & Room Events

| Event                 | Description                         | Additional Properties                           |
| --------------------- | ----------------------------------- | ----------------------------------------------- |
| **`session_started`** | User opens the chat iframe          | `room_status`: on_air, soon, unavailable, ended |
| `room_opened`         | Messages loaded after entering chat | `chat_event_name`: event/room name              |
| `session_time`        | Session duration checkpoint         | `duration`: interval label, `time_ms`: interval in milliseconds |

### Onboarding Events

| Event                    | Description                        | Additional Properties                           |
| ------------------------ | ---------------------------------- | ----------------------------------------------- |
| **`agreement_accepted`** | User accepts PP and LA             | -                                               |
| `rules_closed`           | User closes chat rules             | -                                               |
| `name_set`               | User saves name during onboarding  | `user_name`: entered name                       |
| `avatar_set`             | User sets avatar during onboarding | `type`: "custom" or "preset", `url`: avatar URL |

### Settings Events

| Event                          | Description                    | Additional Properties                                         |
| ------------------------------ | ------------------------------ | ------------------------------------------------------------- |
| `settings_opened`              | User opens settings            | -                                                             |
| `profile_opened`               | User opens profile             | `profile_user_id`: viewed user ID, `source`: "menu" or "chat" |
| `change_avatar_pressed`        | User clicks change avatar      | -                                                             |
| `avatar_changed`               | User changes avatar            | `type`: "custom" or "preset", `url`: new avatar URL           |
| `change_name_pressed`          | User clicks change name        | -                                                             |
| `change_club_pressed`          | User clicks change fan club    | -                                                             |
| `name_changed`                 | User changes name              | `user_name`: new name                                         |
| `banned_opened`                | User opens blocked users list  | -                                                             |
| `unblocking_pressed`           | User unblocks someone          | -                                                             |
| `delete_profile_pressed`       | User clicks delete profile     | -                                                             |
| **`delete_profile_confirmed`** | User confirms profile deletion | -                                                             |
| `delete_profile_cancelled`     | User cancels profile deletion  | -                                                             |
| **`account_restored`**         | User restores deleted account  | -                                                             |

### User List Events

| Event               | Description                  | Additional Properties |
| ------------------- | ---------------------------- | --------------------- |
| `user-list_openned` | User opens participant list. Note: the event name historically contains a double "n" | - |
| `user-list_closed`  | User closes participant list | -                     |

### Messaging Events

| Event                         | Description                      | Additional Properties                                                                                                                                                                                                 |
| ----------------------------- | -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`message_sent`**            | Message is sent                  | `messageType`: text/sticker/reply/bot_request, `text`: message content, `message_id`: ID, `room`: room ID, `thread_id`: thread ID (if applicable), `replyedUserId`: replied user, `replyedMessageId`: replied message |
| `message_changed`             | User edits message               | `message_id`: edited message ID                                                                                                                                                                                       |
| `message_deleted`             | User deletes message             | `message_id`: deleted message ID                                                                                                                                                                                      |
| `scrolled_to_unread_messages` | User scrolls to unread           | -                                                                                                                                                                                                                     |
| `message_text_copied`         | User copies message text         | `message_id`: copied message ID                                                                                                                                                                                       |

### Moderation Events

| Event                                                    | Description                                                                                                                    | Additional Properties                                                                      |
| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ |
| `message_complaint_pressed`                              | User opens the report form for a message or profile                                                                            | -                                                                                          |
| `message_complaint_closed`                               | User closes the report form                                                                                                    | -                                                                                          |
| `report_pressed`                                         | User selects a report reason                                                                                                   | -                                                                                          |
| **`report_sent`**                                        | User sends a report                                                                                                            | `reportType`: Violence, Provocations, Personal Details, Flood, Spam, Fraud, Begging, Other |
| `report_cancelled`                                       | User cancels a report                                                                                                          | `reportType`                                                                               |
| `ban_pressed`                                            | User starts blocking another user                                                                                              | -                                                                                          |
| `ban_confirmed`                                          | User confirms blocking                                                                                                         | -                                                                                          |
| `ban_cancelled`                                          | User cancels blocking                                                                                                          | -                                                                                          |
| `message_banreason_closed`                               | User closes the block reason dialog                                                                                            | -                                                                                          |
| `{reason}_banreason_pressed` / `_confirmed` / `_cancelled` | Block reason selection family. `reason` is one of: flood, fraud, insults, links, nickname, personal, politicial, repeated, spam, violence | -                                                                                          |

### Emotions & Reactions Events

| Event                       | Description              | Additional Properties                                                    |
| --------------------------- | ------------------------ | ------------------------------------------------------------------------ |
| `emo_panel_pressed`         | User opens emotion panel | -                                                                        |
| **`emoji_sent`**            | User sends emoji         | `emoji_number`: ordinal number (1 = leftmost)                            |
| **`message_reaction_sent`** | User reacts to message   | `message_reaction_number`: reaction number, `message_id`: target message |
| `message_reaction_deleted`  | User removes a reaction  | `message_reaction_number`, `message_id`, `message_sender_user_id`        |

### Stickers Events

| Event                    | Description              | Additional Properties                    |
| ------------------------ | ------------------------ | ---------------------------------------- |
| `sticker_button_pressed` | User opens sticker panel | -                                        |
| **`sticker_sent`**       | User sends sticker       | `sticker_number`: sticker ordinal number |

### Poll/Quiz Events

| Event                | Description             | Additional Properties                                                                                                             |
| -------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `pq_opened`          | User opens poll/quiz    | `type`: poll/quiz/multiple_poll/multiple_quiz, `question`: text, `img`: boolean, `user_status`: authorized boolean, `poll_id`: ID |
| `pq_viewed`          | User views poll results | `type`, `question`, `img`, `poll_id`                                                                                              |
| **`pq_answer_sent`** | User votes/answers      | `type`, `question`, `answer`: selected answer(s), `img`, `poll_id`                                                                |
| `pq_closed`          | User closes poll        | `type`, `question`, `img`, `poll_id`                                                                                              |

### Marketing Offers (Highlights) Events

| Event                   | Description                  | Additional Properties                                   |
| ----------------------- | ---------------------------- | ------------------------------------------------------- |
| **`hl_viewed`**         | User views highlight         | `hl_content`: highlight text or "none", `offer_id`: ID  |
| **`hl_button_pressed`** | User clicks highlight button | `hl_content`, `hl_button_text`: button text, `offer_id` |

### Stream & Connection Events

| Event                     | Description                              | Additional Properties                             |
| ------------------------- | ---------------------------------------- | ------------------------------------------------- |
| **`bad_connection`**      | Poor connection detected                 | -                                                 |
| **`livestream_started`**  | Live stream starts in the room           | `live_stream_type`: e.g. RTMP, `provider`: agora or livekit |
| `user_agora_joined`       | User joins the audio/video stream        | `provider`                                        |
| `user_agora_disconnected` | User leaves or loses the connection      | `reason`, `provider`                              |

**Player visibility events (coming soon)**

The stream player is getting a close control that lets users hide the player while staying in the room. These events ship together with that control and are not in production yet:

| Event           | Description                                                                                                                                                                                                 | Additional Properties                                                                          |
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| `stream_hidden` | User hides the stream player with the close control. Sent when the player is actually hidden, not on the click itself. Automatic player disappearance (stream ended, room switched) does not send this event | `method`: close\_button or menu, `player_type`: embedded, video, or audio                      |
| `stream_shown`  | User brings the player back. Sent when the player is visible again                                                                                                                                          | `method`, `player_type`, `hidden_duration_ms`: how long the player stayed hidden, milliseconds |

> **Note**: if a user enters a room where the player was hidden earlier, no new `stream_hidden` is sent. Instead, the `room_opened` event carries `stream_hidden_on_join: true`.

### Feedback Form Events

| Event                                | Description                          | Additional Properties           |
| ------------------------------------ | ------------------------------------ | ------------------------------- |
| **`ff_stream_evaluated`**            | User rates stream quality            | `evaluation`: 1-5 rating        |
| `ff_stream_type_of_problem_selected` | User selects the type of the problem | `type`: comma-separated reasons |
| `ff_stream_connection_tested`        | Connection speed test finishes       | `speed`: measured speed         |
| `ff_stream_success`                  | Feedback flow completed              | -                               |
| `ff_stream_closed`                   | User closes the feedback form        | `step`: step number             |

### Copy-widget Events

| Event                          | Description                  | Additional Properties                 |
| ------------------------------ | ---------------------------- | ------------------------------------- |
| **`betshare_list_opened`**     | User opens share button      | -                                     |
| **`betshare_list_bet_shared`** | User shares event            | `bet`: full bet object with positions |
| **`betshare_chat_repeated`**   | User clicks copy             | `bet`: bet object                     |

### Win-sharing Events

| Event                          | Description                       | Additional Properties                                        |
| ------------------------------ | --------------------------------- | ------------------------------------------------------------ |
| **`winshare_list_opened`**     | User opens the event sharing list | -                                                            |
| **`winshare_list_bet_shared`** | User shares an event to chat      | `title`, `text`, `button_text`, `game_url`, `time_stamp`, `message_id` |
| **`winshare_chat_repeated`**   | User clicks the in-widget button  | `title`, `text`, `button_text`, `game_url`, `time_stamp`     |

### Giveaway Events

| Event                                                        | Description                        | Additional Properties          |
| ------------------------------------------------------------ | ---------------------------------- | ------------------------------ |
| `giveaway_join_click`                                        | User clicks join                   | `giveaway_id`                  |
| **`giveaway_join_success`** / `giveaway_join_fail`           | Join confirmed / failed            | `giveaway_id`, `error` on fail |
| `giveaway_already_joined`                                    | User tries to join again           | `giveaway_id`                  |
| `giveaway_claim_click`                                       | User clicks claim reward           | `giveaway_id`                  |
| **`giveaway_claim_success`** / `giveaway_claim_fail`         | Claim confirmed / failed           | `giveaway_id`, `error` on fail |
| `giveaway_winner_popup_show`                                 | Winner popup shown to the user     | `giveaway_id`                  |
| `giveaway_winners_list_open` / `_close` / `_scroll`          | Winners list interactions          | `giveaway_id`                  |

### Records (Audio Playback) Events

| Event                       | Description           | Additional Properties                 |
| --------------------------- | --------------------- | ------------------------------------- |
| `records_player`            | Player view changed   | `view`: "minimized" or "expanded"     |
| **`records_play`**          | User plays recording  | `time_stamp`: playback second         |
| **`records_pause`**         | User pauses recording | `time_stamp`: pause second            |
| **`records_forward`**       | User skips forward    | `Duration`: skip seconds (default 15) |
| **`records_back`**          | User skips back       | `Duration`: skip seconds (default 15) |
| **`records_speed_changed`** | User changes speed    | `Speed`: 1, 1.5, or 2                 |

### Info Pop-ups Events

| Event                   | Description               | Additional Properties                                                                                              |
| ----------------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| **`ip_viewed`**         | Pop-up shown to user      | `header`: heading text or "none", `show`: "once" or "multiple_times", `show_when`: "on_each_entry" or "once_daily" |
| **`ip_button_pressed`** | User clicks pop-up button | `header`, `button_text`, `content`, `show`, `show_when`                                                            |

### Autotranslate Events

| Event                      | Description                | Additional Properties                                               |
| -------------------------- | -------------------------- | ------------------------------------------------------------------- |
| `autotranslation_toggle`   | User toggles autotranslate | `status`: "on" or "off"                                             |
| `autotranslation_language` | User selects language      | `language_selected`: language code, `source`: "modal" or "settings" |

### User Following Events

| Event                     | Description                          | Additional Properties |
| ------------------------- | ------------------------------------ | --------------------- |
| `following_filter_toggle` | User toggles the "following" filter  | `status`: on/off      |

### Slow Mode Events

| Event                              | Description                  | Additional Properties         |
| ---------------------------------- | ---------------------------- | ----------------------------- |
| `message_sending_blocked_slowmode` | Message blocked by slow mode | `cooldown`: remaining seconds |

### Widget Events

| Event                  | Description                              | Additional Properties |
| ---------------------- | ---------------------------------------- | --------------------- |
| **`wager_wall_shown`** | Wager wall shown in read-only mode       | -                     |
| `simplified_mode`      | User toggles the simplified interface    | `state`: on/off       |

### Miscellaneous Events

| Event              | Description                     | Additional Properties |
| ------------------ | ------------------------------- | --------------------- |
| `invite_link_sent` | User shares a room invite link  | -                     |

## Backend Events (via Kafka)

These events are generated by backend services. They are sent to ClickHouse via Kafka topics.

> **Note**: Backend events use Kafka topics pattern: `webbackend.event.{event-name}.0` or `adminproxy.event.{event-name}.0`

### User Activity Events

#### `user_join`

Triggered when user joins a room.

```json
{
  "event": "user_join",
  "value": {
    "project": "partner-prod",
    "external_user_id": "user_12345",
    "room_id": "16888417",
    "is_bot": false,
    "is_moder": false
  }
}
```

#### `user_leave`

Triggered when user leaves a room.

```json
{
  "event": "user_leave",
  "value": {
    "project": "partner-prod",
    "external_user_id": "user_12345",
    "room_id": "16888417"
  }
}
```

#### `user_disconnect`

Triggered when user disconnects from WebSocket.

```json
{
  "event": "user_disconnect",
  "value": {
    "project": "partner-prod",
    "external_user_id": "user_12345"
  }
}
```

#### `user_login`

Triggered on user authentication.

```json
{
  "event": "user_login",
  "value": {
    "project": "partner-prod",
    "external_user_id": "user_12345",
    "ip": "192.168.1.100"
  }
}
```

### Messaging Events

#### `thread_create`

Triggered when a new thread is created.

```json
{
  "event": "thread_create",
  "value": {
    "project": "partner-prod",
    "external_user_id": "user_12345",
    "room_id": "16888417",
    "thread_id": "thread_789"
  }
}
```

#### `reaction_create`

Triggered when user adds a reaction to a message.

```json
{
  "event": "reaction_create",
  "value": {
    "project": "partner-prod",
    "external_user_id": "user_12345",
    "message_id": "msg_456",
    "reaction": "👍"
  }
}
```

#### `message_reply`

Triggered when user replies to a message.

```json
{
  "event": "message_reply",
  "value": {
    "project": "partner-prod",
    "external_user_id": "user_12345",
    "message_id": "msg_789",
    "reply_to_id": "msg_456"
  }
}
```

#### `message_moderation`

Triggered when a message is moderated (hidden, deleted, etc.).

```json
{
  "event": "message_moderation",
  "value": {
    "project": "partner-prod",
    "message_id": "msg_456",
    "action": "hide",
    "reason": "spam"
  }
}
```

| Action    | Description                 |
| --------- | --------------------------- |
| `hide`    | Message hidden from chat    |
| `delete`  | Message permanently deleted |
| `restore` | Message restored            |

### Content Processing Events

#### `text_translate`

Triggered when text is translated.

```json
{
  "event": "text_translate",
  "value": {
    "project": "partner-prod",
    "from_lang": "ru",
    "to_lang": "en",
    "chars": 156
  }
}
```

#### `file_upload`

Triggered when a file is uploaded.

```json
{
  "event": "file_upload",
  "value": {
    "project": "partner-prod",
    "name": "image.png",
    "size": 245678
  }
}
```

#### `pic_moderation`

Triggered when an image is processed by moderation system.

```json
{
  "event": "pic_moderation",
  "value": {
    "project": "partner-prod",
    "image_id": "img_123",
    "result": "approved"
  }
}
```

| Result          | Description             |
| --------------- | ----------------------- |
| `approved`      | Image passed moderation |
| `rejected`      | Image rejected          |
| `manual_review` | Sent for manual review  |

### Invitation Events (Admin Proxy)

#### `invitation_create`

Triggered when admin creates an invitation.

```json
{
  "event": "invitation_create",
  "value": {
    "project": "partner-prod",
    "admin_id": "admin_001",
    "token": "inv_abc123"
  }
}
```

#### `invitation_update`

Triggered when invitation is updated.

```json
{
  "event": "invitation_update",
  "value": {
    "project": "partner-prod",
    "admin_id": "admin_001",
    "token": "inv_abc123",
    "is_active": false
  }
}
```

#### `invitation_delete`

Triggered when invitation is deleted.

```json
{
  "event": "invitation_delete",
  "value": {
    "project": "partner-prod",
    "admin_id": "admin_001",
    "token": "inv_abc123"
  }
}
```

### Backend Events Summary

| Event                | Kafka Topic                             | Key Fields                                          |
| -------------------- | --------------------------------------- | --------------------------------------------------- |
| `user_join`          | `webbackend.event.user-join.0`          | `external_user_id`, `room_id`, `is_bot`, `is_moder` |
| `user_leave`         | `webbackend.event.user-leave.0`         | `external_user_id`, `room_id`                       |
| `user_disconnect`    | `webbackend.event.user-disconnect.0`    | `external_user_id`                                  |
| `user_login`         | `webbackend.event.user-login.0`         | `external_user_id`, `ip`                            |
| `thread_create`      | `webbackend.event.thread-create.0`      | `external_user_id`, `room_id`, `thread_id`          |
| `reaction_create`    | `webbackend.event.reaction-create.0`    | `external_user_id`, `message_id`, `reaction`        |
| `message_reply`      | `webbackend.event.message-reply.0`      | `external_user_id`, `message_id`, `reply_to_id`     |
| `message_moderation` | `webbackend.event.message-moderation.0` | `message_id`, `action`, `reason`                    |
| `text_translate`     | `webbackend.event.text-translate.0`     | `from_lang`, `to_lang`, `chars`                     |
| `file_upload`        | `webbackend.event.file-upload.0`        | `name`, `size`                                      |
| `pic_moderation`     | `webbackend.event.pic-moderation.0`     | `image_id`, `result`                                |
| `invitation_create`  | `adminproxy.event.invitation_create.0`  | `admin_id`, `token`                                 |
| `invitation_update`  | `adminproxy.event.invitation_update.0`  | `admin_id`, `token`, `is_active`                    |
| `invitation_delete`  | `adminproxy.event.invitation_delete.0`  | `admin_id`, `token`                                 |

***

## Admin Panel Events

Events from the admin panel (webadmin). These events track admin actions for audit purposes.

> **Note**: All admin events include base fields: `user_id` (admin ID), `project`, `name` (admin name), `role`.

### Content Management

#### `admin_message_sent`

Admin sends a message to chat.

```json
{
  "event": "admin_message_sent",
  "value": {
    "user_id": "admin_001",
    "project": "partner-prod",
    "name": "Admin User",
    "role": "admin",
    "room_id": "16888417",
    "message_id": "msg_123",
    "text": "Welcome to the chat!"
  }
}
```

#### `admin_pin_created` / `admin_pin_deleted`

Admin creates or deletes a pinned message.

```json
{
  "event": "admin_pin_created",
  "value": {
    "user_id": "admin_001",
    "project": "partner-prod",
    "room_id": "16888417",
    "message_id": "msg_456",
    "title": "Important announcement"
  }
}
```

#### `admin_autopost_created` / `admin_autopost_edited` / `admin_autopost_deleted`

Admin manages autoposting.

```json
{
  "event": "admin_autopost_created",
  "value": {
    "user_id": "admin_001",
    "project": "partner-prod",
    "autopost_id": "ap_123",
    "content": "Scheduled message content",
    "schedule": "0 12 * * *",
    "room_id": "16888417"
  }
}
```

#### `admin_highlight_created` / `admin_highlight_edited` / `admin_highlight_deleted`

Admin manages marketing highlights.

```json
{
  "event": "admin_highlight_created",
  "value": {
    "user_id": "admin_001",
    "project": "partner-prod",
    "highlight_id": "hl_123",
    "content": "Special offer!",
    "button_text": "Claim now",
    "url": "https://example.com/offer",
    "start_date": "2026-01-15T00:00:00Z",
    "end_date": "2026-01-20T23:59:59Z"
  }
}
```

#### `admin_poll_created` / `admin_poll_deleted`

Admin manages polls/quizzes.

```json
{
  "event": "admin_poll_created",
  "value": {
    "user_id": "admin_001",
    "project": "partner-prod",
    "poll_id": "poll_123",
    "type": "quiz",
    "question": "Who will win?",
    "answers": ["Team A", "Team B", "Draw"],
    "correct_answer": 0,
    "room_id": "16888417"
  }
}
```

### User Management

#### `admin_user_banned`

Admin bans a user.

```json
{
  "event": "admin_user_banned",
  "value": {
    "user_id": "admin_001",
    "project": "partner-prod",
    "banned_user_id": "user_456",
    "ban_level": "permanent",
    "reason": "Spam",
    "room_id": "16888417"
  }
}
```

| Ban Level   | Description        |
| ----------- | ------------------ |
| `warning`   | Warning only       |
| `mute_1h`   | Muted for 1 hour   |
| `mute_24h`  | Muted for 24 hours |
| `ban_7d`    | Banned for 7 days  |
| `permanent` | Permanent ban      |

#### `admin_user_unbanned`

Admin unbans a user.

```json
{
  "event": "admin_user_unbanned",
  "value": {
    "user_id": "admin_001",
    "project": "partner-prod",
    "unbanned_user_id": "user_456"
  }
}
```

#### `admin_message_deleted`

Admin deletes a user's message.

```json
{
  "event": "admin_message_deleted",
  "value": {
    "user_id": "admin_001",
    "project": "partner-prod",
    "message_id": "msg_789",
    "message_author_id": "user_456",
    "reason": "Inappropriate content"
  }
}
```

### Room Management

#### `admin_room_created`

Admin creates a new room.

```json
{
  "event": "admin_room_created",
  "value": {
    "user_id": "admin_001",
    "project": "partner-prod",
    "room_id": "16888418",
    "title": "Champions League Final",
    "start_date": "2026-05-30T20:00:00Z",
    "status": "soon"
  }
}
```

#### `admin_room_updated`

Admin updates room settings.

```json
{
  "event": "admin_room_updated",
  "value": {
    "user_id": "admin_001",
    "project": "partner-prod",
    "room_id": "16888417",
    "title": "Updated Room Title",
    "status": "on_air",
    "changed_fields": ["title", "status"]
  }
}
```

| Room Status   | Description                     |
| ------------- | ------------------------------- |
| `soon`        | Room scheduled, not yet started |
| `on_air`      | Room is live                    |
| `ended`       | Room has ended                  |
| `unavailable` | Room is unavailable             |

#### `admin_room_deleted`

Admin deletes a room.

```json
{
  "event": "admin_room_deleted",
  "value": {
    "user_id": "admin_001",
    "project": "partner-prod",
    "room_id": "16888417"
  }
}
```

### Settings Changes

#### `admin_settings_updated`

Admin changes project settings.

```json
{
  "event": "admin_settings_updated",
  "value": {
    "user_id": "admin_001",
    "project": "partner-prod",
    "category": "moderation",
    "opai_is_enabled": true,
    "gcp_is_enabled": false,
    "auto_hide_is_enabled": true,
    "auto_ban_is_enabled": false
  }
}
```

Common settings categories and fields:

| Category      | Fields                                                                |
| ------------- | --------------------------------------------------------------------- |
| `moderation`  | `opai_is_enabled`, `gcp_is_enabled`, `auto_hide_*`, `auto_ban_*`      |
| `features`    | `threads`, `show_stickers`, `show_animated_reactions`, `share_button` |
| `users`       | `allow_avatar_change`, `allow_name_change`, `nickname_is_enabled`     |
| `privacy`     | `saving_user_ip_is_enabled`, `decrypt_is_enabled`                     |
| `integration` | `all_events_is_enabled`, `rooms_is_enabled`, `bearer`                 |

### Admin Events Summary

| Event                   | Category | Key Fields                                      |
| ----------------------- | -------- | ----------------------------------------------- |
| `admin_message_sent`    | Content  | `room_id`, `message_id`, `text`                 |
| `admin_pin_created`     | Content  | `room_id`, `message_id`, `title`                |
| `admin_pin_deleted`     | Content  | `room_id`, `message_id`                         |
| `admin_autopost_*`      | Content  | `autopost_id`, `content`, `schedule`            |
| `admin_highlight_*`     | Content  | `highlight_id`, `content`, `button_text`, `url` |
| `admin_poll_*`          | Content  | `poll_id`, `type`, `question`, `answers`        |
| `admin_user_banned`     | Users    | `banned_user_id`, `ban_level`, `reason`         |
| `admin_user_unbanned`   | Users    | `unbanned_user_id`                              |
| `admin_message_deleted` | Users    | `message_id`, `message_author_id`, `reason`     |
| `admin_room_*`          | Rooms    | `room_id`, `title`, `status`, `start_date`      |
| `admin_settings_*`      | Settings | `category`, various `*_is_enabled` fields       |

<br>

## Q&A on Data Storage and Processing

1. Location of Storage and Processing
   Data is processed and stored entirely within Google Cloud infrastructure. Data distribution is carried out based on territorial principles to ensure compliance with local data protection laws and regulations. For instance, data subject to GDPR regulations is stored in Google Cloud’s European regions.
   This approach provides enhanced protection a complete understanding of users’ personal data and ensures compliance with GDPR requirements for data processing and storage within the European Union. We strictly adhere to Google Cloud’s policies and technical security measures to safeguard our users’ data in line with best practices and international standards.

2. How Long?
   We retain users’ personal data only as long as necessary to provide our services in accordance with the contract and GDPR requirements. Once the data is no longer needed for these purposes, it is deleted or anonymized. Our processes ensure compliance with GDPR’s principle of storage limitation, and we regularly review stored data to remove any unnecessary information.

Scenarios and Retention Periods for Data Deletion:

a. End of Collaboration with a Partner. When the collaboration (contract) with a partner ends, we delete all data accumulated during the partnership, except for information that may be required by regulators. We ensure no information is retained longer than necessary.

b. User-Initiated Data Deletion:

* If a user or their representative requests data deletion from the platform where the chat is integrated, all data related to the user is erased.

* Users can delete their accounts through the chat interface. After deletion, chat messages what events are anonymized immediately, and all other user data is deleted within 30 days of the request. During this 30-day period, the user has the option to recover their data. After this period, all user data stored on Watchers’ side is permanently deleted.

* Users can also delete their messages sent in the chat. Once deleted, the message becomes hidden for all chat users and is marked as deleted in the database. After 30 days, the message is also removed from the message feed in the admin panel. However, if the message had any complaints filed against it, it will continue to appear in the report list. Once the complaints are reviewed and processed, the message will be moved to the archive

c. API Tracked, including payload examples for immediate data deletion. We provide an API that allows Watchers platform users to send requests for the immediate deletion of all data associated with each specific user, except for data required to meet regulatory requirements. This ensures partners can respond to user deletion requests promptly and securely, further enhancing GDPR compliance.

3. What Type of Data is Stored and Processed
   To ensure the operation of our chats and analyze user interactions, we work with two types of data:

* Operational Data: These data are necessary for the direct operation of the chats. They include the user's name or nickname, which may be classified as personal data. We use these data solely so that users can use our chats without issues.
* Chat Name / Nickname
* IP (optional)
* User messages
* Analytical Data: These data are used event, refer to analyze how users interact with our chats and which features they use. For analytics, we apply anonymized data, meaning they contain no personal information about the user. detailed event list section below. This allows us section will help you configure your systems to improve our services without compromising user confidentiality.
  Thus, we clearly differentiate data necessary for the operation of the chats (operational) handle and data necessary for analysis and improvement of our services (analytical), while ensuring the protection of our users' personal information.
