How do you test an affiliate link from another country?
Request the link from an IP inside that country, follow every redirect by hand, and write down each hop's status code and host, the final URL, and whether your affiliate tag is still on it. Affiliate networks and stores route by the visitor's IP: an Amazon Associates link with a geo-routing layer sends a British visitor to amazon.co.uk and a German one to amazon.de, and a tracking link from a network goes through one or more of its own hosts before it lands. Any of those hops can drop your tag, land on a page without the product, or serve a different offer to a different country.
The IP has to be a consumer one. Datacenter and VPN exits are classified as hosting traffic, and both geo-routers and cloaked offers can treat them differently from a household connection, which is what your commission depends on. This guide uses a residential proxy exit per market, gives you a script that records the chain, and lists what to keep as evidence when a program disputes a sale.
- Geo-routers key on the visitor's country; cloaked offers key on network type. Test from a residential IP in each market you earn in.
- Follow redirects manually so you see every hop, not just the destination. Read headers only and the check moves a few kilobytes.
- Record: each hop's status and host, the final URL, tag presence, cookie set by the store, timestamp, exit reference and country.
- Repeat from a second exit before reporting a broken route; rotations and A/B tests exist on the network side too.
How geo-routed affiliate links work
A geo-routed link has three layers. The first is the short link or tracking link you post, on the network's or your own domain. The second is a router that reads the visitor's IP, looks up the country, and picks a destination: a country-specific storefront, a localized landing page, or a fallback. The third is the store, which may add its own redirect to set a cookie, attach a session, or normalize the URL. Each layer answers with a 301, 302, 307 or 308 and a Location header, and the browser follows them in order.
The affiliate tag rides on the URL as a query parameter (Amazon's tag=, a network's click ID, a UTM set) and sometimes as a cookie the store sets on arrival. A router that rebuilds the destination URL from a template can drop the parameter; a store that redirects to a canonical URL can strip the query; a country fallback can land on the home page of a store where you have no program at all. From the visitor's side the link "worked". From yours, the sale is untracked.
What breaks
- Wrong storefront. The router sends a German visitor to the US store, or to a country where you are not enrolled. The product page loads, the commission goes nowhere.
- Stripped tags. A hop rebuilds the URL and your
tag, click ID or UTM parameters disappear. Compare the query string on the first hop with the query string on the last. - Fallback to a home page. The product does not exist in the local catalogue, so the router lands on the store's home page. Still a redirect chain, still a 200 at the end, no product.
- Cloaked offers. The link serves a compliant page to reviewer and datacenter IPs and a different offer, a forced redirect or a download to consumer IPs in the targeted country. Only a residential exit in that country sees it; the ad cloaking entry has the comparison method.
- Expired or looping chains. A hop returns 404, 410 or 5xx, or two hops redirect to each other. Cap the chain at ten hops and record where it stopped.
- Cookie not set. The final page loads with your tag in the URL, but the store's attribution cookie is missing because a hop switched domains or protocols. Record the Set-Cookie headers on the last hop.
Running the check from several countries
Use a plain HTTP client, not a browser, for the chain itself: follow redirects manually so nothing is hidden, and stop reading after the headers so each hop costs a few kilobytes. Route it through a residential exit in the market. On TrueProxies the country is written on the proxy username (USER-country-de), and GB-based plans also accept a city, region or ASN (USER-country-de-city-berlin); the accepted values are in the connection reference. Preflight the exit first so the record shows which country the check actually came from.
// npm i undici
import { ProxyAgent } from "undici";
const link = process.argv[2];
const agent = new ProxyAgent({
uri: process.env.PROXY_SERVER, // http://YOUR_HOST:8080
token: "Basic " + Buffer.from(`${process.env.PROXY_USER}:${process.env.PROXY_PASS}`).toString("base64"),
});
const UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/153.0.0.0 Safari/537.36";
const exit = await (await fetch("https://httpbin.org/ip", { dispatcher: agent })).json(); // preflight
const hops = [];
let url = link;
for (let i = 0; i < 10; i += 1) {
const res = await fetch(url, { dispatcher: agent, redirect: "manual", headers: { "user-agent": UA } });
const location = res.headers.get("location");
hops.push({ url, status: res.status, host: new URL(url).host, setCookie: res.headers.getSetCookie?.().length ?? 0 });
await res.body?.cancel(); // headers are enough for the chain
if (res.status >= 300 && res.status < 400 && location) { url = new URL(location, url).toString(); continue; }
break;
}
const first = new URL(link).searchParams;
const last = new URL(url).searchParams;
const survived = [...first.keys()].filter((key) => last.get(key) === first.get(key));
console.log(JSON.stringify({ checkedAt: new Date().toISOString(), exit, hops, finalUrl: url, survivedParameters: survived }, null, 2));Run it once per market, from a fresh exit each time (send no session on the username, so each connection rotates), and once more from a second exit before you report anything. If the destination needs JavaScript to redirect (a meta refresh or a script), open the final URL in a browser through the same proxy and record the navigations; the Playwright example in the evidence kit does that and takes the screenshot.
Capturing evidence for affiliate disputes
A program manager can act on a report that shows the chain, not on "the link is broken". For each market, keep: the exit reference and country from the preflight, the timestamp in UTC, every hop with its status code and host, the final URL, the parameters that survived and the ones that did not, the Set-Cookie count on the last hop, and the user agent. Add a screenshot of the final page when the problem is the destination rather than the chain. File it in the batch and observation fields of the evidence kit; the field dictionary already has redirect_chain_json, final_url and http_status.
Keep the sample honest. Two or three checks per market per link, on different days, show a routing problem; a hundred show that you were hammering the network's redirector. Never click through to a purchase from the proxy, and never load the link from a datacenter exit and call the result a consumer's experience. The cost is small either way: a header-only chain check moves a few kilobytes, and even a full landing-page render measured 3.8 MB at the median on 30 September 2026, about $6 per 1,000 on the smallest TrueProxies traffic pack. The cost per check article has the table, and the proxies for ad verification page has the plan choice.
FAQ
Is there a free affiliate link checker by country? Generic redirect checkers follow the chain from their own server, which is a datacenter IP in one country, so they show one route and often not the consumer one. The script above, through a residential exit, shows the route from the market you earn in; the first hour on TrueProxies Residential IPv4 Unlimited is free and covers country-level checks.
How do I test an Amazon affiliate link in another country? Request it through a residential exit in that country, follow the hops, and check that the final URL is on the expected Amazon storefront and still carries your tag parameter. A geo-routing service you added in front of the link is a hop like any other and is the usual place a tag goes missing.
Why does my affiliate link go to the wrong store? A geo-router picked a storefront from the visitor's IP country, and either the mapping is wrong, the product is not in that catalogue, or the visitor's IP geolocated somewhere unexpected. The check records which of the three it was.
Do I need a browser or is a plain HTTP client enough? A plain client is enough for HTTP redirects and costs almost nothing. Use a browser through the same proxy when a hop redirects with JavaScript or a meta refresh, or when you need a screenshot of the destination.