Geo Personalised Ads and Content at Scale
Introduction: Location Is Not a Segment, It Is a Signal
Most businesses still serve one-size-fits-all content across multiple markets. That is a missed opportunity. When I personalise ads, landing pages and emails based on real-time location, not just language or currency, performance jumps. Buyers react to what feels built for them.
Geo personalisation lets you show different shipping times, urgency, prices and even product relevance based on country, region or even city-level detail. In this article, I explain how I implement that logic using IP detection, postal logic, geo-feeds and campaign automation.
1. Detecting Location from IP or Checkout Context
There are two entry points for location logic: session IP and user-entered location (e.g. postcode or country selector). For real-time logic, I use edge middleware (e.g. Next.js middleware or Cloudflare Workers) to look up the request IP and inject country or region into the user session.
Example (Next.js middleware):
import { NextResponse } from 'next/server';
import geoip from 'geoip-lite';
export function middleware(req) {
const ip = req.headers.get('x-forwarded-for') || req.ip;
const geo = geoip.lookup(ip);
const country = geo?.country || 'GB';
const region = geo?.region || '';
const res = NextResponse.next();
res.cookies.set('country', country);
res.cookies.set('region', region);
return res;
}
This injects location context for later use, on the homepage, in pricing, in content blocks, or in API calls.
2. Dynamically Showing Currency, Delivery Times and Urgency
When a user from Germany visits a product page, I want to show:
- Price in euros
- Delivery message like “Get it by Friday” based on DE warehouse logic
- A microcopy urgency banner: “High demand in Berlin”
That requires shipping and pricing APIs aware of region. I integrate directly with warehouse or ERP stock endpoints, and format delivery estimates based on lookup.
Example (serverless function):
export async function getGeoOffer(country, sku) {
const pricing = await fetch(`/api/pricing/${country}/${sku}`).then(res => res.json());
const delivery = await fetch(`/api/delivery/${country}/${sku}`).then(res => res.json());
return {
currency: pricing.currency,
price: pricing.price,
estimatedDelivery: delivery.date,
urgency: delivery.stock < 5 ? 'Low stock in your area' : ''
};
}
On the frontend, I hydrate product cards and call-to-action copy using this payload.
3. Geo Pricing Logic in Email Campaigns
When running price-sensitive email flows, especially in cross-border ecommerce, I embed geo logic directly in the email template or dynamic feed.
In Klaviyo, I attach a custom property like geo_country
to each profile based on their last known location. Then, I serve dynamic blocks:
{% if person.geo_country == "CH" %}
<p>Your price: CHF 49 (includes import duty)</p>
{% elsif person.geo_country == "DE" %}
<p>Your price: €39 with free shipping</p>
{% else %}
<p>See country pricing at checkout</p>
{% endif %}
This avoids compliance issues (like misrepresenting tax inclusive prices in Switzerland) while increasing conversion rate by removing ambiguity.
4. Category Switching Based on Region
For lifestyle or seasonal products, region defines interest. Surf gear in Oslo performs terribly. Snow gear in Lisbon, worse. I use the country code or region to define category priority.
For a sports brand, I used the following logic:
- If IP or shipping postcode is in the Alps region → prioritise ski equipment
- If IP from Portugal or Canary Islands → prioritise beach and surf
This was done via category weight mapping in a server-side rendering function:
def get_category_priority(country_code):
seasonal = {
'NO': ['ski', 'outdoor', 'thermal'],
'PT': ['surf', 'swim', 'beach'],
'CH': ['ski', 'fitness'],
'FR': ['bike', 'run', 'casual']
}
return seasonal.get(country_code, ['general'])
This dictated both navigation layout and homepage content. CTR on category links increased by over 200 percent vs. static layouts.
Final Thought: Personalised by Place, Not Just Name
Personalisation is not just about first names. It is about geography, climate, currency, urgency and local norms. When I use geo signals properly, every campaign becomes more useful and more profitable.
If your landing pages or emails look the same in Germany and Ireland, you are missing conversions. I help teams implement location-aware automation that adapts pricing, urgency and relevance in real time, and delivers the performance to match.