Back to all terms
Payment
Paymentsintermediate

Multi-Currency Support

Supporting payments in multiple currencies by handling currency-specific formatting, zero-decimal currencies, exchange rates, and presentment currency selection for international customers.

Also known as: currency handling, international payments, FX, currency conversion

Description

Multi-currency support enables your application to accept payments in the customer's local currency rather than forcing everyone to pay in a single currency. Stripe supports 135+ currencies and handles the foreign exchange conversion automatically, settling funds in your default bank account currency. You charge the customer in their preferred currency (the presentment currency), and Stripe converts the funds to your settlement currency at the current exchange rate, minus an FX fee (typically 1-2% on top of standard processing fees).

The primary engineering challenge is correctly handling currency amounts. Stripe expects amounts in the smallest currency unit (cents for USD/EUR, yen for JPY), but different currencies have different decimal structures. Most currencies use 2 decimal places (100 cents = $1.00), but zero-decimal currencies like JPY, KRW, and VND use no decimal places (charge 1000 for 1000 yen). Three-decimal currencies like KWD and BHD use 3 decimal places. Your application must use a currency configuration that maps each currency code to its decimal multiplier to correctly convert display amounts to Stripe's integer format.

Price localization strategy matters for conversion rates and revenue predictability. There are two approaches: dynamic conversion (set prices in your base currency and convert at current exchange rates) or fixed localized pricing (set explicit prices per currency, e.g., $10 USD / 9 EUR / 8 GBP). Fixed pricing provides better customer experience and revenue predictability but requires periodic review as exchange rates shift. Stripe's Price objects support multiple currencies natively via the currency_options parameter, allowing a single Price to have different amounts per currency.

Prompt Snippet

Define prices using Stripe's multi-currency Price objects with currency_options: { usd: { unit_amount: 1000 }, eur: { unit_amount: 900 }, gbp: { unit_amount: 800 } } for predictable localized pricing. Build a currency config map that maps ISO 4217 codes to their zero-decimal status (JPY, KRW, VND => multiply by 1; USD, EUR, GBP => multiply by 100; BHD, KWD => multiply by 1000) and use it consistently in all amount formatting. Determine the customer's preferred currency from their Stripe Customer object, browser Accept-Language header, or explicit preference stored in your users table. Display prices using Intl.NumberFormat(locale, { style: 'currency', currency }) for correct symbol placement and decimal formatting.

Tags

currencyinternationallocalizationfxpaymentsstripe