Users
The Users page lists the unique users who interacted with your bot within the selected time range.
What this page shows
Every row of the table contains:
| Field | Description |
|---|---|
| Platform User ID | The identifier the producer recorded the event under. For private chats this is the user's Telegram ID; for group messages the MTProto worker records the chat ID here, and the real author is in $tg.from_id — which is what the user metrics count |
| Events in Range | Number of events for this user in the selected period |
| First Seen | Date of the first interaction |
| Last Seen | Date of the last interaction |
| Additional | Properties from the user profile (configurable) |
Column setup
Click Columns at the top of the page to add or remove columns with user properties.
The $tg.username column is shown by default. You can:
- Add any property from the user profile (for example,
$tg.first_name,$tg.lang) - Enter an arbitrary property key manually
- Remove the columns you do not need
Your column selection is stored in the browser and restored the next time you open the page.
User profile properties ($tg.*)
When you connect with a Telegram bot token, Metriox automatically stores the user's properties from Telegram:
| Property | Type | Description |
|---|---|---|
$tg.telegram_user_id | number | The user's Telegram id |
$tg.first_name | string | First name |
$tg.last_name | string | Last name (if set) |
$tg.username | string | Telegram username (if set) |
$tg.language_code | string | Language code (for example, "ru", "en") |
$tg.is_premium | boolean | Premium status (if Telegram reports it) |
Where a profile comes from, and why it can be empty
Most Telegram accounts have no @username, and a name arrives only on updates where Telegram attached the from object. So a user can appear in the list with nothing but an identifier — they exist and are counted everywhere, there is simply nothing to call them yet.
What fills a profile:
- Mini App —
initDatacarries the full identity, so the profile is always filled. - Server SDK (Bot API) — identity arrives when you pass the whole update to the SDK (see SDK). Without that Metriox still recovers
@usernamefrom the events themselves, but the name, language and Premium flag stay unknown. - Bot token connection (MTProto) — Telegram does not hand a bot its private chats, so this path fills no profiles for DMs; in groups and channels it does.
History from before Metriox cannot be recovered: Telegram has no method that returns the list of people who have written to a bot. Only what happens after connecting is counted.
Periods in attribute breakdowns
A breakdown by language, Premium or campaign counts the users who were active in the selected period, and reads their profile as of now. Someone whose profile was written six months ago but who wrote yesterday appears in yesterday's report. Someone active but still nameless lands in the "unset" bucket.
The /start parameter
If the user opened the bot through a /start <parameter> deep link, Metriox stores:
| Property | Type | Description |
|---|---|---|
$tg.start_raw | string | The /start parameter exactly as received |
$tg.start.<key> | string | Parsed key=value pairs from the parameter |
Example: if the user followed the link https://t.me/YourBot?start=ref_123%26campaign_promo, then:
$tg.start_raw = "ref_123&campaign_promo"
$tg.start.ref = "123"
$tg.start.campaign = "promo"
The user profile is updated on every interaction. The table shows the latest known snapshot.
Filtering users
The Users page uses the same filters as widgets. Use event predicates to find users who performed specific actions.
User card
Click a user row to open their card, which shows:
- All profile properties
- The event history for the selected period
What's next?
- Filters — segment users by events and properties
- Metrics — more about the Events, Users, and Events per User metrics
- Automatic setup — how to enable automatic profile capture