Features

How dynamic number insertion works

The technical explanation of LeadJourney's call tracking – how a visitor gets their own number, what the script actually changes on your page, how many numbers a pool needs, and what it means for your NAP consistency and SEO.

Dynamic number insertion (DNI) is what lets a phone call be attributed to the ad that produced it. Each visitor is shown a different phone number from a small pool, so when that number rings, LeadJourney knows exactly which session – and therefore which campaign, ad and keyword – is on the other end.

In short

Buy a handful of numbers, group them into a pool, and tell the pool which number on your site to replace. The tracking script then hands each visitor their own number for the length of their session, and the call is forwarded to your real line.

How a visitor gets their own number

Visitor arrives
Script identifies the session and its source — campaign, ad, keyword.
Number swapped
A free number from the pool is assigned to this visitor only.
They call
The call forwards to your real line. The caller notices nothing.
Call attributed
It lands in LeadJourney against that exact session and its ad.
The number a visitor sees is tied to their session, which is what makes the call attributable.

The visitor lands on your site

The tracking script identifies the session and its traffic source – campaign, ad, keyword, referrer.

Your number gets swapped

The script asks LeadJourney for a free number from the pool and replaces the numbers you configured. The assignment is tied to that visitor's click ID, and it's stored in their browser, so it survives a page change.

The visitor calls

The call is forwarded to your real number. Because LeadJourney knows who saw which number, the call attributes back to that exact session.

Everything lands in LeadJourney

The call appears in the Calls overview with its recording, transcript, AI summary and the full customer journey.

What the script actually changes on your page

This is the part worth understanding precisely, because it decides whether your displayed number changes at all. The script touches three things, and each behaves differently:

Always swapped

The link target of every tel: link, and any element you mark with data-lj-phone or .lj-phone.

Only when you ask for it

Visible text — rewritten only when the text is itself a phone number, or when you list that number as a swap target.

You decide which of these applies — that is what makes a background-only setup possible.
WhatWhat happens
tel: linksThe href is always swapped to the pool number. The link's visible text is only replaced if that text looks like a phone number – at least seven digits and nothing but digits, spaces, brackets, +, - and .
Text on the pageOnly replaced if you've configured the number as a swap target in the pool. The script then searches the page text for it, including the display variants you list.
Elements you markAnything matching [data-lj-phone] or .lj-phone always has its text replaced, and its href too if it's a link.

New content added to the page later – a sticky header, a modal, a lazy-loaded block – is handled as it appears.

Can the displayed number stay the same?

Yes. If your call-to-action is a link whose text is not a phone number – "Call us now", a button, a phone icon – then only the href changes and the visitor sees exactly what you designed. Nothing on the page is rewritten unless the text itself is a number, you configured it as a swap target, or you marked the element with data-lj-phone.

So you can run call tracking entirely in the background on a click-to-call button, and leave every printed number on the page untouched.

Nothing is touched when DNI is off

Dynamic number insertion is a switch under Call Tracking → Setup. With it off, your site is never modified – you can still buy numbers, forward calls and see the call log. The switch alone isn't enough either: the pool also needs a live number to swap in.

NAP consistency and SEO

The usual worry: local SEO rewards a consistent Name, Address, Phone across your site, your Google Business Profile and your citations. A number that changes per visitor looks like it breaks that.

In practice it doesn't have to, because you control exactly what gets replaced:

  • Keep your NAP number as text in the footer, on the contact page and in your structured data, and don't add it as a swap target. The script won't touch it – it only rewrites page text for numbers you explicitly configure.
  • Swap the call-to-action instead. Put the tracking number behind the button or the tel: link people actually tap, while the printed NAP number stays as it is.
  • Structured data is never modified. The script works on rendered text and href attributes, not on your JSON-LD, so the phone number a search engine reads from your markup stays the one you published.

If you do want the displayed number swapped

Some teams deliberately swap the visible number because it gives cleaner attribution for people who read the number and dial it on another device. That's a legitimate trade-off – just keep your primary NAP number consistent in your Google Business Profile, your structured data and your citations, and treat the swapped number as an additional line rather than a replacement.

Pools: one per website

A pool is a group of numbers that serves one website. It carries the website URL, the numbers in it, and the swap targets – the numbers displayed on that site that should be replaced, including their display variants for sites that write the same number inconsistently (+49 30 1234567, 030 1234567, 0049301234567).

How many numbers does a pool need?

Each visitor holds a number for their whole session plus ten minutes afterwards, so the pool has to cover your peak number of simultaneous visitors – not your monthly total.

Monthly website visitorsRecommended pool size
up to 5,0004 numbers
5,000 – 15,0006 numbers
15,000 – 40,0008 numbers
40,000 – 100,00012 numbers
100,000 – 250,00016 numbers
more than 250,00025 numbers

Four numbers is the minimum. With fewer, visitors start sharing a number and a call can be attributed to the wrong session. When the pool is exhausted, LeadJourney returns a shared number and the script leaves your page alone rather than showing a number it can't attribute.

Setting it up

The Call Tracking → Setup screen walks through it in seven sections:

  1. Tracking script – the same snippet as the rest of LeadJourney. If it's already installed for form tracking, you're done; call tracking and DNI run through it.
  2. How every visitor gets their own number – the explainer above.
  3. Pools & numbers to replace – create a pool per website and list the numbers to swap.
  4. Verify installation – enter a page URL and LeadJourney checks that the script is live and numbers are actually being swapped.
  5. Lead creation – whether a tracked call automatically becomes a lead. New callers become leads with the call's full attribution; repeat callers attach to their existing lead. With it off, you link calls to leads by hand.
  6. Call recording – record answered calls for playback, transcript and AI summary, with an optional announcement before the call connects.
  7. Email notifications – who gets told when a number needs documents, when a regulator rejects them, or when forwarding minutes run low.

Buying numbers takes paperwork in some countries

Many European countries require a registered subscriber with a verified local address before a number goes live, and some want a proof document such as a utility bill or business registration. Germany and Austria require all three. Plan a few days for this rather than expecting numbers to be live immediately.

Common questions