plan_prices table — there is no “base currency” concept.
How It Works
Currency Resolution at Checkout
When you callPOST /api/public/checkout, Crovver resolves the currency in this order:
- Explicit currency — use the value you passed in
currency(validated againstplan_prices) - Plan default — if no currency is passed, use the first active
plan_pricesentry (ordered bycreated_at ASC)
plan_prices row, the API returns 422 CURRENCY_NOT_SUPPORTED.
Seat-Based Multi-Currency
For seat-based plans eachplan_prices row stores both a base_price and a per_seat_price for that currency:
Pricing is always calculated in the tenant’s locked currency:
Add-on Pricing
Add-ons have the same per-currency pricing model (addon_pricing). A tenant can only purchase an add-on in their subscription’s currency. Attempting to buy with a different currency returns 422.