Back to blog

Guide

Search Result Localization Example: What Changes by Market

See a search result localization example, learn what changes across markets, and build a reliable workflow for accurate local SERP data at scale daily.

Search results are the most aggressively localized content on the web, and the degree of variation surprises teams who have not measured it directly. This post works through a concrete example — the same query run across several markets — shows exactly which elements change, and then builds the workflow that produces reliable local SERP data at scale.

The Example: One Query, Four Locations

Take a commercially competitive query in a category with both national and local intent: running shoes. Run it from four locations and compare.

New York, US (en-US): The results page leads with shopping ads carrying USD pricing and US retailer names. Organic results are dominated by US retail domains and US-market editorial content. A local pack appears showing nearby sporting goods stores with addresses, hours, and review counts specific to the metro. "People also ask" entries reflect US phrasing and US-market concerns.

London, UK (en-GB): Shopping units switch to GBP and UK retailers. Organic results shift to .co.uk domains and UK publications. The local pack shows London stores. Notably, several US domains that ranked in position 1–5 for New York drop out entirely or fall well down the page — the search engine is favoring local commercial intent. Spelling in suggested queries shifts to UK conventions.

Munich, Germany (de-DE): The entire page language changes. Results are in German, dominated by German retail and .de domains. The query itself gets interpreted against German-language intent, surfacing German equivalents. Shopping units show EUR with German retailers and German-market shipping information. The local pack shows Munich retailers.

Chicago, US (en-US): Same country and same language as New York, and this is the comparison people underestimate. National organic results are largely similar — but the local pack is entirely different, showing Chicago businesses. Shopping unit retailers shift toward those with Chicago-area inventory or fulfillment. Some localized editorial content differs. The lesson: country-level targeting would have treated New York and Chicago as identical, and for anything involving local intent they are not.

What Actually Varies — Element by Element

Breaking it down by SERP feature, in rough order of how strongly each responds to location:

Local pack / map results. The most location-sensitive element. Varies at metro and often sub-metro level. Entirely different result sets between cities in the same country. Requires city-level proxy accuracy to collect meaningfully.

Shopping and product units. Vary by country for currency, retailer, and availability, and by region for fulfillment-based ranking. Country targeting captures most of the variation; city targeting captures the rest.

Organic rankings. Vary strongly by country, modestly by city. Domain-level preference for local TLDs is pronounced at the country level. Within a country, organic results are more stable across cities except for queries with local intent.

Ads. Vary by whatever granularity the advertiser configured, which can be as fine as postal code. Highly variable and probabilistic — ad presence differs between two loads from the same location.

"People also ask" and related searches. Vary by country and language. Reflect regional phrasing and market-specific concerns.

Featured snippets. Vary by country and language. The source selected for a snippet frequently differs between markets even when the underlying organic results overlap.

Interface language and query interpretation. Driven by the combination of IP country and language headers, not by IP alone — which is why the header bundle matters as much as the proxy.

Why Naive Collection Gets This Wrong

Three failure modes account for most bad local SERP data.

Collecting from one location and assuming it generalizes. A team in Virginia collecting SERPs through a datacenter IP produces results for "a server in Virginia" and labels them as a national baseline. For any query with local or commercial intent, this is not a baseline — it is one unrepresentative sample.

Country targeting for local queries. Using US targeting to collect a local pack returns a local pack, from wherever the IP happened to land. Attributing that to a specific city you care about produces confidently wrong data. This is the single most common error in local SEO data collection.

Mismatched location signals. A German IP with en-US language headers produces a hybrid page that matches no real user's experience. The IP says Germany, the headers say American English, and the search engine resolves that incoherence in a way that reflects neither market cleanly.

The Collection Workflow

Here is the workflow that produces reliable data, in order.

1. Define the location matrix explicitly

List every market at the granularity the data requires. For national rank tracking, countries. For local pack or local-intent queries, specific cities. Do not collect at country level and hope to infer city behavior.

2. Bind the full locale bundle per market

Each market gets a coherent configuration, not just an IP:

MarketProxy targetAccept-LanguageTimezone
New Yorkcity: New York, USen-USAmerica/New_York
Londoncity: London, GBen-GBEurope/London
Munichcity: Munich, DEde-DEEurope/Berlin
Chicagocity: Chicago, USen-USAmerica/Chicago

Set these together. An IP without matching headers produces an incoherent profile.

3. Gate every session on geo-verification

Before issuing the query, confirm the assigned IP geolocates to the intended city. Discard and re-request on failure. This is non-negotiable for city-level work — a session that silently landed in the wrong metro will produce a local pack for the wrong city, and nothing downstream will flag it.

4. Use residential IPs and a real browser

Search engines apply stricter handling to datacenter ranges and to non-browser clients. Local packs and shopping units frequently render through JavaScript. Use residential IPs and full browser automation with an adequate post-load wait, not plain HTTP requests.

5. Keep sessions clean and isolated per market

Clear cookies and storage between markets. Never reuse a session across markets — personalization from the previous market leaks forward. Encode the market into the session identifier so gateway logs stay readable:

user-country-DE-city-Munich-session-serp-run88-de-munich

6. Run conservative request rates

Search engines rate-limit aggressively and are among the least forgiving targets. Keep per-IP request volume low, space requests out, and rotate IPs frequently. SERP collection is rarely urgent enough to justify the block risk of pushing rate.

7. Repeat and timestamp

SERPs shift throughout the day and results are partly personalized and probabilistic. Collect each query-market pair multiple times across different hours, and timestamp every record. A single observation is a snapshot, not a ranking.

8. Validate against ground truth

Periodically have someone in the target market — or a verified independent source — check a sample of queries manually. This catches geo-accuracy drift and parser breakage that automated validation misses.

Structuring the Output

Every record should carry enough context to be interpretable later:

{
  "query": "running shoes",
  "market": "Munich, DE",
  "proxy_city_verified": "Munich",
  "accept_language": "de-DE",
  "timezone": "Europe/Berlin",
  "collected_at": "2026-10-02T09:14:00Z",
  "device": "desktop",
  "organic": [ { "position": 1, "domain": "..." } ],
  "local_pack_present": true,
  "local_pack_entries": 3,
  "shopping_unit_present": true,
  "ads_count": 4
}

Recording the verified city alongside the requested market is what lets you trust the dataset months later. Without it, you cannot distinguish a genuine ranking change from a session that quietly landed in the wrong metro.

Scale Considerations

A realistic local SERP program multiplies quickly: 500 queries × 20 markets × 3 daily collections × 3 repetitions is 90,000 SERP loads per day, each a full browser session with JavaScript rendering. Against a rate-limited target that demands conservative per-IP pacing, the only way to reach that volume in a usable window is wide parallelism across many IPs — many concurrent sessions each running slowly.

That is the opposite of what a concurrency-capped provider supports. Conservative per-IP rates plus a thread cap equals a collection window that stretches past the point where the SERPs you are comparing were captured under the same conditions.

FlameProxies places no cap on concurrent sessions and no request-rate limits, which is what makes gentle-per-IP, wide-parallelism SERP collection practical — you spread load across many residential IPs in the right cities rather than pushing any single IP hard. Combined with city-level targeting across 180+ countries, that supports the geographic precision local SERP data actually requires.