Skip to content

Simplify annual pricing labels - #9373

Merged
lawrencecchen merged 4 commits into
mainfrom
task-pricing-yearly-suffix
Aug 1, 2026
Merged

lawrencecchen merged 4 commits into
mainfrom
task-pricing-yearly-suffix

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Aug 1, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • replace annual price suffixes with /mo. and /user/mo.
  • remove annual billed-total detail rows from public, embedded, and dashboard pricing
  • keep English and Japanese pricing catalogs aligned

Testing

  • bun test tests/pricing-page.test.tsx tests/app-pricing-page.test.tsx tests/dashboard-billing-page.test.tsx
  • bun run typecheck
  • repository-pinned ESLint on changed TypeScript files

Issues

  • Related: user-requested pricing copy cleanup

View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.


Summary by cubic

Simplified annual pricing labels across public, embedded, and dashboard pages: replaced “billed yearly” copy with “/mo” and “/user/mo,” removed annual billed-total amounts and comparison rows, and now show monthly equivalents (e.g., “$24/mo, billed annually”).

Tightened the pricing card layout (removed the price-detail area and min-height), aligned prices and usage rates with tabular numerals, switched the app pricing grid to 4 columns at the lg breakpoint, synced EN/JA catalogs (including FAQ and dashboard strings), and updated tests.

Written for commit 61bfa20. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • Updates

    • Simplified Pro and Team annual pricing cards by removing billed-amount and discount details.
    • Annual pricing now uses concise monthly rate labels, including localized Japanese labels.
    • Pricing cards retain annual rates and provide direct checkout actions.
    • Improved pricing card spacing for a cleaner layout.
  • Tests

    • Updated pricing and billing checks to reflect revised labels and removed annual billing messaging.

@coderabbitai

coderabbitai Bot commented Aug 1, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Annual pricing cards no longer show billed-amount and discount details. English and Japanese labels now use abbreviated monthly suffixes. Shared PlanCard layout and related tests reflect the updated pricing display.

Changes

Pricing display

Layer / File(s) Summary
Pricing card contract and rendering
web/app/components/pricing-shared.tsx
PlanCard no longer accepts or renders priceDetail. The price container no longer uses fixed minimum height, and the content margin is reduced.
Pricing cards and annual labels
web/app/[locale]/dashboard/billing/page.tsx, web/app/[locale]/pricing/page.tsx, web/messages/*.json
Pro and Team cards omit annual billed-amount and discount details. English and Japanese labels use shorter monthly text.
Pricing display assertions
web/tests/*pricing-page.test.tsx, web/tests/dashboard-billing-page.test.tsx
Tests expect abbreviated monthly labels and reject the previous annual billing, savings, and fixed-height markup.

Estimated code review effort: 1 (Trivial) | ~5 minutes

Possibly related PRs

  • manaflow-ai/cmux#9234: Updates annual pricing details and labels across the same pricing pages, translations, and tests.

Suggested reviewers: azooz2003-bit


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 error)

Check name Status Explanation Resolution
Cmux Full Internationalization ❌ Error The PR changes pricing labels only in en.json and ja.json, while routing.ts lists 20 locales; the other 18 catalogs lack pricing entries and therefore render changed English fallback copy. Add translated pricing entries to web/messages/zh-CN.json, zh-TW.json, ko.json, de.json, es.json, fr.json, it.json, da.json, pl.json, ru.json, bs.json, ar.json, no.json, pt-BR.json, th.json, tr.json, km.json, and uk.json.
✅ Passed checks (24 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed The complete commit diff changes only TSX and JSON files; it contains no production Swift changes or actor-isolation declarations to assess.
Cmux Swift Blocking Runtime ✅ Passed The full PR range changes only .tsx and .json files; it contains no Swift files or Swift blocking-runtime primitives.
Cmux Browser Automation Off-Main ✅ Passed The complete PR range changes only web pricing files; TerminalController.swift and ControlCommandExecutionPolicy.swift are unchanged, with no browser-routing or WebKit wait hunks.
Cmux Expensive Synchronous Load ✅ Passed The aggregate PR diff contains only web TypeScript, JSON, and test files; it adds no Swift paths or synchronous agent-history load.
Cmux Cache Substitution Correctness ✅ Passed The PR only changes pricing presentation, messages, and tests; it does not replace any fresh read in a persistence, history, undo, or snapshot path with a cache.
Cmux No Hacky Sleeps ✅ Passed The PR diff only changes pricing markup, messages, and assertions; added-line and full changed-code scans found no sleep, timer, polling, delay, or retry synchronization.
Cmux Algorithmic Complexity ✅ Passed The PR only removes pricing detail JSX, changes labels, and adds assertions; no scalable collection scans or slower production algorithms are introduced.
Cmux Swift Concurrency ✅ Passed The cumulative PR diff changes nine web/JSON/TSX files and contains no Swift paths, so it introduces no Swift concurrency patterns.
Cmux Swift @Concurrent ✅ Passed The PR changes only web TypeScript/JSON/test files; the PR range contains no Swift paths or concurrency annotations, so this Swift-only check is not applicable.
Cmux Swift Package Boundaries ✅ Passed The PR diff contains only web TypeScript, JSON, and test files; it introduces no production Swift changes to evaluate against package boundaries.
Cmux Swiftpm Lockfiles ✅ Passed The commit changes only six web files; it contains no Package.swift, Package.resolved, .gitignore, workflow, or Xcode project changes, so the SwiftPM lockfile rule is not applicable.
Cmux Swift Logging ✅ Passed The commit changes only web pricing, message, and test files; it adds no Swift files or Swift logging statements, so the Swift logging rule is not applicable.
Cmux User-Facing Error Privacy ✅ Passed The PR changes pricing labels and removes annual detail rows; it adds no user-facing errors or diagnostics and exposes no forbidden provider, billing ID, credential, token, or payload data.
Cmux Swiftui State Layout ✅ Passed The pull request changes only web TSX and JSON files; no Swift sources or SwiftUI state/layout patterns appear in the diff.
Cmux Architecture Rethink ✅ Passed The PR changes only web TSX, JSON, and test files; the full PR range contains no Swift paths or Swift architectural constructs.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed The cumulative PR diff changes only web TypeScript/TSX and JSON files; it adds or changes no Swift windows or close-shortcut code.
Cmux Source Artifacts ✅ Passed The aggregate diff contains only tracked TypeScript source/tests and English/Japanese localization files; no artifact directories, logs, screenshots, binaries, caches, or build outputs are added.
Cmux No Test Or Debug Seam In Production Source ✅ Passed The PR changes only web TypeScript/JSON/test files; no changed Swift file matches production **/Sources/** outside **/Tests/**, so the rule is not applicable.
Cmux No Ambient Global State ✅ Passed The diff changes only TypeScript, JSON, and test files; it contains no Swift changes, so the Swift ambient-global-state rule does not apply.
Title check ✅ Passed The title clearly summarizes the main change: simplifying annual pricing labels across the pricing views.
Description check ✅ Passed The description includes a relevant summary and testing details, but omits the demo video, review trigger, and checklist template sections.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch task-pricing-yearly-suffix

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@lawrencecchen

lawrencecchen commented Aug 1, 2026 •

Copy link
Copy Markdown
Contributor Author

Updated Vercel previews for commit 61bfa20413:

Both use /mo pricing, omit annual dollar totals, and the app view uses four desktop columns.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@web/tests/app-pricing-page.test.tsx`:
- Line 101: Update the Team card assertions in
web/tests/app-pricing-page.test.tsx lines 101-101 and
web/tests/pricing-page.test.tsx lines 84-84 to expect the shortened
"$35/user/mo." suffix; leave any separate comparison-table assertion using the
full "/month" value unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 5ae34f20-ab8d-49fa-9fb3-2a8bb1cdbe4a

📥 Commits

Reviewing files that changed from the base of the PR and between 834ddc2 and ff4397a.

📒 Files selected for processing (6)
  • web/app/components/pricing-shared.tsx
  • web/messages/en.json
  • web/messages/ja.json
  • web/tests/app-pricing-page.test.tsx
  • web/tests/dashboard-billing-page.test.tsx
  • web/tests/pricing-page.test.tsx

Comment thread web/tests/app-pricing-page.test.tsx Outdated
@lawrencecchen

Copy link
Copy Markdown
Contributor Author

Localization review disposition: the pricing route is intentionally authored only for English and Japanese via fallbackContentLocales in web/i18n/locale-availability.ts. Other locale catalogs deep-merge the English default by design. The changed English and Japanese pricing key sets match, so no additional locale entries are required.

@lawrencecchen
lawrencecchen merged commit 43d1d3c into main Aug 1, 2026
6 checks passed
@lawrencecchen
lawrencecchen deleted the task-pricing-yearly-suffix branch August 1, 2026 10:02
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