Reference map from plan_type to plan name, seat weight, and monthly price, as implemented in lib/plan-allotment.ts and covered by test/plan-allotment.test.ts. Update all three together.
plan_type arrives from two places that agree: the chatgpt_plan_type claim in the OAuth access token (named via lib/auth/plan-tier.ts) and the plan_type field on /wham/usage (read live by codex-limits and the TUI).
normalizePlanSlug reduces a raw slug before matching: lowercased, a leading chatgpt prefix stripped, _/-/spaces folded to single spaces, and a trailing plan word dropped. So team, chatgptteamplan, and ChatGPT_Team_Plan all land on team.
Accepted plan_type (normalized) |
Plan | Weight | Multiplier | Monthly (USD) |
|---|---|---|---|---|
plus |
ChatGPT Plus | 1 | 1x |
20 |
team |
ChatGPT Business (old slug, still emitted) | 1 | 1x |
25 |
business … standard (e.g. business_standard) |
ChatGPT Business Standard | 1 | 1x |
25 |
business … prolite / pro lite / premium (e.g. self_serve_business_prolite) |
ChatGPT Business Premium | 5 | 5x |
125 |
pro, pro 20x, pro 200 |
ChatGPT Pro | 20 | 20x |
200 |
prolite, pro lite |
ChatGPT Pro Lite | 5 | 5x |
100 |
pro 5x, pro 100, pro legacy, legacy pro, legacy pro 5x, pro legacy 5x |
ChatGPT Pro (legacy $100 tier) | 5 | 5x |
100 |
business (bare) |
Business workspace, seat unstated | — | — | — |
free |
ChatGPT Free | — | — | — |
go |
ChatGPT Go | — | — | — |
enterprise |
ChatGPT Enterprise | — | — | negotiated per contract |
| anything else | unrecognized | — | — | — |
Explicit-match notes:
teamis matched before the business matcher because OpenAI kept the slug while renaming the product to Business.self_serve_business_proliteis the premium Business seat ($125), not the personal Pro Lite tier ($100) that shares theprolitetoken — thebusinessword in the slug decides.- The six legacy spellings are the $100 Pro that predates the $200 Pro; they are matched before
proclaims the bare word. - A bare
businessnames the workspace, not a seat, and its two seats are 5x apart, so no ratio is stated.
- The weight is OpenAI's published per-seat ratio against the 1x seat, taken from monthly price (Pro $200 vs Plus $20, marketed as 20x). It describes the subscription, not a measured token allowance.
- Every pool figure is a weighted mean over the summed weights, not a plain average: a Pro seat spent to 50% gives up twenty times what a Business Standard seat does at 50%.
- A plan with no ratio (
—rows) counts as one baseline seat in the total (DEFAULT_PLAN_WEIGHT = 1) so it cannot remove the other accounts, and prints noNxbadge rather than asserting a1xOpenAI never published.
- Pool status line (
quotaStatus.mode: "overview";quotaStatus.multipliersprints the badge):24%: #1 5x 13%, #2 20x 100% 3d, #3 1x 12% codex-limits/limitsCLI:Plan: Pro (20x)per account, closing withPool: 93% used of 81x across 11 accounts— the81xis the summed weight.
Both read the same module, so the two figures cannot drift apart.