Skip to content

Read the User 360

The User 360 (/users/[id]) is the single-page view every support agent lives in. It’s split into tabs so you can drill into the specific dimension you need.

  • Display name / email / phone
  • Avatar if uploaded
  • Status badge: active / suspended / banned / deleted; hover shows banReason or suspendedUntil
  • Country + language
  • Guest / Registered
  • Balance total: coins (derived from ledger)
  • Total spend: USD, sum of completed purchases

Right side: Actions menu: Suspend, Ban, Reactivate, Adjust coins, Comp subscription, Anonymize (each gated by the appropriate permission and by the user’s current status).

  • Wallet summary: balance total, split into paid and bonus.
  • Unlocks count: how many episodes this user has permanent access to.
  • Streak: current, longest, last claim date.
  • Push preferences: categories toggled off (marketing, drops, moderation).

Requires wallet:read.

  • Full ledger view: one row per coin_ledger entry, most recent first.
  • Columns: created_at, reason (e.g. unlock, refund, promo_grant, iap, subscription_bonus), ref_type/ref_id (e.g. episode:xyz), amount (net wallet delta), event_id (double-entry group).
  • Filter by reason or ref_type.
  • Adjust coins button (permission-gated) opens the adjust modal.

Requires payments:read.

  • All Purchase rows in reverse-chronological order.
  • Columns: platform (iap/card/dlocal/pawapay/vas), product ID, transaction ID, amount_cents + currency, region, status (completed / refunded / pending), refund_reason if set.
  • Refund action → opens Process a refund.

Requires users:read.

  • Recent watch sessions.
  • Columns: series title, episode #, started_at, ended_at, seconds_watched, completed bool.
  • Useful for support: “Is this user actually engaged, or a chargeback risk?”

Requires users:read.

  • All linked devices (device rows).
  • Platform, app version, OS version, model, last IP, first_seen, last_seen.
  • Force logout all devices action (users:ban permission): bumps token_version on the user; all existing sessions die.

Requires users:read.

  • Every Subscription row (active + expired).
  • Platform (Apple / Google / web / dLocal / pawaPay), product ID, status, auto_renew, current period, trial end, canceled_at, price_cents+currency.

Requires users:read.

  • Support notes thread. Any support/finance/superadmin/moderator with users:read can add a note.
  • Each note has body, admin_email, created_at.
  • Notes are not deleted on user anonymize (kept for audit), but the note author is preserved (not anonymized) since it’s PII about the admin, not the user.

Visible if the user has strikes.

  • Every user_strike row (comment or report strike).
  • 3 strikes = automatic commenting suspension. Handled by the moderation service, not by an admin action.
  • Guest users don’t have emails/phones/subscriptions. Their tabs render mostly empty except Wallet, Watch history, and Devices.
  • Deleted (anonymized) users show tabs but with PII stripped (email: null, phone: null, display_name: null). Ledger and purchases remain: money doesn’t disappear.
  • suspendedUntil in the past = user is effectively active again on their next request, but status column may still say suspended until they hit a mobile endpoint that triggers the auto-reactivation check.
TabEndpoint
Detail (header + overview)GET /v1/admin/users/:id
LedgerGET /v1/admin/users/:id/ledger
PurchasesGET /v1/admin/users/:id/purchases
Watch historyGET /v1/admin/users/:id/watch-history
Notes listGET /v1/admin/users/:id/notes
Notes createPOST /v1/admin/users/:id/notes
Notes deleteDELETE /v1/admin/users/:id/notes/:noteId

Devices, subscriptions, strikes are embedded in the detail response.

Full details in API: Users.