[PM-37512] feat: Add Teams Starter to current pricing migration path#7827
[PM-37512] feat: Add Teams Starter to current pricing migration path#7827amorask-bitwarden wants to merge 3 commits into
Conversation
Teams Starter is a flat 10-seat bundle; migrating to per-seat Teams Current bills the org's actual occupied seats. Secrets Manager service accounts are preserved by the existing migration-grace machinery.
95ab190 to
cc58c11
Compare
🤖 Bitwarden Claude Code ReviewOverall Assessment: APPROVE Reviewed the Teams Starter → Teams Current pricing-migration path (PM-37512), covering the new Code Review DetailsNo findings. Verified the following:
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #7827 +/- ##
==========================================
+ Coverage 61.20% 61.21% +0.01%
==========================================
Files 2209 2209
Lines 97732 97765 +33
Branches 8813 8817 +4
==========================================
+ Hits 59812 59847 +35
+ Misses 35796 35795 -1
+ Partials 2124 2123 -1 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|



🎟️ Tracking
https://bitwarden.atlassian.net/browse/PM-37512
📔 Objective
Adds the Teams Starter → Teams Current pricing-migration path (epic PM-37496), covering both
TeamsStarterandTeamsStarter2023source plans migrating toTeamsMonthly. Teams Starter is a flat, packaged 10-seat bundle, so this is the migration engine's first Packaged → Scalable conversion.TeamsStarterToCurrent/TeamsStarter2023ToCurrentwith append-onlyMigrationPathIds (5, 6), guarded by the snapshot test.Packaged → Scalablecase maps the flat base price (StripePlanId) to the target per-seat price (StripeSeatPlanId); the!IsNullOrEmptyguard prevents anull == nullmisfire for Scalable sources.GetOccupiedSeatCountByOrganizationIdAsync(...).Total) — applied unconditionally for packaged sources, floored at 1.ProductTierType.TeamsStarteradded to the business-migration tier gates in bothPriceIncreaseSchedulerandUpcomingInvoiceHandler.BusinessPlanRenewal2020MigrationMail;ResolveSeatCountnow quotes the occupied count for packaged sources instead of the bundle cap.TeamsStarter2023's larger SM service-account baseline automatically (grace 30); plainTeamsStartermatches the target (grace 0). Covered by tests.No DB migration (enum-only, append-only); no new feature flag (rides
PM35215_BusinessPlanPriceMigration).Notes for reviewers
<5threshold is owned by PM-37514, so any future sharedSeatCountPolicymust preserve Teams Starter's unconditional behavior.