skills/payments-checkout/multi-currency/SKILL.md
Let international shoppers browse and pay in their local currency with automatic detection, live exchange rates, and locale-specific price formatting
npx skillsauth add finsilabs/awesome-ecommerce-skills multi-currencyInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Multi-currency support lets international shoppers browse and pay in their local currency instead of your store's base currency. On Shopify, WooCommerce, and BigCommerce, this is a configuration task — each platform has built-in or app-based solutions that handle exchange rates, price display, and payment settlement automatically. Custom code is only required for headless storefronts.
| Platform | Recommended Approach | Settlement Currency | |----------|---------------------|---------------------| | Shopify (Shopify Payments) | Enable Markets and multi-currency in Shopify Admin | Stripe/Shopify settles in your payout currency; conversion is automatic | | Shopify + non-Shopify gateway | Install BEST Currency Converter or MLV Auto Currency Switcher app | Display-only conversion; payment taken in base currency | | WooCommerce | Install WooCommerce Payments (for native multi-currency) or WPML + WooCommerce Multilingual | WooCommerce Payments settles in local currency; other gateways may convert | | BigCommerce | Enable Multi-Currency in Store Settings; use Stripe for multi-currency settlement | BigCommerce handles display; Stripe settles in customer's currency | | Custom / Headless | Use Stripe's multi-currency payment intents; fetch exchange rates from OpenExchangeRates | Stripe accepts charges in any currency and settles in your configured currency |
Shopify's Markets feature is the recommended way to implement multi-currency:
Exchange rate handling:
Currency selector in storefront: Shopify themes from OS 2.0 (Dawn, Crave, etc.) include a built-in currency/country selector. In Online Store → Themes → Customize, add the Header → Country/Region selector section.
Payment settlement: When using Shopify Payments, charges are made in the customer's currency. The payout to your bank account is in your default payout currency with Shopify handling the conversion. For Shopify Plus, you can configure multi-currency payouts with separate bank accounts per currency.
Option A: WooCommerce Payments (native multi-currency)
Option B: WooCommerce Multilingual + WPML
Option C: Currency Switcher for WooCommerce (free plugin)
For display-only currency switching (payment taken in base currency), install Currency Switcher for WooCommerce by Aelia. This converts displayed prices but settles in your base currency — simpler but requires customers to understand they will be charged in USD (or your base currency).
Payment settlement with BigCommerce: Configure your payment gateway to accept charges in multiple currencies. Stripe (configured under Settings → Payments → Stripe) supports accepting payments in the customer's currency and settling in yours automatically.
Exchange rate fetching:
// Fetch and cache daily exchange rates from OpenExchangeRates (free tier available)
async function getExchangeRates() {
const cached = await redis.get('exchange_rates');
if (cached) return JSON.parse(cached);
const res = await fetch(
`https://openexchangerates.org/api/latest.json?app_id=${process.env.OER_API_KEY}&base=USD&symbols=EUR,GBP,CAD,AUD,JPY`
);
const { rates } = await res.json();
// Cache for 24 hours — daily rates are sufficient for display prices
await redis.setex('exchange_rates', 86400, JSON.stringify(rates));
return rates;
}
async function convertPrice(amountUSD, targetCurrency) {
if (targetCurrency === 'USD') return amountUSD;
const rates = await getExchangeRates();
return amountUSD * rates[targetCurrency];
}
Stripe multi-currency charge:
// Charge in customer's currency — Stripe handles conversion and settles in your payout currency
const paymentIntent = await stripe.paymentIntents.create({
amount: Math.round(displayPrice * 100), // Amount in smallest unit (EUR cents, JPY yen)
currency: customerCurrency.toLowerCase(), // 'eur', 'gbp', 'jpy'
automatic_payment_methods: { enabled: true },
metadata: { order_id: orderId, base_currency_amount: String(basePriceUSD) },
});
// Note: for JPY and other zero-decimal currencies, multiply by 1 (not 100)
const jpy_amount = Math.round(jpyPrice); // ¥3,000 → 3000, not 300000
Currency detection from browser:
// Detect preferred currency from browser language or IP country header
function detectCurrency(req) {
// Check explicit user preference first
if (req.cookies.preferred_currency) return req.cookies.preferred_currency;
// Cloudflare and similar CDNs provide the visitor's country
const country = req.headers['cf-ipcountry'];
const countryToCurrency = { US:'USD', GB:'GBP', DE:'EUR', FR:'EUR', AU:'AUD', JP:'JPY', CA:'CAD' };
return countryToCurrency[country] ?? 'USD';
}
Test these scenarios before going live:
| Problem | Solution |
|---------|----------|
| Prices flash to base currency on page load | Read the user's currency preference server-side (from a cookie) and render with the correct currency on first load; avoid client-side-only currency switching |
| JPY amount passed to Stripe as cents | For zero-decimal currencies (JPY, KRW), pass the whole amount — ¥3,000 → amount: 3000, not amount: 300000 |
| Payment amount does not match displayed price | Recalculate the payment amount server-side using the stored exchange rate at checkout time; never trust client-submitted amounts |
| Exchange rate missing for a currency | Default to base currency or show an error; do not silently use a zero rate which would make products free |
| Shopify currency showing but not accepted at checkout | Currency must be enabled under Settings → Payments → Supported currencies in addition to Settings → Markets; both settings must be configured |
tools
Let shoppers save products to a wishlist, share it with friends, and get notified when saved items come back in stock or drop in price
development
Build a themeable storefront with design tokens and CSS custom properties that supports white-labeling, multi-brand variants, and dark mode
development
Speed up product discovery with instant search suggestions, fuzzy typo matching, and category-aware results powered by Algolia or Elasticsearch
development
Build a mobile-first storefront with thumb-friendly navigation, sticky add-to-cart buttons, and touch-optimized components for high mobile conversion