Show prices in local currency without breaking your pricing
What actually changes when a second country starts buying: the money, the tax line, the cache and the numbers your shoppers see.

Selling into a second country usually starts with a currency switcher and ends with a list of surprises. Prices that read like exchange-rate output. A shopper charged in dollars whose bank statement shows euros and a fee nobody quoted. Tax that must be shown inclusive in one market and exclusive in another. A cache that suddenly has to serve a different price to every visitor without slowing the store down. None of this is exotic, and none of it is really about the switcher. It is the gap between converting a number for display and genuinely running prices, tax and settlement per market. Here are the mechanics in roughly the order they bite.
Displaying a currency and charging in it are different things
A switcher that divides your USD price by today's rate and prints a euro sign is display conversion. The customer still pays in USD. Their bank does the real conversion at its own rate, adds a foreign-transaction or cross-border fee, and the statement shows a number you never quoted. That mismatch generates support tickets and disputes more reliably than it generates lost sales, because the shopper feels quietly overcharged after the fact. Charging in the shopper's currency is a different arrangement: your processor has to support that presentment currency, and you have to decide the settlement question — which currency lands in your bank account, and who absorbs the spread. Stripe, PayPal and Adyen each publish their own conversion margins and cross-border card fees. Read those before promising local pricing, because the fee structure usually decides whether real multi-currency charging is worth the operational weight.
Why auto-converted prices look wrong
A live rate turns 1,299 into 1,287.43, and that number tells the shopper the price was produced by a machine rather than chosen by a merchant. Price endings carry meaning — the retail pricing literature on 9-endings, including Anderson and Simester's field experiments on price endings, treats them as signals shoppers actually read — and an arbitrary decimal reads as no signal at all. Conversion also destroys price architecture: bundles stop looking like bundles, a deliberate 50-unit gap between tiers becomes a 48.61 gap, and the shape of your range dissolves. Manual price rules per market almost always convert better. You decide the product is 1,299 at home, 1,399 in one market and 1,199 in another, based on local willingness to pay, shipping cost and who else sells there. Rates then only matter at settlement, where they belong.
- Round to each market's local convention, not to the exchange rate
- Keep the gaps between tiers intentional in every currency
- Set a floor price per market so a rate move cannot cross it
- Re-price on a schedule you control, not on every rate refresh
Guessing the shopper's country versus letting them choose
Geolocation from an IP address is a guess. It is wrong for VPNs, corporate networks, travellers, expats and anyone buying a gift for another country, and when it is wrong it is loudly wrong: the shopper sees the wrong currency, usually alongside the wrong tax and shipping story. The pattern that holds up is to guess once, present the guess as a suggestion rather than a verdict, keep the switcher visible without hunting for it, and then remember what the shopper picked. Remembering matters more than guessing. Someone who switched to GBP and lands on GBP next visit reads the store as competent; someone who has to switch again on every page leaves. Store the choice as a preference, keep it out of the URL, and never let a fresh IP lookup silently overrule an explicit selection.
- Treat IP location as a suggestion, never as a decision
- Put the switcher where it is seen, not in the footer
- Persist the explicit choice and stop guessing after it
- Show currency and delivery destination together, not separately
Per-visitor prices versus the cache
The moment a price depends on who is looking, full-page caching gets complicated. A cached HTML page holds exactly one currency: serve it to everyone and a share of your shoppers see the wrong number; vary the cache on a currency cookie and you multiply every cached page by the number of markets, which quietly wrecks hit rate on a large catalogue. Most plugins resolve this by rendering prices at request time, which is precisely the path that makes WooCommerce feel slow under load. This is where a storefront rebuild genuinely helps rather than merely sounding modern. A Next.js storefront can serve the shell, layout, copy and imagery from the CDN for everybody, then resolve only the price-bearing parts per visitor against WooCommerce — so price, stock and tax stay correct while the page still arrives fast.
Tax display changes by market, not just the number
Currency is only half of what a new market changes. Consumer-facing prices in the EU and the UK are expected to be shown inclusive of VAT, Australia expects GST-inclusive pricing, and the US convention is the opposite: a shelf price plus destination-based sales tax added at checkout. So the same product may need to read 99 inclusive in one market and 99 plus tax in another, and no exchange rate can express that. B2B adds another layer, where a validated VAT number can move the same order to a zero-rated, tax-exclusive display — the sort of thing worth planning deliberately if you sell to business buyers. The tax engine itself stays where it is: WooCommerce and your tax plugin keep calculating, and the storefront's job is to display the result the way each market expects to read it.
What stays in WooCommerce and what changes
WooCommerce remains the system of record. Products and their per-market price rules, stock, coupons, tax rates and classes, orders, refunds and reporting all stay in WordPress, and the people who run the store keep the admin they already know. What changes is the customer-facing layer: how the price is chosen, formatted, cached and displayed, and how the currency preference travels with the shopper into the cart. Refunds deserve an explicit decision here, because they are usually issued weeks after the charge at a different rate. If you charged in the shopper's currency and settle in yours, a later refund can cost you more or less than you received; if the sale was display-only, the shopper's bank converts back at its own rate and they receive less than they paid, then email you about it. Pick a policy — normally refund the original amount in the original currency — and make sure whoever processes refunds in the admin follows it.
- Stays in WooCommerce: products, stock, coupons, tax rules, orders
- Stays in WooCommerce: refunds, reporting and your existing gateways
- Changes: price selection, formatting, caching and the switcher
- Changes: how the chosen currency follows the shopper to checkout
Currency and SEO: one URL per product, not one per currency
The common self-inflicted wound is spawning a URL per currency — a /eur/ path or a ?currency=EUR parameter — and letting search engines crawl all of them. You then have several addresses for one product with near-identical content, crawl budget spent on duplicates, and no clear canonical for the page you actually want ranking. Currency is a visitor preference; language and region are content. Language and country variants are what hreflang and separate URLs exist for, and a currency swap on the same English page is not one of those. Keep one canonical URL per product, resolve currency from the stored preference rather than the path, and if a parameter must exist for sharing, make sure it is not indexable. The same discipline that keeps a technical SEO setup clean during a redesign applies here.
When a plugin is enough, and when it stops being enough
For a lot of stores the honest recommendation is: install a well-maintained multi-currency plugin, set manual prices per market, check the tax display, and stop. If you sell in two or three currencies, run a few hundred products and your pages are already fast, a storefront rebuild is not the cheaper fix and we will say so. The picture changes when caching and per-visitor pricing start fighting each other, when many markets multiplied by a large catalogue makes request-time pricing slow, when your team is maintaining price rules by hand across markets, or when compliant tax-inclusive display per market has become a real requirement rather than a nice idea. Engagements here start at $1,999 and are scoped from what your store actually does — see pricing, or describe the setup and markets in a short scoping note and we will tell you which side of that line you are on.
Frequently asked questions
Do I need to charge in local currency, or is showing it enough?
Showing local prices removes most of the hesitation and is far simpler to run. Charging in local currency additionally removes the surprise fee on the customer's bank statement, but it requires processor support and a settlement decision. Start with display plus manual per-market prices, and move to real charging when a market is big enough to justify the extra handling.
What does this cost and how long does it take?
Engagements start at $1,999, and multi-currency work is scoped from the number of markets, catalogue size and how your tax and payment stack is configured. A plugin-level setup with manual price rules is days of work; a storefront rebuild that keeps per-visitor prices fast is a project measured in weeks. We scope it before quoting rather than after.
Will my existing currency plugin and payment gateways keep working?
Usually yes. WooCommerce stays the backend, so your gateways, tax plugin and price rules continue to run as they do now. If your currency plugin is sound, we read prices from it rather than replacing it; we only recommend a change when the plugin itself is the reason pages cannot be cached.
What happens to refunds when the exchange rate has moved?
The rate on the refund day is rarely the rate on the order day, so somebody absorbs the difference. The usual policy is to refund the original amount in the original currency of the charge, which keeps the customer whole in the currency they were quoted. Decide this once, write it into your refund policy, and brief whoever processes refunds in the admin.
Sell internationally
A checklist for opening a second market: pick it from your own data, localize the storefront, quote landed cost honestly, and get hreflang right the first time.
Multilingual
Run a multilingual WooCommerce store on a Next.js storefront: hreflang, translated URLs and metadata, WPML/Polylang data and locale routing done correctly.
Headless WooCommerce migration
Move WooCommerce to a fast Next.js storefront without losing WordPress operations, hybrid checkout, SEO URLs or plugin control.
See how many sales your store is losing
Start with a free speed audit. You'll get your store's real numbers and an honest recommendation — even if it's "you don't need us".