Generic Pages Lose to Local Pages
When someone in Phoenix searches for “SEO services near me,” they expect to see Phoenix in the headline, a Phoenix phone number, and references to the Phoenix market. A generic national page cannot compete with that specificity — and Google knows the difference.
But creating a separate page for every city is expensive. Unless you automate it with block bindings.
Two Layers of Personalization
Layer 1: pSEO pages. Each city gets its own URL (/service-area/seo-services-phoenix/) with unique content generated from city-specific meta fields. The headline, body, FAQs, testimonials, and schema markup are all unique to Phoenix. Google indexes each as a distinct page. See how we built 90 of these in one afternoon.
Layer 2: Geo-detection. Even on generic pages, the voyager/geo binding detects the visitor’s city from CloudFlare headers or IP geolocation. A visitor from Dallas sees “Serving businesses in Dallas” on the homepage hero — without any URL parameters or page variants. Same page, personalized experience.
How the Geo Data Flows
The binding checks three sources in order, using the fastest available:
- CloudFlare headers (
CF-IPCity,CF-IPRegion,CF-IPCountry) — zero added latency if the site is behind Cloudflare. Most Voyager client sites are. - IP geolocation API (ip-api.com) — 3-second timeout, used as fallback. Free tier is sufficient for most sites.
- Graceful fallback — if both fail, generic text renders (“Serving businesses nationwide”). The visitor never sees an error.
Results are cached for 24 hours per visitor IP. The IP is stored as an MD5 hash — the raw IP address is never saved in WordPress. Privacy by design.
The 6 Geo Keys
city → "Phoenix" (visitor's detected city)
region → "Arizona" (state/province)
country → "US" (ISO 2-letter code)
greeting → "Serving businesses in Phoenix" (pre-formatted)
local_cta → "Get your free Phoenix site audit" (pre-formatted)
phone → "(602) 555-1234" (regional routing)
The greeting and local_cta keys are pre-formatted strings that include the city name — drop them into any block binding and the personalization is automatic. No string concatenation, no template logic.
Regional Phone Routing
The phone key supports regional routing. Set a WordPress option like voyager_geo_phone_tx for a Texas-specific number, voyager_geo_phone_az for Arizona, and so on. If no regional number is set, it falls back to the default site phone.
This means a visitor from Texas sees a Texas area code. Arizona sees an Arizona number. The same page, the same pattern, different phone numbers based on where the visitor is. Local phone numbers convert 2-3x better than national toll-free numbers in local service businesses.
Privacy and Performance
Privacy: Raw IP addresses are never stored. Cache keys use a one-way MD5 hash. There is no visitor tracking, no cookie for geo (it uses server-side detection), and no personally identifiable information retained. The geo binding is GDPR-compatible by design.
Performance: CloudFlare header detection adds literally zero latency — the data is already in the request headers. The IP API fallback has a 3-second timeout with 1-hour error caching to prevent retry storms. On warm cache (24-hour TTL), geo resolution is a single transient lookup — microseconds.
The Business Impact
- Higher relevance: Visitors see their city name immediately. Bounce rate drops because the page feels made for them.
- Better conversions: Local phone numbers + city-specific CTAs convert 2-3x better than generic alternatives.
- SEO coverage: 90+ indexed city pages mean 90+ opportunities to rank for “[service] in [city]” keywords.
- Zero maintenance: Add a new city by creating one Service Area post. The pattern, CTA, phone routing, and personalization handle themselves.
Key Takeaways
- Two layers beat one. pSEO pages for search engines + geo-detection for generic pages = complete local coverage.
- CloudFlare integration is the performance key. Zero-latency geo data from request headers.
- Privacy is built in. MD5-hashed IPs, no cookies, no PII storage.
- Regional phone routing is a conversion multiplier that most agencies overlook.
See geo-personalization in action on the block bindings showcase.
Find out how many cities you should be targeting. Free audit.
Leave a Reply