feat(billing): Redesign billing plan admin for readability, addtl info#112447
feat(billing): Redesign billing plan admin for readability, addtl info#112447swartzrock wants to merge 1 commit intomasterfrom
Conversation
Overhaul the BillingPlans view to make the large amount of pricing data easier to scan: - Rename page title to "Application Monitoring Billing Plans" - Format large volumes as compact K/M/B suffixes (e.g. 100K, 1M) with unit-size-aware conversion for GB/TB data categories - Collapse price tier rows by default with an expand/collapse toggle - Add RESERVED and UNLIMITED volume badges for sentinel tier values - Show disabled categories inline as "Category (DISABLED)" rather than a separate badge element - Flatten table of contents to plan-tier level; remove per-category links - Omit zero monetary values in CSV export (empty cell instead of $0) - Update TypeScript types: make `not_live` and `categories` optional, add optional `allow_reserved_budgets`, `has_ondemand_modes`, and `has_custom_dynamic_sampling` fields to PlanDetails - Support enterprise plan name formatting with optional short prefix Refs BIL-2160 Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
11a1f93 to
282c35d
Compare
| const usageGroups = groups.filter( | ||
| g => !g.tallyType || g.tallyType.toUpperCase() === 'USAGE' | ||
| ); |
There was a problem hiding this comment.
Bug: A category with tally_type: 'SEAT' but missing seat_costs data is silently filtered out from both the usage and seat pricing tables, causing it to disappear from the UI.
Severity: MEDIUM
Suggested Fix
Modify the rendering logic to handle this case gracefully. For example, render the SEAT category in the table with a placeholder or a warning message indicating that seat cost data is missing. Alternatively, add a console error or warning to alert developers about the inconsistent data from the API.
Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent.
Verify if this is a real issue. If it is, propose a fix; if not, explain why it's not
valid.
Location: static/gsAdmin/views/billingPlans.tsx#L635-L637
Potential issue: A billing plan category with a `tally_type` of 'SEAT' but missing the
corresponding `seat_costs` data will be silently excluded from the user interface. The
code filters categories into a `usageGroups` array, which excludes 'SEAT' types, and a
`seatPricingRows` array, which requires 'SEAT' types to have a truthy `seatCosts`
property. If the backend provides a 'SEAT' category without `seat_costs` (a valid
scenario as the field is optional), it will be filtered out of both lists and will not
be rendered in either pricing table, with no indication to the user that data is
missing.
Did we get this right? 👍 / 👎 to inform future reviews.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 282c35d. Configure here.
|
|
||
| const usageGroups = groups.filter( | ||
| g => !g.tallyType || g.tallyType.toUpperCase() === 'USAGE' | ||
| ); |
There was a problem hiding this comment.
Categories with unrecognized tallyType silently hidden from UI
Medium Severity
The MergedPriceTiersTable component's filtering logic can cause data categories to silently disappear from the billing plans view. Categories with a tallyType other than 'USAGE' or 'SEAT', or 'SEAT' categories missing seatCosts, are excluded from both tables. This regression hides billing data from admins.
Reviewed by Cursor Bugbot for commit 282c35d. Configure here.
| padding: 0.45em 0 0 0; | ||
| font-size: 12px; | ||
| background: #f6f6f6; | ||
| } |
There was a problem hiding this comment.
Dead CSS rules for ul/li in TOCContainer
Low Severity
The TOCContainer styled component still includes CSS rules for ul and li elements. Since the TableOfContents component was refactored to use a <table>, these list-related styles are now dead code.
Reviewed by Cursor Bugbot for commit 282c35d. Configure here.


Renovated the Billing Plans Admin page.
Redesigned the Table of Contents
The nested list was replaced with a compact table where plan tiers were rows and plans were columns, allowing users to scan and jump to a specific plan in one view. Plan IDs were added inline for easier lookups, and plans were ordered so the most common tiers (Developer, Team, Business, Enterprise variants) appeared first.
Reduced visual clutter and scrolling
Multi-band pricing tiers were collapsed by default, with an expand control to reveal bands when needed. Badges and other low-value indicators were removed or minimized to focus on the pricing data.
Supported seat-based pricing
A clear separation was introduced between usage-based tiers and seat-based pricing. Seat costs (Standard, Prepaid, Ondemand) were shown in a dedicated section, so internal users could quickly see seat pricing by category alongside usage tiers.
Surfaced plan capabilities
A concise summary of plan features (e.g., Custom Dynamic Sampling, Ondemand Modes, Reserved Budgets) was added per plan to answer “what does this plan include?” without digging into the tiers.
Improved data density
Shorter labels were used for common plans (e.g., “Ent Team” instead of “Enterprise Team”), special volume values (e.g., reserved/unlimited) were styled as code, and spacing was tightened where possible so more information fit on screen.
https://linear.app/getsentry/issue/BIL-2160
more info at April 2026 Billing Plans Admin Improvements | Notion
https://www.notion.so/sentry/April-2026-Billing-Plans-Admin-Improvements-3368b10e4b5d8067b14acb13ada2995c