15% off your first purchase with code WELCOME15, up to 25 GB.

See pricing

Guide · Travel data

How to compare prices across countries and markets

Comparing prices across markets needs five controls: the identical product, a known point of sale for each market, observations taken at the same time, one documented exchange rate applied after collection, and the same tax treatment on both sides. Drop any one and the gap you measure may be an exchange-rate artefact, a tax difference or simply a different product.

Reviewed 30 Oct 2026

The short answer

  • Define the product by its attributes, not its name. Eurostat's international price comparisons rest on products that are comparable across countries and representative in each — a good standard for any cross-market study.
  • Collect each market from inside that market and record the displayed currency. Never let the collector's location choose the market for you.
  • Convert after collection with one dated reference rate, such as the ECB's euro reference rates, and keep the original amount and currency.
  • In the EU, the selling price shown to consumers includes VAT and all other taxes. US prices for many goods exclude sales tax. Compare net with net or gross with gross.
  • Report a gap only when it persists across repeated, synchronised observations.

Step 1: make sure it is the same product

Most false price gaps are product differences. A model sold under one name in two countries can differ in storage size, bundle, warranty or condition; a hotel “double room” can differ in board and cancellation terms; an air fare can be a different fare brand.

Eurostat's method for purchasing power parities states the principle clearly: prices are collected for products that are both comparable across countries and representative of what is bought in each. For a commercial comparison, that means matching on identifiers first and attributes second.

  • Match on GTIN, manufacturer part number or the site's own product ID where it is shared across editions.
  • Compare unit prices when pack sizes differ.
  • For services, fix every condition: itinerary and fare brand for flights, room type, board and cancellation for hotels.

Step 2: control the point of sale

A market is not one switch. Sellers infer it from several signals, and a comparison needs each one set on purpose and written down.

SignalHow to control itWhat to record
Site editionChoose the country domain or path explicitlyedition
Request locationExit from inside the market, e.g. a proxy with country targetingExit country, verified
LanguageSend an Accept-Language that matches the editionaccept_language
Display currencyLeave the market default unless you study conversioncurrency
Delivery locationWhere a site asks for a postcode, set one inside the market, logged outpostcode

Verify the exit before you trust it; testing a proxy's location shows how. For the airline version of this problem, see why flight prices differ by country and point of sale.

Step 3: synchronise the timing

Prices and exchange rates both move during the day. Collect all markets for one product within the same few minutes, store observed_at in UTC, and run the comparison on the same weekday across weeks. For travel, also hold the booking window constant — 30 days before departure in every market, not 30 days in one and 29 in another.

If a source changes prices several times a day, take several synchronised rounds and compare medians rather than single readings.

Step 4: normalise currencies with a reference rate

Use one published reference rate per day, applied after collection. The European Central Bank publishes euro reference rates for its list of currencies at around 16:00 CET on working days, based on a daily concertation between central banks at around 14:10 CET. The ECB publishes them for information purposes only — they are a measurement standard, not a rate anyone trades at.

  • Keep the original amount and currency on every observation; store converted values in a derived column or view.
  • Fix a rule for which day's rate applies and document it — for example, the latest rate published on or before the observation date, so weekends use Friday's rate.
  • Do not use a site's own converted price as the comparison base. It carries the seller's exchange margin, which is a separate subject — see booking currency markups.
  • Report the gap in both ways: in the reference currency, and in local currency against the reference rate, so readers can see how much of a gap is the exchange rate moving.

Step 5: put taxes on the same basis

Under the EU's Price Indication Directive (98/6/EC), the selling price shown to consumers is the final price including VAT and all other taxes. In the US, many prices are shown before sales tax, and even the FTC's fees rule for lodging and live-event tickets allows government taxes to be left out of the headline total as long as they are disclosed before payment.

So strip VAT from EU prices at the rate that applies to that product in that country, or estimate tax on the US side — and say which you did. For air fares in the EU, Regulation 1008/2008 requires taxes, airport charges and other charges to be specified alongside the final price, which lets you separate the fare from the tax stack.

Reading the result

  • Express each gap as a percentage of the reference market, and publish the median of repeated observations, not the extreme.
  • Separate effects: product mismatch, tax basis, exchange rate and genuine price difference, in that order.
  • Watch for availability effects. A market that shows a higher price may simply have sold out of the cheaper variant.
  • Keep the raw observations. A comparison that cannot be recomputed with a different exchange-rate rule is hard to defend.

Running this continuously is a price monitoring workload; aggregated into indices it becomes online price index data. Collecting from inside each market usually means residential proxies with country targeting.

Code

Worked example

Normalise with a dated reference rate and a common tax basis
from datetime import date, timedeltafrom decimal import Decimal, ROUND_HALF_UP# ECB euro reference rates: 1 EUR = rate units of the currency, one set per working day.# Load them from the ECB; the numbers below are placeholders, not real rates.ECB = {    date(2026, 10, 29): {"USD": Decimal("1.0790"), "GBP": Decimal("0.8321"), "JPY": Decimal("163.12")},    date(2026, 10, 30): {"USD": Decimal("1.0812"), "GBP": Decimal("0.8335"), "JPY": Decimal("163.40")},}def rate_for(day: date, currency: str) -> Decimal:    """Use the latest reference rate on or before the observation date (weekends, holidays)."""    for back in range(7):        rates = ECB.get(day - timedelta(days=back))        if rates and currency in rates:            return rates[currency]    raise LookupError(f"no ECB rate for {currency} near {day}")def to_eur(amount: str, currency: str, observed: date) -> Decimal:    value = Decimal(amount)    if currency == "EUR":        return value    return (value / rate_for(observed, currency)).quantize(Decimal("0.01"), ROUND_HALF_UP)def net_of_vat(gross: Decimal, vat_rate: str) -> Decimal:    """Strip VAT from an EU consumer price so it can be compared with a pre-tax US price."""    return (gross / (1 + Decimal(vat_rate))).quantize(Decimal("0.01"), ROUND_HALF_UP)us = to_eur("199.99", "USD", date(2026, 11, 1))          # Sunday: uses Friday 30 Octoberde = net_of_vat(Decimal("229.00"), "0.19")               # the VAT rate that applies in that marketprint(us, de, f"{(de / us - 1) * 100:.1f}% gap")

FAQ

Questions

Something not covered? Write to contact@arcproxies.io.

Which exchange rate should I use to compare prices between countries?

One published reference rate per day, applied after collection and documented — for euro comparisons, the ECB's euro reference rates are a common choice. Keep the original amounts so the comparison can be recomputed with a different rule.

Why is the same product cheaper in one country than another?

Common reasons are different taxes, a different product variant, exchange-rate movements, local competition and deliberate market-by-market pricing. A careful comparison removes the first three before concluding that the price itself differs.

Should I compare prices with or without VAT?

Either, as long as both sides are on the same basis. EU consumer prices include VAT by law, while many US prices exclude sales tax, so comparing them as displayed mixes a tax difference into the price gap.

Does using a proxy change the price a website shows?

It can, because request location is one of the signals a seller uses to decide the market. Site edition, language and delivery address are others. That is why each signal should be set deliberately and recorded with the price.

How many observations do I need before reporting a price gap?

There is no universal number, but one reading is an anecdote. Repeat synchronised observations across several days and report the median gap and how often it appeared.

Do I need purchasing power parity to compare prices?

Not to answer “where is this product cheaper to buy”. Purchasing power parities compare overall price levels between economies; for a like-for-like product comparison, a market exchange rate is the right converter.

Sources & review

Last reviewed by the ARC Proxies team. Prices are read from the live catalog at build time.

  1. [1]European Central Bank: Euro foreign exchange reference rates
  2. [2]Eurostat: Purchasing power parities — methodology
  3. [3]European Parliament and Council (via legislation.gov.uk): Directive 98/6/EC on consumer protection in the indication of prices, Article 2
  4. [4]Federal Trade Commission: Rule on Unfair or Deceptive Fees: Frequently Asked Questions
  5. [5]European Parliament and Council (via legislation.gov.uk, as adopted): Regulation (EC) No 1008/2008, Article 23

Next

Where to go from here

Use caseProxies for price and competitor monitoringSee the price a shopper in Berlin, Lyon or Chicago sees. ISP bandwidth at our lowest price per GB for HTML checks, residential where a marketplace is strict.Use caseProxies for market research and sentimentSample what a market actually publishes — catalogues, forums, reviews and news — from inside that market, on a schedule you can repeat and defend.Use caseProxies for travel fare aggregationAirline, hotel and rail fares change with the point of sale. Query each market from an IP inside it so the fare you store is the fare a traveller is quoted.Use caseProxies for price and competitor monitoringSee the price a shopper in Berlin, Lyon or Chicago sees. ISP bandwidth at our lowest price per GB for HTML checks, residential where a marketplace is strict.Deep diveOnline price indicesBuild daily price indices from public online prices for inflation nowcasting. Per-market exits, steady daily cadence, per-GB billing, no subscription.Deep diveBooking currency markupsMeasure currency conversion markups on travel booking pages against ECB reference rates, per site, market and step, for researchers and payments teams.GlossaryPoint of sale (POS)Point of sale (POS), in travel, is the market in which a fare or rate is sold — usually the country of the seller or of the website edition the traveller uses — and airlines, hotels and other suppliers can set different prices, conditions and availability for each one.GuideHow to test a proxy's locationCheck a proxy's exit IP and geolocation with curl, why IP geolocation databases disagree, and how to verify what the target site actually sees.GuideWhy flight prices differ by countryThe same flight costs different amounts in different countries because fares are filed and sold per point of sale, and taxes follow the departure airport.ProductResidentialReal consumer IPs in 185+ countries with city targeting, rotating or sticky, billed per gigabyte with no subscription and no expiry.