Why localization testing needs proxies
If your product serves more than one country, it almost certainly behaves differently in each: different languages, currencies, prices, taxes, payment methods, legal notices, consent flows, shipping options and features. Much of that logic keys off the visitor's location, and location is usually inferred from the IP address. Testing from the office exercises one branch of that logic and leaves the rest to your customers.
Geo bugs are easy to ship and hard to notice. A pricing page that shows US dollars to Canadian visitors, a consent banner missing in one EU country, a redirect loop between two regional domains, a checkout offering a payment method that doesn't exist in that market. None of them show up in a test run from headquarters.
Proxies let you load your product as a local visitor in each market, manually or in automated tests. Geonode suits this well because it offers cheap datacenter traffic for testing your own services and residential traffic, targetable by country, state, city and ASN, for the flows that involve third parties or bot protection.
The short answer: use Geonode datacenter proxies in each country for routine checks of your own site's geo logic, and residential proxies with country or city targeting for checkout, third-party services, bot-protected pages and city-level features. Automate the checks with Playwright, one browser context per market, and run a small set on every release.
How your product decides where a visitor is
Before testing, list the signals your stack actually uses, because the IP is only one of them:
| Signal | Typical use | Controlled by |
|---|---|---|
| IP geolocation | Default country, currency, redirects, consent | The proxy |
Accept-Language header and browser locale | Default language | Browser settings |
| Time zone | Dates, delivery estimates, "open now" | Browser settings |
| Cookies and saved preferences | Remembered region or language | Your test's browser profile |
| Account country | Prices, tax, available features | The test account |
| Device GPS (apps) | Store locators, delivery areas | Device or emulator |
Good geo QA tests the realistic combinations (a German IP with a German browser) and a few deliberate mismatches (a German IP with an English browser, a returning visitor with a saved French preference). Mismatches are where most redirect loops and wrong-language bugs live.

Datacenter or residential?
| What you're testing | Recommended Geonode product | Why |
|---|---|---|
| Your own site's geo logic | Datacenter in each country | Your site won't block you; cheap and fast |
| Third-party services in the flow (payments, maps, fraud checks, ads) | Residential in each country | Some services treat datacenter traffic differently |
| Pages behind your own CDN bot protection | Residential | Your WAF may challenge datacenter IPs and hide the real page |
| City-level features (store locators, delivery areas) | Residential with city targeting | Datacenter locations are limited to hosting hubs |
| Behaviour for one ISP or mobile carrier | Residential with ASN targeting | Reproduces what those customers see |
What to check in each market
One table, used for every market and every release, beats ad hoc checking:
| Area | What to check | Automate? |
|---|---|---|
| Entry and redirects | The main domain sends visitors to the right regional site; no loops; the region switcher works and remembers the choice | Yes |
| Language | No untranslated strings on key pages; correct date, number and address formats | Partly |
| Prices and currency | Correct currency symbol and position; taxes shown as local rules require; prices match the price list | Yes |
| Checkout | Local payment methods appear; address forms accept local formats (postcodes, provinces, prefectures) | Yes |
| Legal | Consent banner appears where required and works; privacy and terms pages are the regional versions; imprint, age gates and disclosures present | Yes |
| Content and features | Regional promotions only where intended; unavailable features hidden, not broken | Partly |
| SEO signals | hreflang alternates are complete and reciprocal; canonical URLs are correct per version | Yes |
| Performance | Key pages load within your target time from that region | Yes |
Automate the rows marked yes and keep a short manual pass for visual layout, truncated translations and copy tone.
Manual testing in the browser
For exploratory checks and design reviews, use a browser with a proxy extension. Geonode offers a Chrome extension that switches location in a click; see using Geonode in Chrome.
Three habits make manual testing reliable:
- A fresh browser profile per market, so cookies and saved preferences from the last region don't leak into the next.
- Confirm the exit location on an IP lookup page before testing.
- Match the browser language and time zone to the market, unless you're deliberately testing a mismatch.
Proxy tip: You can try every step in this guide with a small balance: Geonode bills residential bandwidth per GB with no expiry, so testing costs very little. See our complete Geonode guide for the full product overview.
Automated geo testing with Playwright
For regression testing, give each market its own Playwright browser context with a country-targeted proxy, a matching locale and time zone, and assertions for the things that must be true in that market.
import { chromium } from 'playwright';
const MARKETS = [
{ country: 'de', locale: 'de-DE', timezoneId: 'Europe/Berlin', currency: '€', path: '/de/' },
{ country: 'gb', locale: 'en-GB', timezoneId: 'Europe/London', currency: '£', path: '/uk/' },
{ country: 'jp', locale: 'ja-JP', timezoneId: 'Asia/Tokyo', currency: '¥', path: '/jp/' },
];
const browser = await chromium.launch();
const failures = [];
for (const m of MARKETS) {
const context = await browser.newContext({
proxy: {
server: `http://${process.env.GEONODE_HOST}:${process.env.GEONODE_PORT}`,
username: `${process.env.GEONODE_USER}-country-${m.country}`,
password: process.env.GEONODE_PASS,
},
locale: m.locale,
timezoneId: m.timezoneId,
});
const page = await context.newPage();
// 1. The exit really is in this market
await page.goto('https://ipinfo.io/json');
const exit = JSON.parse(await page.textContent('body'));
if (exit.country.toLowerCase() !== m.country) failures.push(`${m.country}: exit is ${exit.country}`);
// 2. The home page redirects to the regional site
await page.goto('https://www.example.com/');
if (!new URL(page.url()).pathname.startsWith(m.path)) failures.push(`${m.country}: landed on ${page.url()}`);
// 3. Pricing shows the local currency
await page.goto(`https://www.example.com${m.path}pricing`);
if (!(await page.textContent('body')).includes(m.currency)) failures.push(`${m.country}: currency missing`);
// 4. hreflang alternates are present
const langs = await page.$$eval('link[rel="alternate"][hreflang]', ls => ls.map(l => l.hreflang));
if (!langs.includes('x-default')) failures.push(`${m.country}: no x-default hreflang`);
await page.screenshot({ path: `pricing-${m.country}.png`, fullPage: true });
await context.close();
}
await browser.close();
if (failures.length) { console.error(failures.join('\n')); process.exit(1); }The username suffix follows the -country- pattern in Geonode's documentation; use the exact format your dashboard shows. The same structure works in Puppeteer with one browser per market. More setup detail is in Geonode with Playwright.
SEO signals: hreflang and geo-redirects
Localization bugs often become SEO bugs, because search engines see your site from a few locations and rely on markup to understand the regional versions.
- hreflang tells search engines which language and country version to show each searcher. Every version should list all its alternates, including itself, and the alternates should point back. Missing return links are the most common error.
- Avoid forced redirects based on IP alone. Google recommends not automatically redirecting users purely by perceived location, partly because its crawler mostly visits from US addresses and can end up unable to reach other versions. A banner that suggests the local site, with a remembered choice, is safer for users and crawlers.
- Canonical tags on each regional page should point to that page, not to the default market's version.
Proxied tests are the easiest way to confirm all three behave as intended from each market, and to catch a redirect rule that only fires for visitors from one country.
City-level features and mobile apps
Store locators, delivery areas, local inventory and "near me" results depend on more precise location. Use residential proxies with city targeting and verify the detected location on the page itself, because IP geolocation databases disagree at city level. Treat a result within the right metro area as a pass.
Mobile apps add device locale, store region and GPS to the mix. Combine a proxy configured on the test device or emulator with the right device language, region settings and mocked location. The proxy only covers the network side.
Running geo tests in CI
- On every release candidate, run a smoke set: exit country, redirect, currency and consent for your top markets.
- Nightly, run the full table for every market and attach screenshots.
- Store proxy credentials in CI secrets, never in the test repository.
- Fail fast on exit country. If the proxy exits in the wrong country, mark the run as an infrastructure failure rather than a product failure, so nobody chases a bug that doesn't exist.
- Keep screenshots per market from the last good run, so reviewers can compare visually.
Costs
Testing your own site on datacenter traffic is cheap. Residential tests cost more because traffic is billed per GB, but runs are short and periodic. A rough estimate:
| Run | Markets | Pages per market | Data per page (with screenshots) | Traffic per run |
|---|---|---|---|---|
| Release smoke set | 6 | 4 | about 3 MB | about 70 MB |
| Nightly full set | 15 | 20 | about 3 MB | about 0.9 GB |
At nightly frequency, the full set is about 27 GB a month, and only the residential portion needs residential traffic. Two easy savings: run the checks that don't involve third parties on datacenter IPs, and block video and large images in tests that only read text. Geonode's residential bandwidth doesn't expire, so a balance bought for release testing isn't lost in quiet months.
Budget tip: If you want a cheap proxy to try this with, Webshare has a free plan with 10 datacenter proxies and 1 GB of bandwidth a month, no card required. Paid lists let you pick proxy count, bandwidth and location. See Webshare for localization testing.
Common geo bugs this testing catches
- A geo-redirect that loops between two regional domains when the browser language and IP disagree.
- Prices shown in the right currency but with the wrong tax treatment, or rounded differently from the price list.
- A consent banner that loads in one EU country but fails silently in another because a script is geo-blocked.
- A payment method that appears at checkout and then fails at the processor for that country.
- An hreflang tag pointing to a page that redirects, so search engines ignore the whole set.
- A promotion banner meant for one market visible in all of them.
Each of these looks fine from the office and is obvious within seconds from a proxy in the affected market.
Who owns geo QA
Geo bugs fall between teams: engineering owns redirect logic, marketing owns regional content, legal owns notices, finance owns prices, SEO owns hreflang. Give one person or team ownership of the checklist and its automation, and make the per-market results visible to everyone else. A shared dashboard of the nightly run turns regional quality into something every team can see and fix.
Residential tip: Rayobyte is worth testing when you need precise targeting: its residential proxies can be pinned to a country, state, city, ZIP code or ASN, with sticky sessions from 1 to 120 minutes. More in Rayobyte geo-targeting.
Related guides
If your team uses Webshare, Webshare for localization testing covers the equivalent setup. For how location targeting works across proxy types and providers, see geo-targeted proxies, and for why residential IPs give the most accurate local view, our residential proxies guide. To keep checking production between releases, Geonode for website monitoring shows how to schedule the same checks.
FAQ
Can I test geo features with a VPN?
For a few manual checks, yes. VPN IPs are often flagged as VPNs by fraud and bot tools, switching locations is slow, and VPNs are awkward to automate. Proxies scale to automated tests across many markets.
Should I use residential proxies to test my own site?
Datacenter proxies are usually enough for your own geo logic. Use residential when third-party services or your own bot protection treat datacenter traffic differently, or when you need city-level accuracy.
How do I test city-level features?
Use city-targeted residential exits, confirm the detected location on the page, and accept results within the right metro area, because city-level IP geolocation varies between databases.
What about mobile apps?
Apps rely on device locale, store region and GPS as well as IP. Combine a proxy on the test device or emulator with the matching device settings and a mocked location.
How do I check hreflang from different countries?
Load each regional page through a proxy in that market, read the link rel="alternate" tags, and confirm every alternate URL returns a 200 and links back. The Playwright example above shows the first step.
How often should geo tests run?
A small smoke set on every release candidate and the full set nightly works for most teams. Rerun the full set after any change to redirects, pricing, consent or CDN rules.
Sources and further reading
Independent references that back up the points above, from standards bodies, governments, universities and non-profits. They open in a new tab.
- Automated Threats to Web Applications (OWASP): OWASP's catalogue of automated threats, including scraping and scalping, as site owners see them.
- Facts and Figures 2024 (International Telecommunication Union): The UN's figures on how many people are online and on mobile networks.
- Number Resources (IANA): How IANA hands IP address blocks to the regional internet registries.
- Network (HTTP proxy) (Playwright documentation): Playwright's official guide to network settings and HTTP proxies.
- RFC 6598: Shared Address Space for Carrier-Grade NAT (IETF / RFC Editor): Explains the shared address space carriers use for CGNAT, the reason many phones share one mobile IP.
Editorial note: Proxy providers change their pools, features and prices often, so treat any figures here as typical ranges at the time of writing and confirm current terms with the provider before you buy.