WooCommerce Multi-Currency: 5 Mistakes and How to Fix Them

WooCommerce Multi-Currency: 5 Mistakes and How to Fix Them

TL;DR: We run zamanistore.com across 26 countries with 26 currencies using WCML. These 5 mistakes each caused real financial or customer experience damage before we fixed them: wrong prices served from cache, Stripe receiving wrong currency amounts, stale exchange rates silently eroding margins, coupons giving away more than intended, and new visitors seeing the wrong currency on their first visit.

WooCommerce Multilingual (WCML) is the most robust multi-currency solution for WooCommerce. It integrates with WPML, handles translation, and supports complex pricing rules. But it has several non-obvious configuration requirements that cause real problems in production.

These 5 mistakes are ordered by financial impact. Mistakes 1 and 2 are the most expensive. Mistakes 4 and 5 are the most common among stores that set up WCML themselves without guidance.

The 5 Mistakes

1
Caching Without Currency Awareness
Critical

WP Rocket, Cloudflare, and most CDNs cache one version of each page by default. If a UAE visitor is the first to load your homepage, their AED-priced version gets cached. The next visitor from the UK gets the cached page with AED prices. No error, no warning — just the wrong number.

This is the most common issue on stores that add a CDN after launching multi-currency. The store worked fine before the CDN, then suddenly customers start complaining about prices.

WP Rocket: Add wcml_client_currency to the “Never Cache Cookies” field. This forces WP Rocket to serve separate cached versions per currency. Performance drops slightly (more cache variants), but prices are correct.

Cloudflare: A Cloudflare Worker that reads the wcml_client_currency cookie and builds currency-specific cache keys is the better solution. It keeps performance high while serving the right variant. The cache key looks like: /product/keffiyeh/?_cf_currency=AED. Each currency gets its own edge cache entry. At zamanistore.com with 26 currencies and ~100 pages, that is about 2,600 cache entries per Cloudflare PoP.

Fix: Add wcml_client_currency to WP Rocket’s “Never Cache Cookies” list, or implement a currency-aware Cloudflare Worker with per-currency cache keys.
2
Payment Processor Receiving the Wrong Currency
Critical

WCML has a payment gateway settings section that most people miss. By default, Stripe and PayPal receive the charge in your store’s base currency, not the customer’s currency. A customer in the UK sees £42 in the cart. Stripe charges them AED 42 (about £8.70). The payment succeeds, you get an underpayment, and you find out when reconciling statements.

More commonly: Stripe returns an error because the currency combination is not supported (some currencies cannot be charged in certain countries). The checkout fails silently, or the customer sees a generic error and abandons.

Go to WCML > Payments. For each gateway, set the currency to “Customer’s currency.” For Stripe, you also need to confirm your Stripe account supports payouts in each currency you sell in — not all do. A Stripe account in the UAE cannot receive payouts in GBP without enabling the feature.

Fix: WCML > Payments > set each gateway to “Customer’s currency.” Verify Stripe account supports payouts for each active currency.
3
Manual Exchange Rates That Go Stale
High

WCML allows manual exchange rate entry. Most stores do this once at setup and never update it. Over 6-12 months, major currency pairs move 5-15%. A store with AED as the base currency that set the USD rate at 3.67 in 2024 and never updated it is now selling to US customers at rates that may be off by $3-5 on a $40 product.

You are not always losing money — currency movement goes both ways. But you have no control, no visibility, and no ability to price intentionally by market when rates are hardcoded and stale.

The fix is automatic rate refresh. WPML/WCML supports external exchange rate APIs. Open Exchange Rates (free tier: 1,000 requests/month) and fixer.io are both reliable. Set the refresh interval to daily. The rates will never be more than 24 hours stale, and your prices will track actual market rates without manual intervention.

Fix: WCML > Currencies > set automatic exchange rate to “Open Exchange Rates” or “fixer.io” with daily refresh. Enter your API key in the settings.
4
Coupons That Do Not Convert by Currency
High

WooCommerce stores coupon discount amounts in your base currency. A coupon for “20 AED off” is stored as the number 20. When a US customer applies it, they get $20 off instead of the ~$5.45 equivalent. If your coupon is “10% off,” this is not an issue — percentage discounts are currency-agnostic. But if you use fixed-amount coupons for promotions, abandoned cart recovery, or referral rewards, you are giving away more than you intend in non-AED markets.

WCML has a coupon currency conversion setting that applies the exchange rate automatically. The coupon value stays as 20 AED in the database, but the checkout displays and deducts the correct converted amount per customer currency.

The other approach is to create currency-specific coupons: one for AED, one for USD, one for GBP, each with the correctly converted value. This is more work but gives you precise control over the discount in each market, independent of exchange rate fluctuations.

Fix: WCML > Coupons > enable “Convert coupon amounts to customer’s currency.” Or create per-currency coupon codes with manually set values per market.
5
The First-Visit Edge Case
Medium

A new visitor from the UK lands on your site for the first time. They have no wcml_client_currency cookie yet. WCML needs to run its geolocation logic, set the cookie to GBP, and serve the right prices. This is all correct behavior — on the first request.

The problem: if your Cloudflare cache (or WP Rocket, or any CDN) serves a cached page to this visitor before WCML runs, the visitor gets cached AED prices, and WCML sets the GBP cookie against a page they are already looking at. They refresh, see GBP prices. But the first page they landed on had AED prices. Depending on where they were in checkout, this creates confusion or incorrect cart totals.

The fix at the Cloudflare Worker level is to bypass cache entirely for requests with no wcml_client_currency cookie. Let the first visit always hit origin. Origin sets the cookie. Every subsequent visit (with the cookie) gets served from edge cache with the correct currency variant. The performance cost is one origin hit per new visitor per device — trivial.

// Cloudflare Worker: bypass cache for first-time visitors const currency = request.cookies.get(‘wcml_client_currency’); if (!currency) { return fetch(request); // pass through to origin }
Fix: In your Cloudflare Worker, check for the wcml_client_currency cookie before serving from cache. If missing, pass the request to origin. Cache only applies on subsequent visits when the currency cookie is present.

The Mismatch You Will Not See Until It Is Too Late

Even with all 5 fixes in place, a misconfigured cache rule or a WCML update can silently introduce currency mismatches. We built an n8n automation (WF38/WF39) that fires on every new order webhook and checks the billing country against the order currency. If a UK customer (billing country: GB) places an order in AED, the order is put on hold automatically and a Slack alert fires.

This catches 2-4 mismatches per week across zamanistore.com and Coloring Palestine. Without it, each one would become a support ticket, a refund request, or — worst case — a Stripe dispute.

Where to Start

If you are running WCML on a live store, check these in order:

  1. Open a product page in a private browser window from a country different from your base currency country. What prices do you see? Are they in the right currency?
  2. Add a test product to cart and proceed to checkout in a foreign currency. What does Stripe or PayPal show as the charge amount and currency?
  3. Apply a flat-amount coupon in a non-base currency. Is the discount amount correct for that currency?

These three tests take 10 minutes and will surface the most common issues immediately.

Is your store showing the right prices in every country?

Our free store health check audits your tracking, speed, SEO, and email setup in 60 seconds.

Get your free audit

One Bit Dispatch

Engineering posts, workflow breakdowns, and case studies. No filler.