Skip to content

Pricing parity: GBP and EUR for Cap Pro - #2130

Merged
richiemcilroy merged 4 commits into
mainfrom
pricing-parity
Aug 16, 2026
Merged

Pricing parity: GBP and EUR for Cap Pro#2130
richiemcilroy merged 4 commits into
mainfrom
pricing-parity

Conversation

@richiemcilroy

@richiemcilroy richiemcilroy commented Aug 16, 2026

Copy link
Copy Markdown
Member

Summary

Cap Pro now has pricing parity across USD, GBP and EUR: 12/mo and 98/yr in all three currencies, same digits, different symbol.

The Stripe side is already live: the existing production monthly and yearly prices carry gbp and eur currency_options, so Stripe Checkout automatically presents the visitor's local currency by IP. No new price IDs, so existing subscriptions, seat updates and webhooks are unaffected. Verified against production with rendered checkout pages (GBP 12.00/mo and GBP 98.00/yr from a UK IP) and the eurozone path via Stripe's location simulation in test mode.

This PR is the display layer:

  • New apps/web/utils/currency.ts with a country-to-currency map that mirrors Stripe Checkout's own IP localization (GBP for UK and crown dependencies, EUR for eurozone countries and territories, USD otherwise, including non-euro EU countries like Sweden and Poland which Checkout also bills in USD).
  • New public GET /api/currency endpoint reading x-vercel-ip-country, force-dynamic with private, no-store caching, plus a ?country=XX override outside production for testing.
  • New useCurrency() hook (SSR-safe, USD first paint, module-level request cache).
  • Pre-purchase surfaces show the visitor's presentment currency: homepage/pricing ProCard, ComparePlans Pro row, UpgradeModal, onboarding InviteTeamPage, analytics upsell.
  • Post-purchase surfaces (BillingSummaryCard, SeatManagementCard) now format amounts in the subscription's actual Stripe currency instead of a hardcoded dollar sign; the seat proration line goes from "$12.00 GBP" style to a properly formatted amount.
  • Desktop upgrade screen fetches the currency from the web server and swaps the symbol on the Cap Pro card only, falling back silently to USD offline.
  • Support AI pricing context updated to explain parity pricing and automatic currency selection.

Deliberately unchanged: Commercial License ($29/$58, separate license server), developer credits, SEO marketing pages and schema.org JSON-LD (static content stays USD).

Testing

  • 14 new unit tests for the currency utilities, including a parity invariant (identical digits in all three currencies).
  • Full web unit suite: 1520 passed, 1 pre-existing failure (slack-app-manifest, reproduces on clean main).
  • tsc -b apps/web apps/desktop clean.

🤖 Generated with Claude Code

Greptile Summary

Cap Pro pricing displays are localized to USD, GBP, or EUR while post-purchase billing surfaces use the subscription’s actual Stripe currency.

  • Adds a public Effect-based currency endpoint, shared currency utilities, and an SSR-safe client hook.
  • Updates web and desktop purchase surfaces to show localized symbols.
  • Correctly replaces the previously ad-hoc route handler with the repository-standard HttpApi and apiToHandler pattern.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains; the previously reported API-route architecture violation has been fixed.

Important Files Changed

Filename Overview
apps/web/app/api/currency/route.ts Implements geographic currency resolution using the required Effect HttpApi builder and apiToHandler route pattern, resolving the previous review finding.
apps/web/utils/currency.ts Defines supported currencies, country mappings, symbols, and resilient amount formatting.
apps/web/hooks/useCurrency.ts Provides an SSR-safe USD initial state and shared client-side request for geographic currency resolution.
apps/desktop/src/utils/currency.ts Fetches the presentment currency for the desktop upgrade screen with a silent USD fallback.
apps/web/app/(org)/dashboard/settings/organization/components/BillingSummaryCard.tsx Formats recurring billing amounts using the subscription currency rather than a hardcoded dollar sign.

Reviews (2): Last reviewed commit: "refactor(web): build /api/currency with ..." | Re-trigger Greptile

Context used:

…oint

Country to currency mapping mirrors Stripe Checkout's IP localization
(GBP for UK and crown dependencies, EUR for eurozone countries and
territories, USD otherwise) so displayed prices always match what
checkout presents.
Cap Pro pricing surfaces (pricing cards, compare table, upgrade modal,
onboarding upsell, analytics upsell) show the visitor's presentment
currency: 12 GBP/EUR/USD monthly, 98 yearly, same digits in every
currency. Billing surfaces format amounts in the subscription's actual
Stripe currency instead of a hardcoded dollar sign. Support AI pricing
context updated. Commercial license and SEO pages stay USD.
Fetches /api/currency from the configured web server and swaps the
symbol only, falling back silently to USD offline. Commercial license
card stays USD.
@cursor

cursor Bot commented Aug 16, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

Comment thread apps/web/app/api/currency/route.ts Outdated
@richiemcilroy

Copy link
Copy Markdown
Member Author

hey @greptileai, please re-review the PR

@richiemcilroy
richiemcilroy merged commit 4411e42 into main Aug 16, 2026
23 checks passed
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