Skip to content

Subscriptions and seats

A subscription is a plan your organization pays for per seat, such as Claude Max, ChatGPT Team or GitHub Copilot Business. Recording them under Costs → Subscriptions is what turns the spend report from “what tokens would cost” into “what we actually pay”, and what separates sanctioned use from shadow AI.

FieldMeaning
NameYour label, for example “Engineering Claude Max”.
Vendoranthropic, openai, google, github or other.
PlanThe plan as the vendor names it, for humans: “Claude Max 20x”.
Seat cost (monthly)Per seat, per month, in the subscription’s currency (default USD).
Seats purchasedSeats paid for. This can exceed seats assigned, and the difference is what you’re buying and not using.
Match toolsCollector tool names this subscription pays for, comma-separated (for example claude-code,claude-desktop). Empty matches any tool from the vendor.
Match plansPlan values as the collector reports them (for example claude_max,claude_pro). Empty matches any plan.
NotesFree text.

A seat belongs to a person, identified by the user name the collector reports. Give it a display name when the OS account isn’t a person’s name (jdoe → “Jane Doe”). Every machine a person reports from rolls up to their seat, whether that’s a laptop, a desktop or a build box.

Releasing a seat keeps it on record with the date it was released.

Plans such as Claude Pro and Max have five-hour and weekly limits. Past them, with extra usage turned on, Anthropic bills the account per use, up to a monthly cap the person sets. Anthropic’s Admin API covers API organizations only, and Claude Code’s telemetry has no plan or billing fields, so this money used to be invisible unless you entered it from the receipt.

Claude Pro and Max: captured automatically

Section titled “Claude Pro and Max: captured automatically”

Claude Code fetches the account’s limits and extra usage from Anthropic and caches the answer in its config file (~/.claude.json, or $CLAUDE_CONFIG_DIR/.claude.json). The collector reads that cache for every person on the machine, on every pass and, in watch mode, every three minutes, sending it at once when something changes: a limit reached or reset, extra usage rising or switched on or off, or the cap reached. It reads only these fields:

FieldUsed for
Five-hour and weekly use, reset time, lock reasonPlan limits and the limit alert.
Extra usage on/off, billed this month (with its currency and decimal places), monthly cap, cap reachedSpend and the extra-usage alerts.
When Claude Code fetched it“As of”, and staleness.
The account’s idOnly to recognise the same account on other machines, sent as a one-way hash.

No email, token or key is read for this, and the account id itself never leaves the machine.

How the amount is counted. Anthropic keeps one month-to-date total per account, and every machine signed in to the account caches the same total. So machines are never added together: readings from every machine are put in Anthropic’s own order (when each was fetched), and only a rise in the total counts. The month’s extra usage is the highest total seen in it.

  • A fall in the total is Anthropic’s monthly reset; counting starts again from zero.
  • Each rise is dated when it was first seen, so a window holds the extra usage that accrued in it.
  • Rises are attributed to the account’s billing month, starting on the day the subscription renews when Claude Code states it, otherwise the calendar month. The working says which.
  • A reset no machine saw (every machine was off across it, and the new month’s first total is already higher than the last one seen) is under-counted, never double-counted. A receipt for the month corrects it.
  • Team and Enterprise extra usage is billed on the organization’s Anthropic invoice, so it is listed under Left out, and why rather than counted.

The amount is money billed, with the basis Reported by the vendor and the source “Reported by Anthropic to Claude Code on machine, as of time”. It is part of the same total as everything else, so Costs, Home, Executive, budgets, the finance ledger and the CSV export agree. Under How is this calculated? it is its own part, Claude extra usage reported by Anthropic, with the working for each account. It counts even when no subscription is on file for the account.

For anything Shield360 cannot read (Claude Code not installed or not signed in on any machine, an older collector, another vendor), record the charge from the receipt. On a subscription card, select Record a charge and enter:

FieldMeaning
AmountWhat you were charged, in the subscription’s currency.
Charged onThe date on the receipt. It can’t be in the future.
KindExtra usage (the default) or Other for any other one-off charge.
ForShown when the plan has more than one seat holder: the person the charge was for. Leave it as the plan as a whole if it belongs to nobody in particular.
NoteOptional, for example the receipt number.

A charge is money spent on the day it was charged.

Receipts and reported figures together. When an extra-usage receipt is on file for the same subscription and billing month as a figure Anthropic reported, the receipt is the amount and the reported figure is not added. The receipt’s line in the working shows both and flags any difference.

A charge belongs to the person who incurred it: a reported charge to the person whose Claude account reported it, a receipt to the person it was entered for, or to the only seat holder if there is one. It shows on that person’s cost view, on the views of machines they used, and in their row of the by-person and by-department splits. A receipt for the plan as a whole stays unattributed and shows only on the organization’s view. Organization totals are the same either way.

Costs → Subscriptions → Claude plan limits and extra usage shows each Claude account with its person and machines: five-hour and weekly use and when they reset, Limit reached when one is used up, whether extra usage is on, what it has billed this month against its cap, and when Anthropic said so. Figures not refreshed in 24 hours are marked stale: Claude Code refreshes the cache only while it runs. A list below it gives each Claude Code machine’s state: read, no plan usage fetched yet, format not recognised, a cache from a different sign-in, or a collector too old to read it. Machines without Claude Code signed in are not listed.

Alerts (in the Alerts inbox, and to channels with an event rule for them), each raised once per change and naming the plan, never the person or machine:

AlertWhen
ai_plan.limit_reachedA five-hour or weekly limit is used up.
ai_plan.extra_usage_startedAn account’s extra usage first rises above zero in a billing month.
ai_plan.extra_usage_cap_reachedAn account reaches its monthly extra-usage cap.
ai_plan.reader_unrecognisedA machine that read the cache now reports a format Shield360 does not recognise.

The spend report’s Overage risk recommendation estimated what plan usage with extra usage on would cost at API rates. For people whose Claude Code reports plan usage, the real billed figure replaces it: Claude Code usage of those people is left out of the estimate, and a recommendation states the extra usage actually billed.

When the collector reports someone signed in to a paid plan that no seat on file covers (Claude Pro or Max, ChatGPT Plus, Pro or Business through Codex, Cursor Pro, Pro+, Ultra or Teams), Costs → Subscriptions lists it under Plans in use with no subscription on file, with the plan, the list price and the person. Add creates the subscription with the collector’s spelling of its tools and plans and that person’s seat, or adds the seat to the subscription already on file for that plan. A Claude Max account whose tier does not say 5x or 20x is offered both. Adding one needs the permission to change cost settings and is recorded in the audit log.

A request is covered when all of these are true:

  1. The tool reported that it ran on a paid plan, not an API key.
  2. The person holds a seat on a subscription from the same vendor.
  3. The subscription’s match tools and match plans (if set) include the tool and plan reported.

Plan usage that meets 1 but not 2 or 3 is untracked. It’s surfaced in the report and in Shadow AI, never counted as free.

GET /api/subscriptions
POST /api/subscriptions
PUT /api/subscriptions/{id}
DELETE /api/subscriptions/{id}
POST /api/subscriptions/{id}/seats
DELETE /api/subscriptions/seats/{seatId}
POST /api/subscriptions/{id}/charges {"amount": 50, "chargedAt": "2026-10-10", "kind": "extra_usage", "note": "", "userName": "ana"}
DELETE /api/subscriptions/charges/{chargeId}
GET /api/subscriptions/plan-usage
GET /api/subscriptions/suggestions
POST /api/subscriptions/suggestions {"userName": "ana", "tool": "claude-code", "planKey": "claude-max-20x"}

A spend connector for GitHub Copilot, Cursor or ChatGPT Enterprise fetches the vendor’s own seat list: who holds a seat, what it costs, and when it was last used. On every sync the connector keeps one subscription per product in step with that list, so the estimate counts the same seats the bill does without anyone typing them in. Seats appear when the vendor assigns them and are released when the vendor removes them.

A subscription made this way is marked Synced from the vendor on the Subscriptions tab. Changes made to it by hand are overwritten at the next sync; subscriptions entered by hand are never touched.

Vendors know people by email or login; the collector by user name. The directory ties the two. Without a directory match, the email’s local part is used and the sync message says how many seats were matched that way.

OpenAI’s and Anthropic’s API billing has no seats, and Claude Team, Claude Max and ChatGPT Plus seats are not exposed by any API. Enter those by hand, or add them from Suggested subscriptions when the collector reports them.