Users
Users is the person-level view. A user owns the identity (externalId), the tags and the locale; their devices are listed under them. See Concepts › User.

Filters
| Filter | Matches |
|---|---|
| externalId | Exact external id (user-42). |
| Label | key:value, e.g. plan:premium. One tag at a time. |
| Identity | Identified (has an external id) / Anonymous (never logged in). |
Rows show external id (or anonymous), tag count, language, country, device count, last activity. Cursor paging, newest first. CSV exports the current filter (id, externalId, language, timezone, country, tags as JSON, createdAt, lastActiveAt).
User detail

| Card | Content |
|---|---|
| Profile | externalId, language, timezone, country, created / last active. |
| Tags | Every tag with its value and type. Editing tags from the panel writes through to all of the user's devices, exactly like PATCH /v1/users/:id. |
| Devices | One row per subscription: platform, model / browser, app version, opted in / opted out / invalid (invalidated), last notified. Click through to the subscription. |
| Last 20 events | The user's last twenty events across campaigns: type, campaign, platform, time. |
Anonymous users
A device that subscribed before login() has an anonymous user (anonymous). Once the app logs in, the row is renamed or merged (see Identity). Anonymous users whose last device is deleted are removed automatically; named users live on without devices — that is how a backend can set tags on someone before their first device registers.
Deleting a user (GDPR)
There is no delete button here; deletion is an API call so it is deliberate and scriptable:
curl -X DELETE https://push.example.com/v1/users/by-external-id/user_123 \
-H "Authorization: Bearer sk_live_…"
# 204 — user and every device removed; past events keep only ids