LanderKit

Templates written in French — fully translatable in minutes

IP geolocation on a landing page: personalizing without breaking SEO or spooking visitors

Published on 2 September 2026 · 8 min read

A landing page gets a visitor from Lyon and a visitor from Brussels on the same URL, with the same headline, the same currency, the same Paris-based testimonials. IP geolocation promises to fix that without duplicating the page: roughly detect where the request is coming from and adjust a few elements — the city name in the headline, the currency, a testimonial from the same region. That's a different mechanism from indexable multi-city pages, which create one page per city for local SEO: here, a single URL stays indexed, and only what's shown changes depending on who's looking. The principle is simple; doing it cleanly is less so, between the real accuracy of IP data, the risk of cloaking, and GDPR requirements.

What an IP address actually tells you

An IP address doesn't point to a house: at best it points to the exit point of the ISP or datacenter serving it, which often puts it closer to a metro area than a street. Commercial IP geolocation databases (the one Vercel uses, MaxMind, or similar) give a reliably accurate country, a fairly reliable region, and a rougher city — a visitor roaming on mobile or behind a corporate VPN can show up hundreds of kilometres from their actual location. It's a statistically useful signal for content, never a fact to treat as operationally certain (charging a local tax, guaranteeing a delivery time down to the neighbourhood).

The accuracy people assume it has

Research into IP geolocation is old enough to be instructive here. A study by Wang, Burgener, Flores, Kuzmanovic and Huang (2011), presented at USENIX NSDI, showed that getting anywhere near street-level accuracy required a far more sophisticated network-measurement method than simply looking up an IP-to-city mapping table, bringing the median error down to around 690 metres in the best case — while the simpler, consumer-facing commercial databases stay noticeably less accurate than that for a meaningful share of the IPs tested. In practice: the city shown can be the right one, a neighbouring one, or even the ISP's headquarters. Personalizing a bit of atmosphere copy ("our customers in Lyon recommend us") tolerates that margin of error; personalizing a checkable promise ("showroom 10 minutes from you") doesn't.

A real conversion lever, as long as it stays subtle

Contextual personalization isn't just a technical gimmick: a study by Ziakis, Papadopoulos, Antoniadis and Saprikis (2026), which ranks the factors that weigh most on a landing page's conversion rate, places personalization among the concrete levers — alongside trust and content clarity. For IP geolocation specifically, the uses that genuinely add something stay modest: the city or region name in the headline, currency and price formatting adapted to the country (see our guide on local-currency pricing), or surfacing a testimonial or case study that happens to be geographically close among the ones already on the page. Nothing that fabricates fake content per city — the page stays a single page, only what's highlighted changes.

The over-personalization trap

There's a point where personalization stops reassuring and starts unsettling. A study by Awad and Krishnan (2006), published in MIS Quarterly, documents this personalization paradox: the visitors who care most about transparency over how their data is used are also the ones least willing to be profiled to benefit from it. Displaying "Hi there, visitor from Lyon" in bold across the hero falls straight into that trap — it explicitly signals a form of tracking the visitor never consciously agreed to, for a benefit they don't perceive. The rule that works: personalize quietly (one word in a sentence, a currency that changes without fanfare), never announce it as a technical feat.

The SEO trap: cloaking and inconsistent content for Googlebot

Googlebot crawls the web from US-based IPs, identified as such by geolocation databases. If personalization changes substantial content (not just a city name in a headline, but an entirely different offer, price, or page structure) depending on the detected location, the content the crawler sees can diverge significantly from what most human visitors see — which is exactly the definition of cloaking Google's guidelines penalize, intentional or not. The fix is straightforward: never personalize the page's structure, links, or intent, only micro-elements of text or styling; keep a single canonical URL per page (see our guide on the canonical tag) rather than redirecting to different URLs based on detected country; and check, via Search Console's URL Inspection tool, that the version Google indexes actually resembles what a normal visitor sees.

Implementing it in Next.js on Vercel

On a Vercel deployment, the platform automatically adds geolocation headers to every request (x-vercel-ip-city, x-vercel-ip-country, x-vercel-ip-country-region…), readable from a middleware or server function via the geolocation() helper in the @vercel/functions package:

  • import { geolocation } from "@vercel/functions";
  • In middleware or a server component: const { city, country } = geolocation(request);
  • The value is passed down to the page (via a rewritten header, or directly in a server component that has access to headers()) — never recomputed client-side, to avoid a flash of unpersonalized content on load.
  • A simple lookup object covers the useful cases: { FR: { currency: "€" }, BE: { currency: "€" }, CH: { currency: "CHF" }, default: { currency: "€" } }, on the same principle as the traffic-source personalization already described for the headline.
  • Always keep a sensible default value (the site's main market) for when geolocation fails or returns nothing — which happens, notably locally or behind certain VPNs.

GDPR: a low-risk data point, not one with no obligations

France's CNIL treats city- or region-level IP geolocation as a fairly non-intrusive data point compared to precise GPS geolocation — at that level of granularity it doesn't require the prior consent needed for an advertising tracking cookie or precise device geolocation (see our guide on GDPR and the form). It's still personal-data processing, though, once it's combined with other identifiers (email, browsing history) to build an identifiable individual profile, and should be documented in the site's privacy policy along with its stated purpose. The dangerous move is over-combining: cross-referencing IP geolocation with a third-party advertising identifier to rebuild a precise profile goes well past "contextual display" and falls back under the same obligations as regular tracking.

The most common mistakes

  • Treating the detected city as a certainty — showing it as a checkable promise (delivery time, distance) rather than as text dressing.
  • Personalizing the structure or the offer itself based on detected country, to the point of creating a content divergence that Googlebot can read differently from real visitors — unintentional cloaking territory.
  • Making the personalization too visible ("We detected you're in…") instead of subtle, which triggers the discomfort documented by the personalization paradox rather than the trust it was meant to build.
  • Forgetting the default value for when geolocation fails, which breaks the page for a non-trivial share of traffic (VPNs, aggressive private browsing, server-to-server requests).
  • Spinning up separate URLs per detected country instead of keeping a single canonical page personalized at display time — the same drift as the duplicated per-city page, plus a duplicate-content risk on top.

IP geolocation is a display adjustment, not a mass-personalization engine: useful in small doses — currency, city name in the headline, a local testimonial — on a page that stays a single, indexable page with the same structure for everyone. LanderKit templates are static Next.js pages by default, with no geolocation middleware pre-installed: the room is deliberately left for whoever wants to add it cleanly, with nothing existing to untangle first. Particularly relevant on the single-product e-commerce template (currency, shipping costs) or the local agency template (a geographically close testimonial): €89 per template, €229 for the full pack.

FAQ

Frequently asked questions

Is IP geolocation accurate enough to promise a localized service?

No, not down to the neighbourhood. Consumer-facing IP geolocation databases are reliable at the country level, decent at the region level, and rough at the city level — a roaming visitor or one behind a VPN can show up hundreds of kilometres from their real location. It's fine for a text adjustment (city in the headline, currency), never for a checkable promise like an exact delivery time.

Does personalizing a landing page by visitor IP risk an SEO cloaking penalty?

The risk exists if the content Googlebot sees (crawling from US-based IPs) diverges substantially from what most human visitors see — a different offer, structure, or URL depending on detected country. Sticking to micro-elements (city, currency) on a single canonical URL avoids that trap.

Do you need a GDPR consent banner for city-level IP geolocation?

Not at that level of granularity alone: it's considered a fairly non-intrusive data point, unlike precise GPS device geolocation. It's still personal-data processing once combined with other identifiers to individually profile a visitor, and should be listed in the site's privacy policy.

How do you read a visitor's geolocation in Next.js on Vercel?

Vercel adds geolocation headers to every request (x-vercel-ip-city, x-vercel-ip-country…), readable via the geolocation() helper from the @vercel/functions package inside a middleware or server function — no third-party dependency or self-hosted database needed.

What should you personalize first based on IP geolocation?

Three low-risk, high-effect elements: currency and price formatting, the city or region mentioned in the headline, and the testimonial or case study surfaced among the ones already available if it matches the same geographic area. Avoid flagging it as a feature — the most effective personalization stays quiet.

Read next

Related articles