Data On Demand, one-stop data solution
Markets Local sources. Your time zone.

Teams in five regions rely on us for local-language, multi-currency data.

Global coverage
Company A decade of data expertise.

An in-house team of 20+ engineers and analysts serving clients in 12+ countries.

About us
Blog

Comparing prices across AED, SGD, EUR and BRL without fooling yourself

Exchange rates are the easy part of cross-market price comparison; taxes, instalments, formats and pack sizes are where analyses quietly go wrong.

11 November 2025 · 6 min read · Pricing & promotions · global

Cross-market price comparison looks simple. Collect the price in each market, convert to a common currency, compare. In practice, most of the error in these analyses comes from steps that happen before the conversion. This post walks through the main traps, using one product sold in Dubai, Singapore, Berlin and São Paulo.

Start with what the page actually says

Here is how the same product, a pair of wireless earbuds with 40-hour battery life, might appear on retailer pages in four markets on the same day.

MarketDisplayedParsed valueTax statusNote
DubaiAED 349.00349.00 AEDVAT includedShelf price
SingaporeS$139.00139.00 SGDGST includedShelf price
Berlin99,99 €99.99 EURVAT includedComma as decimal separator
São PauloR$ 649,90 or 12x R$ 54,16649.90 BRLTaxes includedInstalment price shown more prominently

Already there are three ways to go wrong before any exchange rate is involved.

Trap one: parsing the number

"99,99" in Germany is ninety-nine euros and ninety-nine cents. "1.299,90" in Brazil is one thousand two hundred and ninety-nine reais and ninety centavos. A parser written for English-language sites will read both incorrectly, and the errors are large enough to survive into a report if nobody checks the distribution. Number parsing must be locale-aware, and every parsed value should be validated against a plausible range for its category and market.

  • Detect the decimal separator from the site's locale, not from the string alone.
  • Handle currency symbols that appear before or after the number, with or without a space.
  • Distinguish S$, R$ and a bare $ sign; they are not interchangeable.
  • Keep the raw displayed string next to the parsed value for audit.

Trap two: instalments and headline prices

In Brazil, retail pages commonly present instalment prices, such as twelve interest-free payments, as prominently as the full price. Some pages show a lower price for payment by instant transfer or in a single payment. A scraper that picks up the most prominent number may capture the instalment amount rather than the total. Decide which price represents the market, usually the full cash price, and capture the others as separate fields.

Trap three: tax-inclusive versus tax-exclusive

In the markets above, consumer prices are displayed including tax. That is not universal. In the United States, shelf prices are normally shown before sales tax, which varies by state and sometimes by city. Comparing a tax-inclusive price in one market with a tax-exclusive price in another builds a systematic bias into every row. Record the tax status of each price and choose one basis for comparison. For consumer positioning, tax-inclusive is usually the right basis; for manufacturer margin analysis, tax-exclusive may be more useful.

Most of the error in cross-market price comparison happens before the exchange rate is applied.

Trap four: choosing the exchange rate

There is no single correct rate, only a rate that suits the question. Be explicit about which one you use and apply it consistently.

Rate choiceBest forWatch out for
Daily reference rate on capture datePoint-in-time comparisonsShort-term volatility can create apparent price gaps
Monthly average rateTrend reportingMasks sharp currency moves within the month
Fixed budget rateInternal planning and pricing corridorsDrifts from reality over the year

The AED is pegged to the US dollar, so AED comparisons against USD are stable, while BRL can move substantially over short periods. A price gap between Dubai and São Paulo that widens over a quarter may reflect the currency, not any retailer decision. Where this matters, report the comparison in both local-currency and converted terms, and show the effect of the currency separately.

Trap five: the product is not quite the same

Cross-border comparisons often match products that are nearly identical. The earbuds sold in Germany may include a different charger. A grocery item may be 400g in one market and 450g in another. Regional variants can carry different model numbers for the same hardware. Match on identifiers where possible, normalise to per-unit prices for consumables, and flag any variant difference rather than quietly accepting it.

Trap six: purchasing power

Converting to a common currency tells you what the price is worth on foreign exchange markets. It does not tell you how expensive the product feels to a local shopper. For positioning questions, it can help to add a local context measure, such as the price relative to a reference basket in the same market. This is analysis layered on top of clean data, not a substitute for it.

A practical normalisation checklist

  1. Store the raw displayed price, currency symbol and locale.
  2. Parse numbers with locale-aware rules and validate ranges.
  3. Capture full, instalment and payment-method prices as separate fields.
  4. Record tax status and choose one comparison basis.
  5. Choose and document the exchange rate method.
  6. Match products on identifiers and normalise units.
  7. Report local-currency movement alongside converted comparisons.

None of these steps is difficult on its own. The value comes from applying them consistently, every day, across every market, so that a price gap on a report reflects a real difference rather than a parsing rule.

Put it into practice

See your own data before you commit.

Name the sources and fields you need. Within 24–48 hours you receive a real sample from your target sites, in your format, free of charge.

Request a free sample Talk to a data engineer Sample in 24–48 hours · NDA on request · Any format, any schedule