Where your real customers are: country geo for shipping and localization
Country-level visitor geography for WordPress — resolved from timezone or optional GeoIP, never from raw stored IPs. The honest accuracy limits, the privacy stance, and what unlocks at the city granularity on the paid tier.

Statnive resolves visitor country via browser timezone (default) or optional GeoIP — never stores raw IPs. Open Ask me! → 「What countries are my visitors from?」 (q72) for the map and table. City granularity unlocks on the v1.2 paid tier. The big 2026 caveat: VPN adoption keeps rising, so trust the country layer and treat the city layer as directional.
If you sell physical goods, you need to know where the orders ship. If you sell digital, you need to know where to translate and which payment methods to add. If you run content, you need to know which markets are growing so you can localize before the competition. All three decisions need the same answer: which countries actually send you traffic, and where is the trend pointing.
The instinct is to open GA4, drill into Demographics, and read the map. That works — if you tolerate the consent banner attrition, the sampling on small countries, and the multi-step click path. This post shows the simpler route, sets honest expectations on accuracy, and locks down what changes when VPN adoption climbs.
What this post answers
- The four country-level questions in Statnive Ask me! — q72, q73, q74, q75 — and what each one decides.
- How Statnive resolves country without storing your visitors’ raw IP addresses.
- The honest accuracy limits: country reliable, city fuzzy, and 2026 makes the city layer worse.
- How GA4 answers the same question, and where its path gets fragile.
- A decision rule for using country data on shipping, localization, and payment-method work.
The four country-level questions, and the decisions each one drives
| Q-ID | Question (verbatim) | Decision it drives |
|---|---|---|
| q72 | What countries are my visitors from? | The map. Which markets exist at all on your site. |
| q73 | Which country sends the most traffic? | The #1 market. Where to localize first. |
| q74 | Is most of my traffic local or international? | The split. Whether you are a domestic site with international tail or an international site with domestic core. |
| q75 | What language are my visitors using? | The translation queue. Whether to add a second-language storefront. |
These four are Live in v1.1.0 free tier. Together they answer the entire country-and-language story without leaving the Geography tab.
The next two — q76 and q77 — are honest “Coming soon” cards:
- q76 — What cities are my visitors from? Unlocks on the v1.2 paid tier.
- q77 — Which city sends the most traffic? Unlocks on the v1.2 paid tier.
City granularity is held back deliberately. The accuracy is meaningfully lower than country (see the next section) and the data is more sensitive in many jurisdictions — both are reasons to ship the responsible-default first and the higher-resolution layer with a paid commitment behind it.
Why country-level geography is honest, and city is not (in 2026)
Three properties of the 2026 internet make the country-vs-city distinction load-bearing:
- VPN adoption is rising. Privacy-conscious users, corporate VPNs, and the iOS native VPN push a meaningful percentage of traffic through an exit IP that is geographically wrong by hundreds or thousands of kilometres. Country-level mostly survives (exit nodes often stay in the user’s country). City-level breaks: a VPN user reading from Berlin appears in Frankfurt, Amsterdam, or Stockholm.
- Mobile and CGNAT IPs share country reliably and city poorly. Carrier IPs route from a central operations centre that can be hundreds of kilometres from the actual handset.
- AI-tool browsing and in-app browsers route through datacentre IPs that resolve to the AI vendor’s region, not where the user is. The country is wrong; the city is more wrong.
What stays accurate at country level: residential ISP traffic, mobile carriers with country-anchored IP blocks, and most enterprise IPs. What degrades at city level: VPN exit nodes, CGNAT carrier traffic, and cloud-IP browsing.
Statnive’s free tier surfaces only country, language, and the local-vs-international split because those are the layers we can defend honestly. The paid v1.2 release adds city — with the same caveat printed on the card.
How Statnive resolves visitor country without storing raw IPs
Statnive uses a layered fallback designed to extract the minimum signal needed for the country decision without persisting the raw IP. The order:
- Browser timezone (default, preferred). The browser sends
Intl.DateTimeFormat().resolvedOptions().timeZone— something likeEurope/BerlinorAmerica/Los_Angeles. Statnive maps the IANA zone to a country. No IP read at all in this path. - Optional GeoIP lookup if the site administrator enables it. The IP is read once at request time, passed through the configured GeoIP library (MaxMind GeoLite2, DB-IP Lite, or a CDN header such as Cloudflare’s
CF-IPCountry), and the country code is stored. The raw IP is never persisted. - Discarded. The salted IP hash that Statnive uses for visitor identification is a one-way SHA-256 with a daily-rotating salt; it cannot be reversed to an IP, and the salt rolls every 24 hours so the same visitor produces a different hash tomorrow.
Three properties hold across all paths:
- Cookieless. No
_ga, no_fbp, no_hjid. Identification is server-side and ephemeral. - No third-party API call. The GeoIP lookup is a local database query against MaxMind’s or DB-IP’s file on your server. There is no outbound HTTP call to a vendor.
- No raw IP in the database. The IP is read in memory, used once, and discarded.
This is what lets Statnive run a Geography tab without a cookie banner and without a Data Processing Agreement for an external geolocation API.
How GA4 answers “what countries are my visitors from?”
The click path is two-and-a-half steps once you know it:
- Reports → Demographics → Demographic details.
- Pick “Country” as the primary dimension. GA4 will offer a world-map overview at the top of the report; the Demographics overview path is one click longer but lands on the same data.
- Optionally cross-tab against Sessions, Engaged sessions, or Conversions by adding a secondary dimension.
The GA4 path works. It also assumes the visitor passed the consent banner, the GA4 tag fired, and the GeoIP lookup behind the scenes (Google’s, on Google’s servers) returned a country. None of those three are guaranteed in 2026 — consent banner attrition alone can drop 30-50% of EU sessions before classification runs.
There is also a separate cost: every Demographics-tab visit ships query data through Google’s analytics pipeline, and the data lives on Google’s servers. For a site that is selling into GDPR-strict markets, that round-trip is non-trivial.
In Statnive: open Ask me! → click 「What countries are my visitors from?」 → done
That is the one-click path. Open the Statnive admin tab, pick q72 from the Geography category, and the AnswerModal renders the map and table.
For the related decisions, three adjacent questions in the same tab:
- q73 — Which country sends the most traffic? Returns the top-N list, sorted by visit count.
- q74 — Is most of my traffic local or international? Returns the share of visits originating from your store’s home country (configurable in admin) versus everywhere else.
- q75 — What language are my visitors using? Returns the
Accept-Languagedistribution, useful when deciding whether to add a second-language storefront.
Each card runs the same SQL the Geography report runs in the dashboard — there is no separate aggregation path. The trade-off is the same as everywhere else in Ask me!: the question text is hard-coded, the answer is your data, the path is one click.
How accurate is GeoIP detection?
Honest numbers, with sources where available:
- Country-level: 95-99% on residential IPs. Commercial GeoIP databases (MaxMind, DB-IP, IP2Location) publish accuracy reports in this range. The error cases are CGNAT carrier routing, VPN exit nodes terminating in a different country than the user, and shared corporate IPs assigned regionally.
- City-level: 60-80% on residential IPs. Drops to 30-50% on mobile and VPN traffic. The database is making a best guess from BGP routing tables; a user in a suburb of Dallas may resolve to “Plano” or “Irving” or “Dallas” depending on the database vendor.
- Postcode / metro: unreliable. Treat as marketing-pitch metadata, not as truth.
The rule of thumb: country answers business decisions (where to ship, where to localize, where to add a payment method); city answers tactical decisions (which city to test-market a campaign in) and needs corroboration from another source.
Statnive ships country in the free tier because country survives the 2026 reality. City lands in v1.2 paid with the explicit caveat printed on the card.
Can I block traffic by country?
Statnive itself does not block traffic. It is a read-only analytics plugin — its job is to tell you the shape of your audience, not to gate it.
Country-level blocking belongs at three layers: CDN / WAF (Cloudflare country rules, AWS WAF geo-match, Sucuri — block before WordPress), plugin level (Wordfence Country Blocking, custom WP filter on init), or web-server level (nginx geo modules, Apache mod_geoip).
Statnive identifies which countries are sending traffic so you can decide where the block belongs. q73 (“Which country sends the most traffic?”) is the input layer for that decision.
Which GeoIP libraries does WordPress use?
No single standard. Common choices: MaxMind GeoLite2 (free, accurate, requires an account; local .mmdb), DB-IP Lite (free, no account, slightly less accurate; local .mmdb), CDN-injected headers (Cloudflare CF-IPCountry, AWS CloudFront — trust the header), and IP2Location (commercial, paid licence).
Statnive defaults to browser timezone (no GeoIP at all) and lets the host enable an optional GeoIP path supporting MaxMind, DB-IP, and CDN headers. Browser timezone is good enough for country-level decisions on most sites.
Decision rule: use country, validate before localizing
The rule, in one sentence: before investing in a localization or a new payment method for a country, confirm with q73 that the country is in your top 5 by visit AND that q74 shows the international tail is structurally growing, not a one-week spike.
How to apply it:
- Open Ask me! → q73 to see the top countries by visit.
- Set the date range to “Last 90 days” — short windows over-react to a single Reddit thread or campaign burst.
- Pick the top 3-5 countries. For each, confirm with q74 that the international share is at least 10% of total traffic; below that, the cost of localizing a checkout flow may exceed the revenue lift.
- Cross-check with q75 to see which languages are actually being requested. If the top country sends 12% of traffic but their
Accept-Languageis already English, you do not need a translated storefront — you need a country-specific payment method. - Re-run the loop monthly. The international tail tends to grow or shrink with content reach, not at random.
The anchor: a country in the top 5 by visit, at 10%+ of international share, sustained over 90 days, with a non-English Accept-Language majority is a strong localization candidate. Anything weaker than that combination is a watch-list candidate.
Coming soon: city and metro
Two adjacent cards are explicit Coming-soon in v1.1.0:
- q76 — What cities are my visitors from? Lands on the v1.2 paid tier. The Coming-soon card in the Geography tab makes this explicit.
- q77 — Which city sends the most traffic? Same — v1.2 paid tier.
The reason for the delay is not technical capacity. It is the accuracy limit explained above: city-level data degrades faster in 2026 than it did in 2024, and we would rather ship it with a paid commitment and the right caveat than ship a free-tier card that misleads.
What to do next
- Install Statnive on WordPress.org if you have not yet. Country resolution via browser timezone works out of the box; no GeoIP setup needed.
- Open Ask me! → q72 “What countries are my visitors from?” Set the date range to “Last 90 days” and read the map.
- Pair with q73 “Which country sends the most traffic?” to see the top-N list ranked.
- Check q74 “Is most of my traffic local or international?” to anchor the local-vs-international split.
- Cross-check q75 “What language are my visitors using?” before queueing a translation.
- Read Which countries are worth localizing for WooCommerce for the full localization decision framework.
- Read Geography data to cut shipping costs for the shipping-cost angle.
- Read Where’s your traffic actually coming from? for the channel-by-country combination.
That is the workflow. Country first, language second, city later — with the privacy default kept intact at every step.
Install Statnive 1.1.0 free from WordPress.org →
Free forever · Self-hosted · No account · 2-minute setup · No AI · No third-party API · Your data never leaves your server.