[BUG] /usage omits the "Usage credits" row on Team plans — the data is fetched, then discarded by a pro/max tier check
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report
- [x] I am using the latest version of Claude Code
What's Wrong?
On a Team plan, the /usage panel never shows a Usage credits row, even when the account has a usage-credit balance and a monthly cap.
The Claude desktop app shows that row for the same account at the same time — labelled "Usage credits", reading $X of $Y with a progress bar, directly under the 5-hour and weekly rows — and the claude.ai usage settings page shows the balance too. So both the entitlement and the data exist server-side; only the CLI hides them.
The CLI isn't failing to fetch the data either. GET /api/oauth/usage returns an extra_usage object, the /usage panel passes it into the component that renders the row, and that component then discards it because the account's subscriptionType is team rather than pro or max.
Net effect: on Team plans there is no way to see the credit balance from the CLI at all — not in /usage, and not via a custom statusline (see Related below).
What Should Happen?
/usage should show the Usage credits row on any plan that has usage credits, matching the desktop app and claude.ai.
Since the server already decides whether to include extra_usage in the response, the row is better gated on whether that object is present than on the plan tier.
Steps to Reproduce
- Log in with a Claude account on a Team plan (
/login— subscription auth, not an API key) - Make sure the account has usage credits enabled with a monthly cap
- In the Claude desktop app, open the usage panel — note the "Usage credits" row showing balance and cap
- In the CLI, run
/usage - The panel shows the 5-hour row, the weekly rows, and per-model weekly rows — but no Usage credits row
Root Cause
In 2.1.233 the component that renders the credits row returns early unless the tier is pro or max:
function dDl(XGO){
let dJr=hdr.c(22),{extraUsage:Pke,maxWidth:vQm}=XGO,m1T=Sc();
if(!(m1T==="pro"||m1T==="max")){return!1} // <-- team exits here
if(!Pke.is_enabled){ /* "Usage credits are off" subtitle */ }
if(Pke.monthly_limit===null){ /* "Unlimited" subtitle */ }
...
const TQm=`${ZGO} / ${QGO} spent`; // <-- the row that never renders
return il.jsx(nDl,{title:sDl,limit:aDl,showTimeInReset:!1,
alwaysShowDateInReset:!0,extraSubtext:TQm,maxWidth:vQm})
}
Sc() reads subscriptionType off the credential object, and "team" is a recognised value for it elsewhere in the same file — so this looks like an allowlist that was simply never extended rather than a deliberate exclusion:
function Sc(){ /* ... */ return e.subscriptionType??null }
function hGe(){ return Sc()==="max" }
function CM_(){ return Sc()==="team" }
function sAr(){ return Sc()==="enterprise" }
extra_usage is fetched and schema-validated on the way in, alongside five_hour / seven_day / cinder_cove / limits[]:
extra_usage: $e.object({
is_enabled: $e.boolean(),
monthly_limit: $e.number().nullable(),
used_credits: $e.number().nullable(),
utilization: $e.number().nullable(),
currency: $e.string().nullish(),
disabled_reason: $e.string().nullish()
}).passthrough().nullish()
…and it reaches dDl as a prop. Only the tier check stops it rendering. enterprise presumably has the same problem.
Suggested Fix
Gate the row on extra_usage being present in the response rather than on plan tier — or, minimally, add team and enterprise to the allowlist.
Related
- #80725 — the statusLine JSON payload has the same gap: only
five_hourandseven_dayare copied intorate_limits, andextra_usageisn't exposed at all, so a custom statusline can't show the balance either. Together these mean Team users have no CLI surface for it. - #74784 —
/usage-creditsreporting "unlimited" despite an org monthly cap. Consistent with themonthly_limit === nullbranch in the same function above.
Is this a regression?
No, this never worked
Claude Code Version
2.1.233
3 Comments
This is fixed in version v2.1.236
Thanks for the unusually thorough report — confirmed.
We verified against the released 2.1.233 build that the
/usagepanel's Usage credits row is gated on the account's plan type being Pro or Max, and that this check runs before the usage-credit data from the server is ever examined. On Team (and Enterprise) plans the row is skipped entirely even when the server response includes the credit balance and cap — matching what you observed, and consistent with the desktop app showing the row for the same account.Your suggestion — showing the row whenever the server reports usage-credit data, rather than keying off the plan tier — is the sensible direction, since the server already decides whether the account is entitled to it. Marking as reproduced for the team to pick up.
🤖 Generated with Claude Code
Thanks @bcherny for the reply. I can confirm that version
2.1.236already fixed the issue