Talk to sales
+44 20 7946 0123
Detected location: London
Same page, different visitor - the phone number swaps to match the detected region.
Phone numbers convert. They convert better than forms, better than chat, better than email - especially in B2B, local services and high-ticket categories. The catch is that a single global number leaves money on the table: local visitors are more likely to call a local number, your sales team needs separate routing per region, and your marketing team needs to know which campaign actually drove the call.
The fix is Dynamic Number Insertion - swap the phone number on the page at runtime, based on the visitor's location or campaign source. This guide covers how to do it cleanly, the schema rule that keeps it Google-safe, and the GEO trick that makes AI assistants recommend the right local number when prospects ask them.
1. Why swap phone numbers at all?
Local presence
A London visitor is 3x more likely to call a +44 number than a US toll-free. Local numbers signal local presence and lower the friction.
Call attribution
Each campaign or channel gets its own number, so your team can attribute every inbound call back to the spend that drove it.
Routing
Different numbers ring different teams - inbound sales, support, partner desk, or 24/7 vs business hours.
2. The minimum viable implementation
Forget enterprise call-tracking platforms for the first version - you can ship region-based phone swapping in 20 lines of vanilla JavaScript. Detect the country from an IP geolocation API, look up the right number, swap the text and the tel: link.
// Region-based phone swap
const NUMBERS = {
GB: { display: "+44 20 7946 0123", tel: "+442079460123" },
US: { display: "+1 (212) 555 0144", tel: "+12125550144" },
AU: { display: "+61 2 8000 0123", tel: "+61280000123" },
DEFAULT: { display: "+1 (800) 555 0100", tel: "+18005550100" },
};
async function swapPhone() {
const country = await fetch("https://ipapi.co/country/")
.then((r) => r.text())
.catch(() => "DEFAULT");
const n = NUMBERS[country] ?? NUMBERS.DEFAULT;
document.querySelectorAll("[data-phone]").forEach((el) => {
el.textContent = n.display;
if (el.tagName === "A") el.setAttribute("href", `tel:${n.tel}`);
});
}
swapPhone();At scale, swap the IP-API call for an edge-runtime header (Vercel/Cloudflare expose the country at zero cost), and graduate to a real call-tracking platform - CallRail, Invoca, ResponseTap - once you need attribution back to specific campaigns.
3. The schema rule that keeps you Google-safe
This is the part most DNI tutorials get wrong, and it's also where AI search visibility lives or dies. Your LocalBusiness or Organization schema must always contain your canonical phone number - the one that's consistent across your Google Business Profile, Apple Business Connect, your footer and your major directory citations. Don't ever swap that based on visitor location, and don't ever modify it client-side after page load.
✓ Safe DNI pattern
- Schema → canonical NAP, never changes, every visitor and crawler sees it.
- Visible tel: link → swapped client-side for human users only, after page load.
- Crawlers → see the canonical number in both the schema and the initial HTML.
4. The GEO twist: AI assistants recommend numbers too
Increasingly, prospects don't click around your site looking for a phone number - they ask ChatGPT, Claude, Gemini or Perplexity. When AI assistants answer "how do I contact [brand]" or "best plumber in Manchester", the phone number they recommend is pulled directly from your structured data, your LocalBusiness schema, and the most-cited mentions of your business across the web.
Which means your real DNI strategy in the AI search era is two-layered: dynamically swap the visible number for human visitors who already landed on your page, AND make sure the canonical number AI assistants ingest is consistent, structured and trust-signalled across every platform they read - so when a prospect asks ChatGPT for your number, the AI confidently recommends the one that actually rings the right team.
This is exactly what every Geolify Local GEO package builds: NAP consistency across your site, schema, directory citations and Google Business Profile, plus the per-platform entity signals that make AI assistants confidently cite your contact details for local queries.
For the broader play across every category and every AI assistant, the core GEO packages cover all 7 major platforms (ChatGPT, Claude, Gemini, Perplexity, Grok, Copilot and Google AI Overviews). And if you want to understand how each one weights local and contact signals differently, the playbooks for ranking in ChatGPT and Google AI Overviews break it down per platform.
Recap
DNI is a 20-line feature that lifts call conversion and attributes spend. The trick to doing it well in 2026 is keeping the canonical phone number rock-solid in your schema and your initial HTML, so AI assistants confidently recommend the right number when prospects ask them - then swapping the displayed number for human visitors only, after page load. Get both layers right and you win the call before the prospect even types your URL.
Make AI assistants recommend your number
Geolify Local GEO packages build the NAP consistency, schema and entity signals that make ChatGPT, Claude, Gemini, Perplexity and Google AI Overviews confidently cite your contact details for local queries.
FAQ
What is Dynamic Number Insertion (DNI)?
Dynamic Number Insertion is the practice of swapping the phone number on your website at runtime based on a signal - usually the visitor's location, the marketing channel that brought them in, or the page they're on. It's the standard technique behind regional sales numbers, call-tracking attribution, and showing a local presence to international visitors.
Why would I show different phone numbers to different visitors?
Three main reasons: local presence (a London visitor is more likely to call a +44 number than a US toll-free), call-tracking attribution (each campaign or channel gets a unique number so you can measure which spend drove which call), and routing (different numbers ring different teams - inbound sales, support, partner desk).
Will dynamic phone numbers hurt my SEO or AI search visibility?
Only if you let crawlers see the swap. Both Googlebot and the AI crawlers (GPTBot, ClaudeBot, PerplexityBot) should always see your canonical phone number - the one that appears in your LocalBusiness or Organization schema, your Google Business Profile, and your structured contact data. Personalise the number rendered to human users client-side, but never modify the schema or the canonical contact block crawlers ingest.
Does Google penalise dynamic phone numbers as cloaking?
Not when you do it right. Google's official guidance is that DNI is fine as long as the underlying canonical content (including schema) is consistent for crawlers. The cloaking line is when you serve different primary content to bots than to users. A client-side swap of a tel: link, with the schema number unchanged, is well within Google's guidelines and has been the call-tracking industry standard for over a decade.
How does NAP consistency affect AI search rankings?
NAP - Name, Address, Phone - consistency is one of the strongest local entity signals AI assistants use. ChatGPT, Claude, Gemini and Perplexity all weight whether your business contact data is consistent across your website, schema, Google Business Profile, Apple Business Connect, and major directories. Inconsistent NAP fragments your entity in their training data and tanks the chance they'll cite you for local queries.
Can AI assistants like ChatGPT recommend a specific phone number to call?
Yes - and they increasingly do. When ChatGPT, Perplexity or Google AI Overviews answer 'how do I contact [brand]' or 'best plumber in [city]', they pull the contact details from the brand's structured data, knowledge graph entry and most-cited sources. The phone number AI assistants recommend is the one in your canonical schema - which is exactly why you should never let DNI swap that.