Skip to content

Conversation

@dashed
Copy link
Member

@dashed dashed commented Jan 24, 2026

Closes https://linear.app/getsentry/issue/BIL-2005/add-emerge-billing-overage-ui-with-contact-sales-cta

Summary

  • Add special handling for Emerge data categories (SIZE_ANALYSIS, INSTALLABLE_BUILD) in the navigation billing status component
  • Show "Contact Sales" CTA (mailto:sales@sentry.io) instead of AddEventsCTA since Emerge categories don't have PAYG available
  • Support three scenarios:
    • Only Emerge categories exceeded → Contact Sales CTA
    • Both Emerge and standard categories exceeded → Both sections displayed
    • Only standard categories exceeded → Original AddEventsCTA behavior
Screenshot 2026-01-24 at 4 16 39 PM

Test plan

  • Added tests for Size Analysis quota exceeded with Contact Sales CTA
  • Added tests for Build Distribution quota exceeded with Contact Sales CTA
  • Added tests for both Emerge categories exceeded together
  • Added tests for mixed Emerge and standard categories exceeded
  • All 21 tests in navBillingStatus.spec.tsx pass
  • Manually verified UI in dev environment with mocked database changes

@linear
Copy link

linear bot commented Jan 24, 2026

@github-actions github-actions bot added the Scope: Frontend Automatically applied to PRs that change frontend components label Jan 24, 2026
@dashed dashed self-assigned this Jan 24, 2026
@dashed dashed marked this pull request as ready for review January 26, 2026 06:02
@dashed dashed requested a review from a team January 26, 2026 06:02
Add special handling for Emerge data categories (SIZE_ANALYSIS, INSTALLABLE_BUILD)
in the billing status alert:

- Show Emerge-specific copy explaining quota exceeded status
- Display "Contact Sales" CTA instead of standard AddEventsCTA (since Emerge
  has no PAYG/on-demand option)
- Use dynamic quota value from subscription.categories instead of hardcoded value
- Handle mixed scenarios (Emerge + other categories exceeded)

BIL-2005
…sage

Address PR review feedback to remove the hard-coded quota value (100)
from the Size Analysis quota exceeded message. The message now says
"full quota of Size Analysis builds" instead of including a specific
number, consistent with other category messages.
Address PR review feedback to use behavior-based naming instead of
product-specific naming. The term "Emerge" refers to a specific
product acquisition, but the behavior is about PAYG ineligibility
which could apply to any category.

Renames:
- EMERGE_CATEGORIES → PAYG_INELIGIBLE_CATEGORIES
- isEmergeCategory → isPaygIneligibleCategory
- getEmergeSubheader → getPaygIneligibleSubheader
- getEmergeBodyCopy → getPaygIneligibleBodyCopy
- emergeCategories → paygIneligibleCategories
- emergeEventTypes → paygIneligibleEventTypes
Refactor getPaygIneligibleSubheader and getPaygIneligibleBodyCopy to use
the existing listDisplayNames utility instead of hardcoding category
display names. This ensures consistency with other category displays
and follows the DRY principle.

Addresses review feedback from PR #106932.
The functions getPaygIneligibleSubheader and getPaygIneligibleBodyCopy
use tct() which returns React.ReactNode, not string.
The onDismiss function was ignoring the eventTypes parameter and snoozing
all prompts. This caused a bug where acting on the PAYG-eligible CTA
would incorrectly dismiss the "Contact Sales" prompt for PAYG-ineligible
categories. Now only prompts matching the passed eventTypes are snoozed.
Copy link
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 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

}
)}
</Description>
)}
Copy link
Contributor

Choose a reason for hiding this comment

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

Duplicated JSX blocks for category descriptions

Low Severity

The usageCategories and seatCategories description blocks are identical between the "mixed" scenario (lines 231-252) and the "standard" scenario (lines 304-325). The same tct() calls with identical strings like 'You have used up your quota for [usageCategoryList]...' and '[prefix] reached your quota for [seatCategoryList]...' appear in both locations. If the copy needs updating, changes must be made in two places, increasing maintenance burden and risk of inconsistency.

Additional Locations (1)

Fix in Cursor Fix in Web

@dashed dashed merged commit 70a5fc6 into master Jan 27, 2026
53 checks passed
@dashed dashed deleted the billing/BIL-2005 branch January 27, 2026 21:01
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.

4 participants