Claude Max plan bar vs extra usage: two parallel meters, not before and after

People keep asking on Twitter whether the extra usage line is the plan bar “after it tips over.” It is not. They live on two different endpoints, ship different units (a percentage vs dollars), reset on different clocks, and gate different things. The plan bar can sit at 100 percent while extra usage is still at $0; extra usage can be spending while the bar shows green. ClaudeMeter prints them as sibling rows in the menu bar dropdown because that is what they are at the data level.

M
Matthew Diakonov
7 min read

Direct answer (verified 2026-05-10)

Two parallel meters, not stages of one. The Max plan bar is a utilization percentage on /api/organizations/{org}/usage (5-hour, 7-day, plus per-model sub-buckets). The extra usage line is dollars on /api/organizations/{org}/overage_spend_limit. They never replace each other: the bar can be at 100 percent while extra usage is at $0 (if you never opted in), and extra usage can be spending while the rolling 5-hour bar shows green (because the popup clamps the visual at 100). Anthropic's own help center confirms the same shape: support.claude.com/en/articles/12429409. ClaudeMeter renders them as adjacent rows so you stop confusing them.

Field by field

Same Max plan, two different rows in the menu bar. Each line below is a dimension where the bar and extra usage diverge at the data level, not the UI level.

FeatureExtra usage linePlan bar (5-hour, 7-day, per model)
Endpoint/api/organizations/{org_uuid}/usage. Same JSON claude.ai/settings/usage renders for the rolling and weekly bars./api/organizations/{org_uuid}/overage_spend_limit. Dedicated billing-state endpoint the Settings page reads to draw the BLOCKED banner.
Unit on the wireutilization: f64 (a fraction; 0.0 to 1.0+, displayed 0 to 100 percent). Field on the Window struct, models.rs lines 3-7.monthly_credit_limit: Option<i64> and used_credits: Option<f64>, both in integer cents. Field on OverageResponse, models.rs lines 30-40.
Format string ClaudeMeter uses"{:>5.1}% used -> resets {} ({})" via format_window in format.rs lines 90-113."Extra ${:.2} / ${:.2} ({:.0}%){}" via the print_pretty branch in format.rs lines 24-39 and menubar.rs lines 958-972.
ClockRolling. Each Window carries its own resets_at; the 5-hour slides every time a prompt ages out, the 7-day slides over a 7-day band.Monthly billing cycle. used_credits accumulates across the cycle and zeroes when Anthropic invoices. disabled_until is the per-incident pause clock.
What 100% meansOn the 7-day bar, it means the plan bucket is exhausted. Without metered, the next prompt 429s. With metered, prompts keep going and the bar can climb past 100 (we have seen 1.04 in the JSON).When used_credits reaches monthly_credit_limit and out_of_credits flips true, Anthropic refuses further metered calls. The literal string appended is ' BLOCKED' (format.rs line 26).
Opt-in stateAlways on. The bar starts ticking the day you sign up.Off by default on new paid accounts. You have to enable extra usage once on Settings > Usage > Extra usage > Enable.
What kills your loopHard 429 on the plan bar at 100 percent, only when extra_usage.is_enabled = false. Otherwise the gate moves to the other meter.Hard 429 from the overage endpoint when out_of_credits = true. The plan bar can look fine when this fires; that is the harshest debugging state.
Refresh cadence in ClaudeMeter60 seconds (POLL_INTERVAL at src/bin/menubar.rs line 18). Same poll fires both endpoints in sequence.60 seconds, same poll. The two responses get merged into one UsageSnapshot (models.rs lines 60-73) and printed as adjacent rows.

Two structs, zero shared fields

The cleanest proof that the bar and extra usage are not stages of one model is the Rust source. Window (the plan bar) and OverageResponse (the extra usage row) share zero fields. They could not be more separate at the type level.

src/models.rs

Window has utilization plus a reset timestamp. OverageResponse has a dollar limit, a dollar spend, an opt-in flag, an admin-imposed pause window, and an out-of-credits boolean that is the actual gate when metered billing is on. They live in the same UsageSnapshot (models.rs lines 60-73) only because the menu bar rendering code wants to print both rows on one screen. At the JSON layer, they come back from two separate HTTPS responses on every poll.

What it looks like in the menu bar

The first capture below is a normal Sunday afternoon on a Max account that has metered billing on. 5-hour is hot at 98 percent, extra usage has spent $4.20 of a $50 cap. Two rows, two formats, one screen. The second capture is the worst-case state: rolling past 100 percent, weekly bar already past 100 (1.04 in the JSON translates to 104 percent in the print), and extra usage maxed out with the BLOCKED suffix. That suffix only appears on the extra usage row because it is the only row whose underlying field can go BLOCKED.

Healthy state: bar warm, dollars cool
Worst state: dollars BLOCKED while bars are past 100

Why the format strings are different

The rendering branch in menubar.rs lines 958-973 is the spine of the whole comparison. The Extra row is appended to the same submenu as the 5-hour and 7-day rows, but with a different printf template, a different unit, and a different conditional suffix.

src/bin/menubar.rs (lines 958-973)

Three things to notice. First, the divide-by-100 on lines 959 and 963: the JSON ships cents, you divide twice to get human dollars. Skip the division and the row prints $172000.00 instead of $1720.00. Second, the percent in parentheses is computed locally, not pulled from the JSON, because it is a courtesy field the user wants to glance at next to the dollars. Third, the BLOCKED suffix is a literal string, two leading spaces, hardcoded uppercase, only appended when out_of_credits is true. None of the plan bar rows can produce that string because the Window struct does not have an out_of_credits field.

The four states a Max user actually lives in

State 1: bar cool, no extra usage row. extra_usage.is_enabled is false on your org, the overage_spend_limit endpoint 404s, ClaudeMeter omits the row entirely. You have one meter, the plan bar, and once it pegs you hard-429 until reset. Most fresh Max accounts start here.

State 2: bar cool, extra usage at $0. Metered billing is on, but you have not exhausted the 5-hour or 7-day buckets, so used_credits stays at 0. Two meters visible, only the plan one is moving. This is the state extra usage is designed to help with: silently waiting until the plan bar would have 429d.

State 3: bar at or past 100, extra usage spending. Rolling 5-hour pegged at 100 percent, agentic loop kept going because metered overage took over, used_credits is climbing by some integer cents per poll. The plan bar is now a counter, not a gate. The extra usage line is the surface that decides whether your next prompt goes through.

State 4: bar past 100, extra usage BLOCKED. Both meters are at or past their limit. used_credits hit monthly_credit_limit, out_of_credits flipped true, BLOCKED is suffixed on the row. Until disabled_until passes (or you raise the cap on the Settings page), every prompt 429s with no fall-through. This is the only state where green plan bars and a 429 are both correct at the same time.

Why ClaudeMeter beats the official settings page for this

claude.ai/settings/usage renders the same JSON ClaudeMeter polls, but the page splits the two surfaces vertically. The rolling and weekly bars sit in a top section. Extra usage is its own card below, with its own Enable toggle and balance meter. On a phone or short laptop screen the extra usage block is below the fold entirely. You can read the page top to bottom believing the bar is the whole story.

ClaudeMeter sits at the menu bar level instead. The 5-hour, 7-day, 7-day Sonnet, 7-day Opus, and Extra rows are all peers in the same dropdown, on adjacent lines, in monospaced columns. The dollar string sits two lines below the percent string. There is no scroll, no toggle, no second card to discover. You glance once and you see both meters or you see why one of them is missing.

And because the menu bar app is open source (github.com/m13v/claude-meter, MIT licensed), the format strings and the endpoint calls are inspectable. The two-sentence claim “the plan bar is percent, the extra usage is dollars, they live on different endpoints” is verifiable in 30 seconds of reading format.rs and api.rs.

The honest caveats

Both endpoints are undocumented. Anthropic could rename or restructure them at any time; ClaudeMeter declares every nullable field as Option in Rust, so when the server adds, removes, or renames a sub-bucket the next brew release patches it. Anthropic's help center on extra usage at support.claude.com/en/articles/12429409 documents the user-facing concept (enable, set a cap, get billed for the overage) but does not name the JSON shape. macOS only today, Claude Pro or Max only (free accounts have nothing to meter); the browser extension covers Chrome, Arc, Brave, and Edge.

Confused about which meter is gating your next prompt?

15 minutes. Walk me through your Max account state and we will figure out which row is moving and why.

Frequently asked questions

Is the extra usage line just the plan bar after it hits 100%?

No. They live on two different endpoints and they spend different units. The plan bar reads /api/organizations/{org_uuid}/usage and renders a utilization float (0.0 to 1.0+, displayed as a 0 to 100 percent meter). The extra usage line reads /api/organizations/{org_uuid}/overage_spend_limit and renders a dollar amount in cents-divided-by-100 form. The bar keeps ticking after 100 percent (we have seen 1.04, 1.12 in the JSON) for cosmetic and historical reasons; the actual gate moves to a different field on a different endpoint. Two parallel systems, not two phases of one.

Why does ClaudeMeter print the extra usage row with dollars and the plan rows with percent?

Because the underlying fields are different. format.rs line 112 prints '{:>5.1}% used' for any window where utilization is the meaningful number. format.rs line 31 prints '${:.2} / ${:.2} ({:.0}%)' for the overage line because used_credits and monthly_credit_limit ship as integer cents and the relevant question is dollars over the cap. The percent in parentheses on the extra usage row is a courtesy, not the primary number. Mixing them into a single percentage would hide the dollar amount you actually want at month end.

Can the plan bar be at 100% while the extra usage is still at zero?

Yes, and it is the most common state on a Max account. If extra_usage.is_enabled is false on the usage endpoint, your prompts hard-429 the moment seven_day.utilization crosses 1.0; used_credits stays at 0 because no metered traffic ever runs. If is_enabled is true but you have not yet exhausted the rolling 5-hour or 7-day buckets, all your prompts bill against the plan and used_credits also stays at 0. The metered ledger only spends when the per-prompt rate decision says the plan window would have 429d.

Can the extra usage line be spending while the plan bar shows green?

Yes, and this is the surprising one. After the rolling 5-hour bucket pegs and metered overage takes over, the popup clamps the visible bar with Math.min(100, v) for cosmetic reasons (extension/popup.js line 37), so the bar reads 100 percent on the 5-hour but the seven_day bar can still look green if you are not heavy on the weekly budget yet. Meanwhile, every new prompt is incrementing used_credits by some integer cents on the next poll. The bar keeps you safe from the rolling 5-hour wall, the extra usage line keeps you safe from the surprise bill at month end. They guard different things.

Do the two rows reset on the same clock?

No, they live on different clocks and that matters. The plan bar resets on rolling-window timestamps (resets_at on each Window struct in models.rs lines 3-7); the 5-hour resets_at slides every time an old prompt ages past the 5-hour mark, the 7-day slides similarly across a 7-day band. The extra usage clock is the monthly billing cycle: used_credits accumulates across the cycle and zeroes when Anthropic invoices, with disabled_until carrying any admin-imposed pause window. So even on a quiet Sunday, the 5-hour bar can fall while the extra usage stays exactly where it ended Friday.

What is the BLOCKED suffix and when do I see it?

BLOCKED appears on the extra usage row only, never on the plan bar rows. It is hardcoded as exactly ' BLOCKED' (two leading spaces, all caps) in format.rs line 26 and menubar.rs line 960. It prints when out_of_credits comes back true on the overage_spend_limit endpoint, which means metered billing is on, you have spent the whole monthly_credit_limit, and Anthropic is now refusing further overage-billed calls until disabled_until passes. The 5-hour and 7-day bars can still look green when this happens, which makes BLOCKED the diagnostic for one specific 'green windows but my prompt 429d' state.

Why does claude.ai/settings/usage make this distinction harder to see?

Because the page splits the two surfaces vertically. You see the rolling and weekly bars in a top section, and the extra usage block lives below as a separate card with its own Enable toggle and balance meter. On a phone or short laptop screen the extra usage block is below the fold, and you can read the page top to bottom believing the bar is the whole story. ClaudeMeter sits at the menu bar level: the 5-hour, 7-day, 7-day Sonnet, 7-day Opus, and Extra rows are all peers in the same dropdown, so the dollar string sits two lines below the percent string. You cannot read one without seeing the other.

If I am on Max and never enabled extra usage, do I have nothing to compare?

Correct. With extra_usage.is_enabled = false, the overage_spend_limit endpoint returns 404 for most orgs (free workspace orgs, team orgs without metered billing, fresh paid accounts that never opted in). ClaudeMeter wraps the call in a try/catch (extension/background.js line 26-27, src/api.rs lines 31-45) and just omits the Extra row entirely. So if you do not see an Extra row in the menu bar, your org has not opted in to metered. The bar is your only meter; once seven_day.utilization hits 1.0 you hard-429 until reset.

Does the bar count traffic that the extra usage paid for?

Yes, and this is the field that surprises people. seven_day.utilization keeps climbing past 1.0 after metered traffic kicks in (we have observed 1.04 and 1.12 in real JSON). The plan bar is, in a sense, just a counter once you cross 100 percent; the gate moved elsewhere. ClaudeMeter still renders it because the trajectory tells you whether the next billing cycle is shaping up to be heavier than this one, even though the first 100 percent is now meaningless from a 429 perspective.

Can I see both numbers without ClaudeMeter or settings/usage?

Yes, with two curls. Open DevTools on claude.ai/settings/usage, copy the Cookie header, then run curl with -H 'Cookie: $YOUR_COOKIE' -H 'Referer: https://claude.ai/settings/usage' against https://claude.ai/api/organizations/$ORG_UUID/usage for the bar JSON, and the same against /overage_spend_limit for the dollar JSON. Pipe both through jq. ClaudeMeter just automates the cookie wrangling, the org enumeration, and the 60-second poll cadence so you do not retype the curl every minute.