[PM-38333] feat: Annual billing savings offer on cancel#21939
Conversation
Labels were inheriting the callout's brand-tinted text color instead of the muted style, values weren't bolded, rows stretched full width with right-aligned amounts instead of a compact left-aligned column, and the disclaimer text was the same size as the cost rows instead of smaller.
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #21939 +/- ##
==========================================
+ Coverage 52.12% 52.23% +0.10%
==========================================
Files 4116 4116
Lines 130285 130340 +55
Branches 20454 20464 +10
==========================================
+ Hits 67917 68087 +170
+ Misses 57350 57200 -150
- Partials 5018 5053 +35 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
🤖 Bitwarden Claude Code ReviewOverall Assessment: APPROVE Reviewed the client side of the annual billing savings offer: the two new Code Review DetailsNo blocking findings. Notes considered and intentionally not flagged:
|
Design flagged the leading "i" icon as misplaced on the annual-billing offer callout in the Cancel subscription dialog, since it reads as an offer rather than a typical informational message. Pass [icon]="null" to the bit-callout to suppress it while keeping the info styling. The Subscription page callouts are unaffected and retain their icon.
🎟️ Tracking
https://bitwarden.atlassian.net/browse/PM-38333
Associated PRs
📔 Objective
Adds the client side of the annual billing savings offer. When an owner of a Teams or Enterprise monthly organization opens the cancellation offboarding survey and selects the cost reason, an inline callout shows the projected annual savings and an option to switch to annual billing at the next renewal. Accepting calls the redeem endpoint and closes the flow; declining continues the normal cancellation. The organization subscription page also reflects a pending switch during the window between redemption and renewal.
Changes
OrganizationBillingClient: methods to fetch the annual upgrade offer and redeem it.pendingAnnualUpgradefield on the subscription response and, when present, shows the scheduled annual plan name, per-year cadence, and annual amounts with an effective-date callout, instead of the stale monthly values.subscription-statuscomponent: derives the displayed plan name frompendingAnnualUpgradewhen a switch is scheduled.📸 Screenshots