Skip to main content
Crovver supports billing tenants in multiple currencies from a single plan definition. Each plan stores one pricing entry per supported currency in the plan_prices table — there is no “base currency” concept.

How It Works

When a tenant subscribes, the chosen currency is locked to their subscription for its lifetime. All future renewals, proration charges, and add-on purchases use that currency.

Currency Resolution at Checkout

When you call POST /api/public/checkout, Crovver resolves the currency in this order:
  1. Explicit currency — use the value you passed in currency (validated against plan_prices)
  2. Plan default — if no currency is passed, use the first active plan_prices entry (ordered by created_at ASC)
If you pass a currency that has no matching plan_prices row, the API returns 422 CURRENCY_NOT_SUPPORTED.

Seat-Based Multi-Currency

For seat-based plans each plan_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.

Supported Providers by Currency

Different payment providers support different currencies. Map providers to currencies when configuring your org:

Setting Up New Currency Pricing

Use the plans API or dashboard to add a price per currency:
For add-ons: