Skip to content

feat(billing): Redesign billing plan admin for readability, addtl info#112447

Open
swartzrock wants to merge 1 commit intomasterfrom
swartzrock/billing-plan-redesign
Open

feat(billing): Redesign billing plan admin for readability, addtl info#112447
swartzrock wants to merge 1 commit intomasterfrom
swartzrock/billing-plan-redesign

Conversation

@swartzrock
Copy link
Copy Markdown
Member

Renovated the Billing Plans Admin page.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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

@github-actions github-actions bot added the Scope: Frontend Automatically applied to PRs that change frontend components label Apr 8, 2026
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]>
@swartzrock swartzrock force-pushed the swartzrock/billing-plan-redesign branch from 11a1f93 to 282c35d Compare April 8, 2026 03:59
@swartzrock swartzrock marked this pull request as ready for review April 8, 2026 03:59
@swartzrock swartzrock requested a review from a team April 8, 2026 03:59
Comment on lines +635 to +637
const usageGroups = groups.filter(
g => !g.tallyType || g.tallyType.toUpperCase() === 'USAGE'
);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ 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'
);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 282c35d. Configure here.

padding: 0.45em 0 0 0;
font-size: 12px;
background: #f6f6f6;
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 282c35d. Configure here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Scope: Frontend Automatically applied to PRs that change frontend components

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant