plans: differentiated yearly discounts — Hobby 'save 1 month' / Pro+Team '2 months free' (nudges Pro Annual)#9
Merged
Conversation
… '2 months free' Hobby Annual is now $99/yr (= $9 x 11 = 8.3% off, "save 1 month"). Pro Annual stays $490/yr (= $49 x 10 = 17% off, "2 months free"). Team Annual stays $1990/yr (= $199 x 10 = 17% off, "2 months free"). Strategic intent: when a hobby user sees their annual savings is small but Pro Annual saves "2 months free / $98", the differential nudges them to tier-skip into Pro Annual rather than just upgrade frequency. Tests: - Split TestYearlyIsTwoMonthsFree into TestProAnnualIsTwoMonthsFree (pro+team only, 10/12 ratio) + TestHobbyAnnualIsOneMonthFree (hobby only, 11/12 ratio). - Renamed TestYearlyIsExactlyMonthlyTimesTen to TestProTeamYearlyIsMonthlyTimesTen and added TestHobbyYearlyIsMonthlyTimesEleven for the new x11 lock. - Added TestTierDiscountDifferentiation locking the strategic intent: pro_yearly_ratio < hobby_yearly_ratio (and same for team).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Differentiate the yearly discount so Pro Annual is the obviously-best value.
PR #8 set all three yearly tiers to the same ~17% off ("2 months free"). New
product directive: make the Hobby discount intentionally weaker so the savings
differential nudges hobbyists to tier-skip into Pro Annual rather than just
upgrade their billing frequency.
New effective discounts
When a hobby user sees their annual savings is small ($9) but Pro Annual saves
"2 months free / $98," they're nudged to tier-skip rather than just upgrade
frequency.
Code changes
common/plans/plans.go—hobby_yearly.price_monthly_cents: 9000 → 9900.Updated the inline comment to document the new "save 1 month" framing and
the strategic intent.
common/plans/plans_test.go:TestYearlyIsTwoMonthsFreeinto:TestProAnnualIsTwoMonthsFree(pro + team, asserts 10/12 ratio ± 0.01)TestHobbyAnnualIsOneMonthFree(hobby, asserts 11/12 ratio ± 0.01)TestYearlyIsExactlyMonthlyTimesTentoTestProTeamYearlyIsMonthlyTimesTen(restricted to pro + team).
TestHobbyYearlyIsMonthlyTimesEleven(the new x11 integer-cents lock).TestTierDiscountDifferentiation— locks the strategic intent:pro_yearly_ratio < hobby_yearly_ratio(and same for team). If anyone"fixes" Hobby back to 10/12, this fails — the differentiation is the
product directive, not an accident.
Operator action required
Razorpay's
hobby_yearlyplan needs updating to $99/yr (either edit theexisting plan or create a new plan ID and rotate
RAZORPAY_PLAN_ID_HOBBY_YEARLYin the
instant-secretsk8s secret). Pro + Team yearly plan IDs are unchanged.Test plan
go test ./plans/...— 28 PASS, 1 SKIP (plans.yaml file-consistency check,file not present in common repo)
RAZORPAY_PLAN_ID_HOBBY_YEARLYto a plan billedat $99/yr
for Hobby Annual and "$490/yr — 2 months free" for Pro Annual