# Users (/docs/dashboard/users)



**Users** ranks the people and agents using your app by what they cost you. It's the tab that
turns "we spent $900" into "these eleven accounts spent $900".

## What it's for [#what-its-for]

Finding the account that needs a cap, checking whether a plan tier is paying for itself, and
confirming your app is identifying users at all.

## The list [#the-list]

| Panel / column                       | Shows                                                                                                     |
| ------------------------------------ | --------------------------------------------------------------------------------------------------------- |
| **By plan**                          | One block per `paid_plan` value: total spend, how many users, average spend per user, tokens per request. |
| **User**                             | The `user_id` your app supplied.                                                                          |
| **Plan**                             | The `paid_plan` value on their calls.                                                                     |
| **Requests** / **Tokens** / **Cost** | Their traffic in the selected range.                                                                      |
| **Status**                           | Red **Blocked** if a rule currently has them stopped, otherwise a muted *ok*.                             |

Filter by user id, and sort by **Cost**, **Requests** or **Tokens**.

<Callout type="info">
  Plan names are shown exactly as your app sent them, never tidied up — because rules match
  byte-for-byte, so `Free` and `free` really are two different plans with two separate budgets.
  Seeing both in the **By plan** panel is a bug in your app, not in the display. The list returns
  at most 50 users.
</Callout>

## The user detail view [#the-user-detail-view]

Click any row for one user's history: spend, requests, plan and audit-event tiles; a spend trend;
the models they used; their recent sessions and recent calls; and an **audit history** of every
firewall decision about them.

That audit table spells out the distinction that trips people up: &#x2A;"An Enforce event acted on the
call (blocked or rerouted it); a Dry-run event did NOT affect the call — it only records what the
rule would have done if it were enforcing."*

## What to look for [#what-to-look-for]

* **Every user shows as `anonymous`** — your app isn't threading `user_id`, so per-user rules pool
  everyone into one bucket and per-user caps do nothing. Fix it with
  [Identity](/docs/concepts/identity) and
  [anonymous users](/docs/troubleshooting/anonymous-users).
* **One user is a large share of total spend** — cap them with a *Cap spend per user* rule.
* **The By plan panel shows a plan you don't have** — usually a typo, a case difference, or calls
  your app never stamped (those are recorded as `free`).
* **A user's Status reads Blocked and you didn't expect it** — open their audit history to see
  which rule armed them and when the window resets.
* **Spend concentrated on free-plan users** — the *Stop free-tier abuse* template exists for
  exactly this.

## Next [#next]

<Cards>
  <Card title="Identity" href="/docs/concepts/identity" description="How to send user_id, paid_plan and custom tags." />

  <Card title="Cap the free tier" href="/docs/recipes/cap-free-tier" description="Turn what you found here into a rule." />

  <Card title="Audit log" href="/docs/dashboard/audit-log" description="The same decisions across every user." />
</Cards>
