The two questions to settle first
Multi-currency is not one feature. It is two decisions that get conflated.
Display currency: what the customer sees prices in. A visitor from Canada sees CAD.
Settlement currency: what the customer is actually charged in, and what lands in your account. The Canadian customer's card is charged in CAD, or it is charged in your home currency and their bank converts.
Most "multi-currency" plugins do the first. Whether they do the second depends on the gateway, and the difference shows up on the customer's statement and in your accounts. Decide which you are doing before choosing tools.
Option A: display only
Prices are shown converted; the charge is made in your base currency. The customer sees CAD 135 on the product page and their statement shows a charge in your currency, plus their bank's conversion, which may not equal CAD 135. Some customers dispute this. Your accounting stays in one currency.
Legitimate for stores where the convenience of local prices matters and the audience accepts a home-currency charge. Must be disclosed clearly at checkout: "You will be charged GBP 79.00; the CAD amount is approximate."
Option B: charge in the customer's currency
The gateway supports the currency, the order is placed in it, and the statement matches what was shown. Cleaner for the customer. Your gateway either settles into a balance in that currency (Stripe, PayPal and Adyen can hold multi-currency balances) or converts at their rate to your home currency, with a fee. Your accounting now has orders in several currencies and your bookkeeper needs to know.
This is what "proper" multi-currency means and it is what WooCommerce's own multi-currency approach (via WooPayments) and the serious plugins (Aelia, WPML's WooCommerce Multilingual & Multicurrency, CURCY with gateway support) do.
Exchange rates and rounding
Rate source. Automatic rates from a provider (ECB, Open Exchange Rates, Fixer, the gateway's own) updated daily, or fixed rates you set. Automatic keeps margins consistent; fixed keeps prices stable and is what most retail brands want, because a product that is CAD 135 today and CAD 137 tomorrow looks broken.
Manual prices per currency. Best of all for a modest catalogue: a CAD price field per product, set by a human to a sensible number. WooPayments and several plugins support per-currency manual prices, falling back to the rate for products without one.
Rounding. Converted prices produce CAD 134.57. Round to a psychological price: nearest whole unit, or ending in .99 or .95 or .00 by currency convention. Configure the rounding rule per currency and apply it consistently, including to sale prices and to shipping. Then check that tax calculations and coupon percentages are applied to the rounded price, not the raw conversion, so the total on the cart equals the price on the product page.
Margin buffer. If you settle in home currency at a later date, the rate has moved. Add a small percentage to automatic conversions to cover it. Two to three percent is typical.
Gateway support
Every gateway lists supported currencies and settlement currencies. Check three things for each gateway you offer:
- Does it accept a charge in the display currency at all?
- Does it settle in that currency or convert, and at what fee?
- Does its WooCommerce integration read the order currency correctly, or assume the store's base currency?
The third catches stores out: a gateway plugin that hard-codes the base currency charges the CAD amount as if it were GBP. Test with a real low-value order in each currency and check the gateway dashboard shows the right currency and amount.
Gateways that do not support a currency should be hidden when that currency is active, via woocommerce_available_payment_gateways. Some plugins handle this; verify.
Geo-detection and choice
Set the initial currency from the visitor's location (WooCommerce's geolocation, or the CDN's country header) and let them change it with a visible switcher that remembers the choice. Never lock a visitor to a currency by IP; travellers and VPN users will be wrong. Never switch currency mid-checkout.
The switcher's choice must persist through cart and checkout and must be respected by any cached price fragments. Page caches need to vary by currency (a cookie, with the cache configured to key on it) or exclude prices from cached HTML.
Search, feeds and structured data
Product schema (Offer.priceCurrency), Google Merchant Center feeds and any price comparison feeds need the right currency per market. A feed in GBP submitted to Merchant Center for Canada is rejected. Most feed plugins can emit per-currency feeds when the multi-currency plugin exposes prices; check.
Refunds
A refund must be in the order's currency for the gateway to process it, and WooCommerce refunds in the order currency by default. Partial refunds and rounding: refunding "CAD 20 of a CAD 135 order" is fine; refunding a percentage recalculated from the base price can produce a cent discrepancy that the gateway rejects. Refund from the order's own amounts.
Reporting
WooCommerce Analytics reports in the store's base currency and converts multi-currency orders using the rate stored on the order at purchase time, if the multi-currency implementation records it. Confirm your plugin does; otherwise reports mix currencies as if they were one. Your accountant will want an export by currency with settlement amounts from the gateway alongside.
The testing list
- A product page in each currency shows a sensibly rounded price.
- Cart total equals the sum of displayed prices, with tax and shipping in the same currency.
- Each gateway either accepts the currency correctly (right amount, right currency in its dashboard) or is hidden.
- The customer's statement matches the checkout amount, for option B.
- Currency persists across cart, checkout, login, and page cache.
- A refund in each currency succeeds.
- Structured data and feeds carry the right currency per market.
- Analytics converts multi-currency orders sensibly.
Where this sits
Multi-currency is one of the WooCommerce features most often installed and least often tested end to end, and the failure mode is a customer charged the wrong amount. The gateway checks and the testing list above are how we scope it in WooCommerce work, and the first question is always A or B.