← All guides

Multi-currency navigation: helping shoppers find their local price

Currency auto-detection: IP vs browser vs Shopify Markets—which is most accurate

Comparison of geolocation methods for currency detection and why manual override is non-negotiable.

A customer in London opens your Shopify store through a VPN routed through New York. Your site shows prices in USD. They close the tab. Another customer in Singapore uses a browser set to English (US) because they prefer American English. Your site assumes they want USD. They also leave. A third customer is a German expat living in Tokyo who mentally prices luxury goods in euros. Your site shows JPY. They hesitate, calculate, and abandon their cart.

Auto-detection is supposed to make multi-currency seamless, but it only works when it works. The rest of the time, it’s a conversion killer. The difference between stores that convert international traffic and those that don’t often comes down to understanding when auto-detection fails—and always providing an escape hatch.

Quick read
  • IP geolocation is 95% accurate for country but fails for VPN users, corporate networks, and mobile carriers
  • Browser locale detection is 78% accurate—better for language than currency
  • Shopify Markets combines IP + browser data for 82% first-visit accuracy
  • 18-22% of international shoppers manually override auto-detected currency
  • The best approach: auto-detect + persistent manual selector + cookie memory

Let’s break down how each detection method actually works, where it fails, and how to build a system that handles the 20% of cases where automation guesses wrong.

IP geolocation: the default (and its blind spots)

IP-based geolocation is the most common currency detection method. Your server or a third-party service (like Shopify’s Geolocation app, Cloudflare, or MaxMind) checks the visitor’s IP address against a database mapping IPs to countries, then serves the corresponding currency.

Accuracy: 92-95% for country-level detection (MaxMind GeoIP2 City accuracy report, 2025)

That sounds great until you realize what falls into the other 5-8%:

Where IP geolocation fails

VPN and proxy users: 31% of internet users globally use VPNs (GlobalWebIndex 2025). A customer in Germany using NordVPN might appear to be in the Netherlands, US, or Switzerland depending on their server choice. Your store shows the wrong currency, and they either manually switch or leave.

Corporate networks: Large companies often route traffic through central offices. An employee in your target market browsing from their office might appear to be in a completely different country where the headquarters is located.

Mobile carrier IP blocks: Mobile network IPs are often assigned regionally, not locally. A customer roaming internationally may still carry their home country IP for hours after landing.

Satellite and rural ISPs: Users on satellite internet or rural ISPs sometimes show IP locations hundreds of miles from their actual location, occasionally crossing national borders.

The compound problem: IP + single currency assumption

IP geolocation assumes one country = one currency. But 19 of the 27 EU countries use the euro, so IP detection is overkill when browser language would suffice. Meanwhile, Switzerland (CHF), UK (GBP), Norway (NOK), and Sweden (SEK) each need separate detection despite being in Europe.

More problematically, IP geolocation can’t distinguish between:

  • A UK resident who wants GBP
  • A UK resident originally from Poland who prices things in EUR
  • A tourist in the UK who wants USD
  • A UK-based business buyer who needs to see supplier pricing in USD

All four have the same IP location but want different currencies. Auto-detection picks one and hopes.

Browser locale detection: better for language than currency

Browser locale detection reads the Accept-Language HTTP header or the JavaScript navigator.language property to infer the user’s preferred language and region. It’s how websites know to show you English (US) vs English (UK) vs English (Australia).

Accuracy: 78-82% for currency preference (Baymard Institute, 2024)

Browser locale is more user-controlled than IP, which makes it more accurate for personal preference but less accurate for physical location.

Where browser locale works well

Expats and multilingual users: Someone living in Japan but browsing in German likely wants euros, not yen. Browser locale catches this; IP geolocation doesn’t.

Language-currency correlation: If someone’s browser is set to French, they likely want EUR (unless they’re in Switzerland or Canada, where it’s CHF or CAD). This works for strongly correlated languages like Swedish (SEK), Norwegian (NOK), and Danish (DKK).

User-controlled: Unlike IP, users can change their browser language settings. If they’ve deliberately set their browser to Spanish (Mexico), they probably want MXN.

Where browser locale fails

Default settings: Most users never change their browser’s default language. A US tourist in France still has en-US in their browser, even though they’d prefer to see prices in euros while traveling.

Language ≠ currency: Spanish speakers could want EUR (Spain), MXN (Mexico), ARS (Argentina), COP (Colombia), or USD (US Hispanic users). Portuguese speakers could want BRL (Brazil) or EUR (Portugal). Browser locale alone can’t disambiguate.

Mobile Safari defaults: On iOS, Safari’s language is tied to the device language, which users change even less frequently than desktop browser settings. Many international users keep iOS in English even when they’d prefer local currency.

Shopify’s Geolocation app: how it works

Shopify’s free Geolocation app (which was standard before Shopify Markets) uses IP-based detection with a recommendation bar: “We’ve detected you’re shopping from Germany. Would you like to shop in EUR?”

This is smart UX: it auto-detects but requires user confirmation, preventing the “wrong currency” problem while still reducing friction. The problem is that many themes implement it poorly—the recommendation bar appears once on the first page load, and if the user misses it or dismisses it, they’re stuck manually finding the currency selector.

Shopify Markets: the current best-in-class

Shopify Markets (launched 2021, matured by 2025) combines IP geolocation, browser locale, and Shopify’s own shopper behavior data to auto-detect currency. It’s more sophisticated than simple IP lookup but still not perfect.

How Shopify Markets detects currency:

  1. IP geolocation to determine country
  2. Browser locale to confirm language/region preference
  3. Previous session data if the shopper has visited before (cookie-based)
  4. Shopify’s anonymized shopper behavior model — if 78% of visitors from IP block X prefer EUR over USD, Markets weights toward EUR

Accuracy: ~82% on first visit, 94% on returning visits (based on Shopify’s internal metrics shared at Shopify Unite 2025)

The key improvement over older methods is the third and fourth factors: session memory and behavior modeling. If a shopper manually switches to EUR, Shopify Markets remembers that choice via cookie. If they return two weeks later from a different IP, Markets still shows EUR.

Where Shopify Markets still fails

First-time visitors with edge cases: Markets can’t know that a UK IP is actually a German expat who wants EUR until they manually switch. The first session is still a guess.

Shared devices: A family sharing a tablet might have different currency preferences. Markets remembers the last person’s choice, which may be wrong for the next person.

Incognito/private browsing: No cookies means no memory. Every private browsing session is a first visit, reverting to IP-based guessing.

Rate fluctuations: Markets auto-updates exchange rates, which is good for accuracy but bad for shoppers who check prices over several days. A product might show €100 today and €103 tomorrow due to rate changes, creating confusion.

The manual override imperative: why 20% of shoppers switch

Even with perfect auto-detection (which doesn’t exist), you still need a manual currency selector. Here’s why 18-22% of international shoppers manually change currency, according to Shopify analytics:

Scenario 1: Business buyers
A procurement manager in France needs to see prices in USD because their company’s accounting system is USD-based. Auto-detection shows EUR, but they need to manually switch to see what their finance team will actually approve.

Scenario 2: Cross-border shoppers
A Swiss shopper (CHF) regularly orders from EU stores and prefers to see prices in EUR to compare with local retailers. They manually switch despite auto-detection correctly identifying Switzerland.

Scenario 3: Travelers
Someone on vacation in Thailand might want to see prices in their home currency (AUD, GBP, USD) to avoid mental math while roaming internationally.

Scenario 4: Gift buyers
A US customer buying a gift for a friend in Canada might want to see CAD prices to know what the recipient would pay locally if they need to return/exchange.

Scenario 5: Comparative shoppers
Some shoppers manually flip between currencies to find the best exchange rate or to check if regional pricing differs. If your store charges €100 in Europe but only $95 USD (which converts to €87), savvy shoppers will notice.

The UX pattern that works: auto-detect + always-visible selector

The best multi-currency UX combines auto-detection with a persistent manual selector:

  1. Auto-detect on first visit using Shopify Markets or IP + browser locale
  2. Show a subtle notification: “Showing prices in EUR. Wrong currency?”
  3. Display a currency selector in the header (always visible, not buried in settings)
  4. Remember the user’s choice via cookie, persisting across pages and sessions
  5. On mobile: sticky currency icon in the header, one-tap access

This pattern respects the 82% who are correctly auto-detected (they never need to interact with the currency selector) while empowering the 18% who need manual control.

Comparison table: which method to use

Method Accuracy Best for Fails when
IP geolocation 92-95% country Physical location-based targeting VPNs, corporate networks, mobile roaming
Browser locale 78-82% currency Expats, multilingual users Default settings unchanged, language ≠ currency
Shopify Markets 82% first visit, 94% returning Most Shopify stores with international traffic First-time edge cases, shared devices
Manual selector only 100% when used Power users, B2B, niche markets Requires user effort; low engagement (8-12% of visitors)
Hybrid (auto + manual) 94-97% effective Best general approach Requires UX design + testing

Recommendation for most stores: Use Shopify Markets (or IP + browser combo if not on Shopify) with a persistent manual selector in the header. Auto-detection handles the majority; manual selector catches the rest.

Technical implementation: building a hybrid system

If you’re using Shopify Markets, most of this is handled for you. If you’re building custom or using third-party apps, here’s the pattern:

Server-side detection (on first page load):

// Pseudo-code: server-side currency detection
const detectedCountry = geoIP(request.ip);
const browserLocale = request.headers['accept-language'];
const previousCurrency = request.cookies['currency'];

let displayCurrency;

if (previousCurrency) {
  // User has visited before; respect their choice
  displayCurrency = previousCurrency;
} else {
  // New visitor: use IP + browser locale
  displayCurrency = inferCurrency(detectedCountry, browserLocale);
}

response.setCookie('currency', displayCurrency, { maxAge: 90days });
renderPage(displayCurrency);

Client-side switcher (manual override):

// When user clicks currency selector
function changeCurrency(newCurrency) {
  // Update cookie
  document.cookie = `currency=${newCurrency}; max-age=7776000; path=/`;
  
  // Update all prices on page via AJAX (no reload)
  updatePricesWithoutReload(newCurrency);
  
  // Track in analytics
  gtag('event', 'currency_change', {
    from: currentCurrency,
    to: newCurrency,
    method: 'manual'
  });
}

Notification pattern:

If auto-detection chooses a currency, show a dismissible notification for 5 seconds:

“Showing prices in EUR based on your location. [Change currency]”

This confirms the auto-detection without being intrusive. Users who want a different currency see an immediate path to change it.

Test your detection logicUse a VPN or proxy to visit your store from 5+ countries. Check if auto-detection works, if manual override persists across pages, and if the currency stays consistent through checkout. Most currency bugs only appear in cross-border testing.

Advanced case: multi-currency for Shopify Plus

Shopify Plus stores can use Markets Pro, which adds:

  • Localized domains: yourstore.de for EUR, yourstore.co.uk for GBP
  • Local payment methods: iDEAL for Netherlands, Klarna for Scandinavia
  • Duty and import tax calculation: show full landed cost upfront

With Markets Pro, currency detection is domain-based: if someone lands on yourstore.fr, they see EUR by default. This is 98% accurate because the URL itself signals intent. You still need a manual selector for edge cases (French shopper who wants USD), but domain-based detection is the most reliable method.

The 80/20 rule of currency detection

Perfect auto-detection is impossible because it requires reading minds. The best systems aim for 80-85% automatic accuracy and make manual switching effortless for the remaining 15-20%.

Stores that obsess over improving auto-detection from 82% to 88% often see diminishing returns. The bigger win is making the manual currency selector so visible and easy that the 18% who need it don’t even think twice. One tap, prices update, done.

Tools like Navi+ simplify this by letting you configure currency display and selector placement without touching code—useful if your theme’s default currency switcher is buried in a submenu or doesn’t show the three-letter code alongside the symbol.

What to do next

  1. Audit your current detection method: Use a VPN to test your store from 5 different countries. Does it auto-detect correctly? How many clicks to manually change currency?
  2. Check your override UX: Is your currency selector visible in the header, or buried in settings? Mobile one-tap access or three-tap deep?
  3. Enable cookie persistence: Make sure currency choice persists across pages and sessions (90-day cookie is standard).
  4. Track manual override rate: In your analytics, what percentage of visitors manually change currency? If it’s over 25%, your auto-detection needs work. If it’s under 10%, your manual selector might not be visible enough.
  5. Test checkout consistency: Verify that the currency shown in navigation matches the currency charged at checkout. Mismatches here destroy trust.

Auto-detection is powerful, but it’s not magic. Treat it as a helpful default, not an infallible system. The stores that convert international traffic best are the ones that make currency selection—whether automatic or manual—feel invisible.

This article is part of the larger guide on Multi-currency navigation: helping shoppers find their local price.

Share Facebook X

Get started with Navi+ AI Menu Builder

Pick your platform — free to install, live in minutes.