Geo-Targeted Personalization — Language, Content, and UX
Serve the right copy, the right language, and the right promo — automatically.
A visitor from Berlin sees an English landing page written for Silicon Valley. A visitor from São Paulo sees the wrong currency and a USA-only promotion. Both bounce. Geo-personalization is the simplest conversion lever most marketing sites leave on the floor.
The business problem
Most marketing sites ship one global experience. The visible consequences:
- 40–60% of non-English-native visitors bounce from English-only copy on their first visit.
- “Free shipping” banners intended for the US show up in Japan, where the offer doesn’t apply.
- “Book a demo” in UTC-8 meeting slots for a visitor in UTC+9.
- Hero-image with US stock photography for a visitor whose market looks nothing like it.
IP geolocation gives you the six fields needed to do all of this: country, region, city, language, timezone, currency.
Implementation
Edge-rendered personalization (no client FOUC)
// Next.js 14 — app/layout.tsx with middleware-injected geo
import { headers } from "next/headers";
export default async function RootLayout({ children }) {
const h = headers();
const country = h.get("x-geo-country") || "US";
const lang = h.get("x-geo-lang") || "en";
return (
<html lang={lang}>
<body>
<Banner country={country} />
{children}
</body>
</html>
);
}
Then in middleware.ts:
import { NextResponse } from "next/server";
export async function middleware(req) {
const ip = req.headers.get("x-forwarded-for")?.split(",")[0] ?? req.ip;
const res = await fetch(`https://api.ipgeo.10b.app/v1/lookup/${ip}`, {
headers: { Authorization: `Bearer ${process.env.IPGEO_KEY}` },
// cache 1h on edge
next: { revalidate: 3600 }
});
const geo = await res.json();
const r = NextResponse.next();
r.headers.set("x-geo-country", geo.country_code);
r.headers.set("x-geo-lang", geo.languages?.[0] ?? "en");
r.headers.set("x-geo-timezone", geo.timezone);
return r;
}
What to personalize (ranked by ROI)
| Element | Data field | Lift (typical) |
|---|---|---|
| Currency on pricing | currency |
+15–35% conv |
| Language of hero headline | languages[0] |
+10–25% engagement |
| Time-zone aware CTAs (“Book your 14:00 local demo”) | timezone |
+5–15% conv |
| Localized testimonials / logos (show German logos to DE visitors) | country_code |
+8–12% conv |
| Region-appropriate compliance copy (GDPR vs CCPA banner) | is_eu, subdivision |
Legal |
| Local payment methods (iDEAL for NL, Boleto for BR) | country_code |
+5–20% checkout conv |
| Local promotions (“Free EU shipping”) | is_eu, country_code |
Varies |
Why IP Geo API for this use case
- One call returns language + currency + timezone — three of the top-four personalization fields in a single 40 ms request.
- EU flag for GDPR-specific variants (cookie banner copy, opt-in default state).
- Subdivision / region for country-within-country targeting (California specifically, or Flanders-vs-Wallonia in BE).
- Connection type — don’t serve a 4-MB hero video to a mobile user on a slow cellular connection (
connection_type: "mobile").
Pricing math
Personalization is typically applied once per session. With edge caching:
| Monthly unique sessions | Tier | Cost/mo |
|---|---|---|
| < 30 K | Free | € 0 |
| < 1 M | Starter | € 29 |
| < 10 M | Business | € 99 |
If geo-personalization lifts hero-section CTR by 10% and you already spend € 2K/mo on paid traffic, you’re effectively recovering € 200/mo in otherwise-wasted ad spend for € 29 in API cost.
Honest trade-offs
- Language from IP is a hint, not a truth. Someone in Amsterdam who prefers English will resent being forced into Dutch. Always pair geo-language with:
- Browser
Accept-Languageheader (higher signal) - A user-visible language switcher
- Respect the switcher choice in a cookie/preference after first interaction
- Browser
- Don’t geo-block content — only personalize it. Hiding the pricing page from “the wrong country” is a UX anti-pattern and an SEO foot-gun.
- Watch out for over-personalization. Too many region-specific variants fragment your site, make A/B testing hard, and bloat your CMS. Start with 3 top markets + “rest of world”, expand only with evidence.
Related use cases
- Geo-pricing / currency —
./geo-pricing.md - Visitor analytics —
./visitor-analytics.md
Get started
Free tier: 1 000 lookups / day → /pricing. Sign up at https://ipgeo.10b.app/pricing.
Get early access — 50% off for 12 months
First 100 signups lock in 50% off any paid plan for the first year. No credit card required — we’ll email you at launch.