Quick fixes for common issues
The GeoSwap script isn't loading or doesn't seem to be doing anything. Here's what to check:
The GeoSwap script should be in your page's <head> or just before </body>. Open your browser's developer tools (F12), go to the Elements tab, and search for "geoswap" to confirm it's there.
Check that the data-project attribute matches the Project ID shown in Settings → Install Script. The easiest fix is to copy the snippet from that page again. If the attribute is missing, the script stops and logs [GeoSwap] Missing data-project attribute in the browser console. Installed via Google Tag Manager? GTM's Custom HTML tag strips data-* attributes, so data-project never survives — use the ?p= URL form from the GTM guide instead.
Go to Settings → Install Script and click Verify Now. GeoSwap loads the home page of each site in your workspace and looks for the script with your Project ID. It reads the raw HTML, so a script added through a tag manager like Google Tag Manager won't show up here even when it's working. In that case, check the browser console and Network tab instead.
Open your browser's developer tools (F12) and check the Console tab for messages starting with [GeoSwap]. In the Network tab, check that geoswap.js loads and isn't blocked by a content security policy or an ad blocker.
If your workspace is set to Only listed sites (in Settings → Admin), pages on any other domain get no rules. Add the domain, including staging sites or your myshopify.com address if you use it. A newly added site can take about 5 minutes to start getting rules.
The script is loaded but your rules aren't doing anything. Walk through these checks:
Paused rules won't fire. Check that the status toggle next to the rule is on in the product's list, and that the individual rule or variant you expect is active too.
If you're testing from your own location, make sure your country or region is included in the segment. Your IP might resolve to a different location than you expect, especially if you're on a VPN or corporate network.
Rules can be scoped to specific pages or a page pattern. Make sure the rule applies to the page you're testing on, and that no page exclusion rules it out. See Page Targeting for how each option matches.
Geo redirects skip visitors whose IP is in Bypass IP Addresses or who arrive from a domain in Bypass Referrer Domains. If Only redirect on first visit is on, you're only redirected once. A cookie remembers you for 30 days, so test in a private window.
The script caches its answer in the browser tab for up to 5 minutes, so you may still see the old behavior. Open the page in a new tab or private window, or wait a few minutes.
GeoSwap skips all rules for known bots. If you set your browser's user agent to Googlebot, or use a testing tool that identifies as a crawler, you'll see your original page.
Use the Rule Simulator
The fastest way to check your targeting is Tools → Simulate Rules in your dashboard. Pick a geo redirect, geo link, or content rule, set a country (plus region, city, and device if you like), and it shows which rule or variant matches, or that nothing did. It doesn't check page targeting, so if the simulator matches but your page doesn't, look at the page pattern next.
The rule works in the simulator but never fires on your site. Page targeting is usually the reason. Check these:
/blog/* doesn't mean "everything under /blog/". In a regular expression, * repeats the character before it, so this matches any URL that contains /blog anywhere, including /blogroll. Use ^/blog/ to match only pages under /blog/. Matching ignores upper and lower case.
GeoSwap tests your pattern against the full URL (https://www.example.com/shop?c=1) and against the path, with and without the query string (/shop, /shop?c=1). A match on any of them counts. So ^/shop$ matches the shop page, and example\.com matches every page on that domain.
A pattern must be a valid regular expression of 500 characters or fewer, and the dashboard won't save one that isn't. If a pattern can't be read at the edge anyway, the rule matches no pages at all. It fails closed rather than firing everywhere. Watch for unescaped characters: a bare ? or . has a special meaning, so write \? and \. when you mean the literal character.
When you list specific pages, the domain and path must match exactly. The query string is ignored, but www.example.com and example.com are different, and so are /pricing and /pricing/. Use a pattern if you need both.
The Page Targeting guide has working pattern examples you can copy.
You see the original content for a split second before GeoSwap swaps in the personalized version. This is called a "flash of unstyled content" (FOUC). Here's how to fix it:
Add geoswap-hide to each element GeoSwap swaps. The script keeps those elements hidden until it knows which version to show, then reveals them. Only the elements you tag are hidden. The rest of the page shows as normal.
<div class="geoswap-content geoswap-hide">
Default content for everyone else
</div>If GeoSwap doesn't get an answer within 3 seconds, it shows the hidden elements anyway, so a slow network never leaves a blank space. Put the script tag in your <head> so it starts as early as possible. After the first page, the answer is cached in the tab for a few minutes, so later pages swap faster.
If you added a snippet that sets body { opacity: 0 } from an older version of this page, remove it. GeoSwap doesn't reset body opacity, so that snippet can keep your page hidden.
To check the original site, for example when a redirect keeps sending you somewhere else, go to Settings → Install Script → See your site without GeoSwap and click Copy link. Admins and the owner can do this.
The link adds ?geoswap-override=… to your site's address. Open it within 15 minutes and GeoSwap stays off in that browser until you close it: no redirects, no geo content, and those visits aren't counted. The code in the link works on any of your sites, and only for your workspace.
Open any page with ?geoswap-override=off added to the address, or close the browser.
The visitor keeps bouncing between pages. GeoSwap already stops a redirect that would land on the exact page the visitor is on, so a real loop almost always involves two pages or two sites.
Common cause: overlapping rules
If one rule redirects A → B and another redirects B → A for the same visitors, they loop forever. This often happens when the script runs on two sites and each one has an "all pages" redirect pointing at the other. Check your rules for circular patterns.
If a redirect for German visitors sends them from any page to /de/, the German pages match the rule too. Add ^/de/ as a page exclusion, or target only the pages that should redirect.
In the redirect's advanced settings, add the domains visitors arrive from after a redirect, such as your other regional site. Visitors coming from those domains aren't redirected again.
Wondering if bots are skewing your numbers? They're not.
GeoSwap automatically separates bot and human traffic. Bots are never included in your main analytics metrics.
Open Bot Intelligence in your dashboard for bot-specific data: which bots visited, how often, and what they accessed.
AI crawlers (ChatGPT, Claude, Perplexity) are detected and tracked separately, so you can see how AI systems interact with your site.
Requests from tools like curl, scripts, and headless browsers are counted as bots in analytics, but your geo rules still apply to them, so you can test a geo short link with curl.
You added a custom domain for your geo short links, but GeoSwap says it's not verified yet. Here's what to check:
DNS changes can take up to 48 hours to propagate, though it's usually much faster (5–30 minutes). If you just added the records, give it some time and try verifying again.
Make sure the TXT and CNAME records match exactly what GeoSwap shows in Settings → Custom Domains. Even a small typo or extra space will cause verification to fail.
A root domain like example.com (no subdomain) can't use a standard CNAME record. Use a subdomain like go.example.com, or a DNS provider with CNAME flattening, such as Cloudflare.
Click the "Verify" button again after a few hours. If it still doesn't work after 48 hours, check with your DNS provider to confirm the records are published correctly.
Reach out to our team. We typically respond within a few hours.