A typical scenario: a Shopify shop sells in 12 countries, each with its own subdomain, translated catalog, local currency and local payment gateway. The team hands out 12 different links to partners and creators — one per country. One partner mixes them up, another puts the Mexican link in a German blog, a third just shares en.shop.com everywhere. As a result, some visitors land in the wrong region, and conversion in those visits is noticeably lower.
The fix is one rule: give partners one link and let the server decide where to send each visitor. That is a geo-redirect. Easy from the outside, with a few traps under the hood: VPN, country-language mismatches, SEO consequences. This piece — how to do it without the pain.
A country-level geo-redirect on a good IP database rarely gets it wrong. The language from the Accept-Language header helps with edge cases. VPN confuses geo — do not force those visitors anywhere, let them pick a country on your site. SEO needs canonical + hreflang, and a search crawler must never be shown something other than what people see. For most teams, a geo-redirect plus a visible “wrong region?” line on the landing page is enough.
How accurate is IP-based country detection?
Commercial IP databases (MaxMind GeoIP2, IP2Location, ipinfo, SypexGeo) paint roughly the same picture:
- Country: errors are rare. Good enough for a commercial redirect.
- Region (state): already noticeably worse. Online stores use it for tax and shipping; for a redirect it is usually overkill.
- City: misses are common, sometimes by tens of kilometres or into the next town. City-level redirects are almost always a bad idea.
Where the country-level errors come from. The main source is mobile networks and providers with infrastructure in several countries: an address can be registered to a Dutch network while the user is physically in Moscow. Such cases are few, but they exist.
Takeaway: country-level redirects are safe. City-level — only with a language fallback.
Language: when IP is not enough
Sometimes the IP says one country but the user speaks a different language. Switzerland has four national languages: the IP says “CH”, and the Accept-Language header tells you which language to greet them in. Real examples:
- a German on a business trip in Italy (IP=IT, Accept-Language=de-DE);
- a Russian speaker in Germany (IP=DE, Accept-Language=ru-RU);
- an English-speaking expat in Japan (IP=JP, Accept-Language=en-US).
The rule we recommend: geo decides currency and payment, language decides the interface. The Swiss user sees Swiss prices and Swiss payment options, but the interface in their own language.
The Accept-Language header is often multi-part:
Accept-Language: de-DE, de;q=0.9, en;q=0.7, *;q=0.5
The user prefers German, then English. Parse it by weight (the q parameter). On your own server that is ten lines of code; in TDS.SO it is the “Language” condition in a rule.
VPN: the traffic that breaks geo
A noticeable share of visitors to commercial sites use a VPN: more on privacy-focused products and media, fewer on marketplaces. These people see geo that is not theirs. What to do:
- Do not block without a reason. The temptation to “cut off VPN traffic” comes up regularly, but real people who just value their privacy go along with the bots. Especially painful on B2B audiences.
- Do not force a redirect to the “detected” country. Instead, show a line at the top of your site: “In the Netherlands? Pick another country”. The person confirms or changes the choice themselves.
- Remember the choice in a cookie for a year. Do not re-trigger the geo-redirect when the cookie already states a preference.
Good IP databases flag VPN addresses (is_proxy, type=hosting). Use that flag as a signal “geo is unreliable, ask the user”, not as a reason to refuse.
A hard geo-redirect with no confirmation line hurts expats and business travellers the most: the user is used to the US version, and from London gets bounced to the UK one — they assume they ended up in the wrong place. A country selector line at the top of the page takes a day to build.
SEO: canonical and hreflang
Search engines are wary of a URL that shows different things to different visitors, and serving search engines different content — showing the crawler something other than what people see — can get a site removed from results. To make regional versions look legitimate, two technical pieces matter:
-
Canonical URL. Each localized version declares itself:
<link rel="canonical" href="https://es.shop.com/promo">. Google understands that the Spanish landing is a real separate page, not a duplicate. -
hreflang. Each version lists all the others:
Googlebot follows the links and understands the relationship. Without it, your regional versions compete with each other in search results.<link rel="alternate" hreflang="es-ES" href="https://es.shop.com/promo"> <link rel="alternate" hreflang="es-MX" href="https://mx.shop.com/promo"> <link rel="alternate" hreflang="en" href="https://en.shop.com/promo"> <link rel="alternate" hreflang="x-default" href="https://en.shop.com/promo">
Googlebot itself is a separate story: it usually arrives from US IPs, and if you redirect it to en.shop.com, it will only index the English version. So search crawlers do not get a geo-redirect: the crawler should see each regional page at its own address — exactly the page people see.
Keep this in mind with TDS.SO: the antibot counts search crawlers as bots, so they go to the default page for non-target traffic, not through your geo rules. That is why a TDS.SO link should not be the address you promote in search. Search results should list the regional pages themselves, with canonical and hreflang; hand the link to partners and use it in ads and newsletters.
When you do not need a geo-redirect at all
Geo-redirect is optional. Cases where it adds noise:
- Single-country shop. If you only sell in the US — extra logic for nothing.
- Content site without localization. Single-language blog, no regional versions. The visitor's browser figures it out.
- B2B SaaS with one global interface. One English landing for the world, one currency (USD), nowhere to redirect to.
- Landing tied to one ad campaign. If the ad network settings already target a specific country, visitors are already arriving from the right region.
What this looks like in TDS.SO
A geo-redirect in TDS.SO is a set of distribution rules on a link or a template: “if country = X, send to address Y”. A visitor who matches no rule goes to the link's main address.
For VPN traffic the rules have a “Proxy / VPN” condition: you can add a separate rule and send those visitors to, say, a country selection page on your own site. TDS.SO does not show a selection page itself — you build it. Whether to block VPN, proxies and Tor outright is a separate filter setting; when it is on, those visits go to the default page for non-target traffic. The stats for every click show the detected country and city, the proxy flag and where the visitor was sent.
Conclusion
Geo-redirect is simple when done right. Three rules:
- Redirect by country, not by city.
- Do not block VPN traffic without a reason or force it anywhere — let people pick a country on your site.
- Do not geo-redirect search crawlers, and tag your pages with canonical + hreflang.
Two or three markets and one currency? Skip the geo-redirect entirely. Twelve countries with local payments? Without one, life gets hard. Especially if you also need to route by device and source — in that case look at a full smart-link, where geo is one of six signals.