Skip to content

plans: differentiated yearly discounts — Hobby 'save 1 month' / Pro+Team '2 months free' (nudges Pro Annual)#9

Merged
mastermanas805 merged 1 commit into
masterfrom
feat/hobby-yearly-less-discount-fresh
May 13, 2026
Merged

plans: differentiated yearly discounts — Hobby 'save 1 month' / Pro+Team '2 months free' (nudges Pro Annual)#9
mastermanas805 merged 1 commit into
masterfrom
feat/hobby-yearly-less-discount-fresh

Conversation

@mastermanas805
Copy link
Copy Markdown
Member

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

Tier Monthly Yearly Effective Framing
Hobby $9 $99/yr (was $90) $9 x 11 = 8.3% off "save 1 month"
Pro $49 $490/yr $49 x 10 = 16.7% off "2 months free"
Team $199 $1990/yr $199 x 10 = 16.7% off "2 months free"

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.gohobby_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:
    • Split TestYearlyIsTwoMonthsFree into:
      • TestProAnnualIsTwoMonthsFree (pro + team, asserts 10/12 ratio ± 0.01)
      • TestHobbyAnnualIsOneMonthFree (hobby, asserts 11/12 ratio ± 0.01)
    • Renamed TestYearlyIsExactlyMonthlyTimesTen to TestProTeamYearlyIsMonthlyTimesTen
      (restricted to pro + team).
    • Added TestHobbyYearlyIsMonthlyTimesEleven (the new x11 integer-cents lock).
    • Added 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_yearly plan needs updating to $99/yr (either edit the
existing plan or create a new plan ID and rotate RAZORPAY_PLAN_ID_HOBBY_YEARLY
in the instant-secrets k8s 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)
  • Operator: update / rotate RAZORPAY_PLAN_ID_HOBBY_YEARLY to a plan billed
    at $99/yr
  • After merge: verify dashboard pricing page shows "$99/yr — save 1 month"
    for Hobby Annual and "$490/yr — 2 months free" for Pro Annual

… '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).
@mastermanas805 mastermanas805 merged commit 277b5a5 into master May 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant