Proxies for Market Research: Samples That Are Not Just Your Desk
Research from one country is a study of one country labelled global. Each observation is accurate; the sample was drawn from wherever you were sitting.
Loading page content.
A rank tracker without proxies measures what one datacenter IP is shown after a thousand queries. Three problems hide in that, each needing its own fix.
Dana Whitfield
· updated 23 Aug 2026
A rank tracker without proxies does not measure rankings. It measures what one datacenter IP in one location is shown after that IP has queried the same engine a thousand times — which is not what any of your users see.
There are three separate problems hiding in that sentence, and they need different fixes.
Search engines personalise by inferred location well below country level. For local-intent queries the divergence is severe: two US cities can return substantially different result sets for the same keyword, with different local packs and different organic ordering.
That means "our US ranking" is not a number unless you say which US. A tracker that targets the country and lets the pool choose an exit is sampling whichever cities the pool happens to be dense in, and that weighting shifts week to week. The ranking moves and nothing about your site changed.
The fix is to fix the location. Query from the same cities every run, chosen deliberately, and report per city:
for city in chicago dallas losangeles newyork miami; do
curl -x "http://user-country-us-city-$city:[email protected]:8080" \
-s "https://www.example-engine.com/search?q=plumber" \
-o "serp-$city.html"
doneCommodity queries barely diverge between cities. Local-intent queries diverge enormously. Knowing which of your keywords is which tells you where city-level tracking is essential and where it is wasted pool diversity.
Rank tracking is a high-frequency, low-variety workload. A thousand keywords checked daily from one address is a pattern no human produces, and engines respond with interstitials, then with degraded results, then with blocks.
Rotation is the answer, and rank tracking is unusually well suited to it because each query is stateless. There is no cart, no login, nothing to preserve between requests. Rotate on every request and the per-address query rate collapses to near nothing.
That also means you should not use sticky sessions here. A 30-minute session doing 400 keyword checks concentrates exactly the pattern you are trying to avoid. Rotation is the default for a reason; this is the workload it was designed for.
The instinct is to buy the most expensive tier. For rank tracking that is usually wrong.
Rotating datacenter is the right starting point: 240,000 addresses, a 0.28s median response and $1.20 per GB falling to $0.72 above a terabyte. SERP pages are small and there are a lot of them, so response time dominates total runtime and cost per GB dominates the bill.
Rotating residential is the escalation when the engine you are tracking weighs ASN reputation heavily — 13.2M addresses across 195 countries with city and ASN targeting, at $2.65 per GB down to $1.59 at 500 GB.
The honest test takes ten minutes: run 200 keywords through datacenter, measure the challenge rate, and only move up if it is unacceptable. Teams routinely pay residential rates for engines that never checked.
Rotating mobile has one specific use here, which is checking mobile SERPs from an actual carrier network. Mobile and desktop result sets differ, and if mobile is where your traffic is, tracking only desktop rankings measures the wrong thing.
Rank tracking is cheap to run if you fetch correctly. A SERP HTML document is tens of kilobytes; the images, fonts and analytics beacons around it are the rest of the page weight and contain nothing you parse.
If you are collecting with a headless browser, block what you will not read:
await page.route("**/*", lambda route: (
route.abort()
if route.request.resource_type in {"image", "media", "font", "stylesheet"}
else route.continue_()
))Cutting non-essential resource types routinely removes the large majority of bytes. On a 50,000-keyword daily run that is the difference between a bandwidth line worth arguing about and one nobody notices. There is more on this in estimating proxy bandwidth.
Better still, use the plain HTTP response where the engine will give you one. A rank tracker rarely needs JavaScript execution, and skipping the browser removes both the bandwidth and most of the fingerprinting surface.
The failure mode that ruins rank data is silent: a soft block that returns HTTP 200 with a challenge page or an empty result set. If your pipeline counts that as a successful fetch, your rankings quietly become fiction — positions drop, nobody knows why, and the cause is a parser that found no results and recorded none.
Three checks worth wiring in from the start:
Rank data is a time series, and a time series is only meaningful if the measurement stays constant. Change the cities you query, the device profile, or the language header, and the numbers move for reasons that have nothing to do with your site.
Pin all of it explicitly: the city list, the language, the device, and the time of day. Then change one at a time and record when you did. Most unexplained ranking volatility in a tracker is measurement drift rather than movement.
For the full workflow, including the collection side, see SERP tracking.
Research from one country is a study of one country labelled global. Each observation is accurate; the sample was drawn from wherever you were sitting.
Campaigns target a geography, a device and often a carrier, and the verification team sits in none of them. Matching the segment is the whole job.
Retailers do not have a price, they have a price per market and per fulfilment region. Ignore that and you collect one arbitrary sample and call it fact.
Every snippet in this article points at the production gateway. Create an account, take the 50 MB residential trial, and swap in your credentials.
No card required for the trial. Cancel or downgrade at any time.