Skip to content
Esc
↑↓navigate↵open⌘Jpreview
On this page

Configure dynamic number insertion

Install the website tracking snippet, stock the tracking-number pool, and manage how numbers are handed out to visitors and returned to the pool.

Dynamic number insertion (DNI) answers the question “which marketing actually made the phone ring.” A small tracking snippet on your website replaces the phone number a visitor sees with a number borrowed from a pool you stock, remembers how that visitor found you, and links the call they place back to that visit.

Everything happens on one page: open Settings, then Phone Numbers, then Dynamic Numbers. Each phone system has at most one tracking pool, so confirm the intended phone system in the dashboard header before you change anything.

How a tracked call comes together

  1. A visitor lands on a page carrying the snippet. The snippet reports the page they arrived on, the referring site, and any campaign parameters in the page URL — utm_source, utm_medium, utm_campaign, utm_term, utm_content, and the click identifiers Google, Meta, and Microsoft ads append.
  2. The pool lends that visitor an available number and starts a session holding the marketing details. The number on the page is swapped for the borrowed one. If the pool tracks only matching visits and this visit doesn’t match, nothing is lent and the page keeps its own number — see Choose which visits get a tracking number.
  3. The visitor calls the number they were shown. The call reaches your phone system as usual, and the session is marked converted.
  4. The pool takes the number back after the session ends, holds it out of circulation for the quarantine period, and returns it to the available pile.

The number a visitor was shown is what ties the call back to their visit, which is why a number cannot serve two visitors at once and why quarantine exists — it keeps a caller who dials from a scrap of paper a day later from being attributed to whoever borrowed the number next.

Prerequisites

  • The intended phone system selected in the dashboard header. A pool belongs to one phone system.
  • An active pool. Enabling a call-tracking pool is done by Steer Phones; if the page shows Dynamic Numbers isn’t enabled yet, ask your Steer Phones administrator to enable one. There is no self-serve action here.
  • A role that can manage tracking numbers. Super Admin and Admin can configure the pool and add, release, and remove numbers; Extension User can read the page and copy the snippet but not change anything.
  • Spare phone numbers on this phone system, each with an E911 address assigned, that are not already part of a pool.
  • Someone who can publish a change to your website, and agreement on which pages the snippet goes on.

Install the tracking snippet

The snippet is generated for the phone system you are viewing and carries that system’s fallback number, so copy it from the dashboard rather than reusing one from another shop.

  1. Select Get code snippet.
  2. Copy the snippet with Copy to clipboard.
  3. Add it to your website through your normal deployment or tag-management process, on every page where a phone number should be tracked. A page without the snippet keeps showing whatever number is hard-coded in its markup.
  4. Tag each phone number that should be swapped, as described in the next section. The snippet includes a ready-made example with this phone system’s tag.
  5. Publish the change and load a page in a browser. A tracked page shows a pool number instead of your usual number.

The snippet loads the tracking script from Steer Phones and starts a session on page load. It carries no credentials — only the phone system whose pool to draw from and the fallback number to show if that pool is empty.

Tag the numbers to swap

The script only rewrites elements tagged for this phone system with a data-steer-dni attribute whose value is the phone system’s ID. Untagged numbers are left alone, so a footer number, a different location’s number, or a number you never want tracked stays as written. The snippet’s comment shows the exact tag to use, for example:

<a href="tel:+15551234567" data-steer-dni="your-phone-system-id">(555) 123-4567</a>

How a tagged element is rewritten depends on what it is:

Tagged element What the script does
A link whose target is a tel: number Rewrites the dial target, and the visible text when that text looks like a phone number
An element with a data-phone value Rewrites that value and the visible text
Any other element Replaces its whole visible text

Because an element that is not a link has its whole text replaced, put the tag on the element that holds only the number, not on a sentence or heading that contains it.

North American numbers are written back in (555) 123-4567 form; other numbers keep the form they are stored in. Rewritten elements get a dni-loaded class, which is a convenient hook for anyone verifying the install or styling around it. The snippet also hides tagged numbers briefly while the script loads, so visitors don’t see the old number flash to the new one. If the script cannot load at all, the original number reappears after a few seconds.

Track several locations on one page

Each location with its own phone system can be tracked on the same website, even on the same page. Copy the snippet from each phone system, add all of them to the page, and tag each location’s number with its own phone system’s ID. Each location then shows a tracking number from its own pool and attributes calls to its own phone system. The tracking script loads only once however many snippets the page carries.

What a visitor sees

  • The same visitor keeps the same tracking number across pages and repeat visits while their session is alive, because the browser remembers the session.
  • The session stays alive while the visitor keeps browsing with the tab open, and expires after the session timeout of inactivity — or at the maximum allocation time, whichever comes first.
  • Search-engine crawlers and other automated visitors are given the fallback number and never consume a pool number.
  • If every number is already lent out, a visitor without an active session sees the fallback number. No new visit is recorded, and a call to the fallback number cannot be tied back to a visit.
  • If the pool tracks only matching visits, a visitor whose visit doesn’t match sees the page’s own number. No session is recorded and no pool number is used. A visitor who does match keeps their tracking number on later pages even when those pages have no campaign parameters, and a visitor who already called from a tracking number keeps being tracked so a repeat call is still attributed.

Stock the pool

Under Numbers in Pool, use the picker to add a number, then select Add. The picker offers only this phone system’s numbers that are not already in the pool.

A number must belong to this phone system and have an E911 address before it can join the pool. Size the pool for concurrent visitors rather than total traffic: every visitor browsing at the same time holds a number, and numbers stay out of circulation through quarantine after their session ends. If the pool tracks only matching visits, size it for concurrent matching visitors instead.

Once a number is in the pool it is managed from this page only. On the All Numbers page it carries a DNI badge, and its Configure and Remove actions are disabled with a note that the number is part of a call tracking pool. Remove it from the pool here first if you need to change or release the number itself.

Choose the pool settings

Select Configure to edit the pool. Every field except the destination override can be changed freely.

Setting What it controls
Pool name The label for this pool in the dashboard
Destination override Sends calls to pool numbers wherever this number’s routing sends them
Fallback number The number shown when no pool number is free, or when the visitor is a crawler
Session timeout (min) Inactivity after which a visitor’s session ends and their number is returned (1–1440)
Max allocation (min) Hard cap on how long one session may hold a number, however active it is (1–10080)
Quarantine (min) How long a returned number is held out of circulation before reuse (0–1440)

Two of these deserve care:

  • Destination override. Without it, a call to a pool number follows that number’s own routing. With it, calls to every pool number follow the chosen number’s routing instead — which is usually what you want, so tracking numbers behave exactly like your main line. The dialog offers No override only while none is set; once a destination is saved, this dialog can change it to a different number but cannot clear it — ask your Steer Phones administrator if it has to be removed entirely.
  • Fallback number. It is baked into the snippet at the moment you copy it. If you change the fallback number here, copy the snippet again and republish it, or your website keeps offering the old one when the pool runs dry.

Quarantine of 0 returns numbers to the available pile immediately. That maximizes a small pool’s capacity at the cost of attributing a late callback to the wrong visit.

Choose which visits get a tracking number

By default the pool lends a tracking number to every visitor, so every call from the website can be attributed. You can instead track only the visits you care about — for example, only visitors who arrived from paid ads — and let everyone else see your real number. This needs fewer tracking numbers, at the cost of not attributing calls from the visits you leave untracked.

In Configure, change Which visits get a tracking number from Every visitor to Only matching visits, then choose what counts as a match. A visit matches when it matches the paid traffic preset (the Paid ad traffic checkbox) or any of your rules. Matching mode needs the preset, at least one rule, or both.

Paid traffic preset. A visit counts as paid when its page URL carries a Google Ads click ID (gclid), a Microsoft Ads click ID (msclkid), or a utm_medium of cpc, ppc, paid, paidsearch, paid search, paidsocial, paid social, display, cpm, cpv, or retargeting. Letter case, hyphens, and underscores in the medium don’t matter. Meta’s click ID (fbclid) is not included, because Meta also adds it to links from ordinary, unpaid posts; add a “Meta click ID is present” rule if you want those visits tracked.

Rules. Each rule checks one part of the visit:

Field What it checks
UTM source, medium, campaign, term, content The matching utm_ parameter in the page URL
Google, Microsoft, or Meta click ID Whether the ad platform’s click ID is in the page URL
External referrer The site the visitor came from, never your own site
Page URL The full address of the current page, including its ? parameters

Rules use equals, contains, starts with, or is present, and ignore letter case and extra spaces. A pool can have up to 20 rules.

Browsers usually report only the referring site’s address — for example https://www.google.com/ — without the page or search that sent the visitor, and apps’ built-in browsers often report nothing. Use UTM or click-ID rules for anything more specific than the referring site.

Two things to plan for:

  • Set the fallback number to your main number. For about a day after this setting first reaches your website, some visitors’ browsers still run the previous version of the tracking script, which shows the fallback number to visits that don’t match. When the fallback is your main number, those visitors see exactly what they should.
  • Changing the setting affects new visits only. Visitors who already hold a tracking number keep it until their session ends.

Manage numbers day to day

The Numbers in Pool table lists each number with its status and its lifetime Calls and Allocations counts.

Status Meaning
available Free to be lent to the next visitor
allocated Currently shown to a visitor with an active session
quarantine Recently returned, waiting out the quarantine period before reuse
  • Release appears on an allocated number. It ends that visitor’s session and sends the number to quarantine. Their browser will be given a different number if they are still on the site, so releasing an allocation that is genuinely in use can break the attribution for a call that is about to arrive.
  • Make available appears on a quarantined number and skips the rest of its quarantine.
  • Remove takes the number out of the pool entirely. It is refused while the number has an active session — release it first, or wait for the session to expire.

Numbers move through these states on their own. You only need these controls when something is stuck or you are reclaiming a number for other use.

Read the results

  • If the pool tracks only matching visits, sessions and the counts below cover matching visits only; visits that don’t match leave no record.
  • Pool Stats shows utilization — how many numbers are in use out of the pool total — plus the available and quarantined counts, active sessions, conversions in the last 24 hours, and total conversions. A utilization figure that sits near 100% means visitors are being handed the fallback number; add numbers or shorten the timers.
  • Top Traffic Sources ranks the sources of sessions that turned into a call, so it reads as “which sources produced phone calls,” not “which sources produced visits.” A visit with no campaign parameters and no referring site is counted as Direct / unknown.
  • Recent Sessions & Attributes lists visits with their start time, source, medium, campaign, the number they were shown, status, and conversion time. Filter by active, converted, or expired to answer a specific question. Expired and converted sessions are pruned after about 30 days, so treat this as a recent-activity view; a call’s own attribution stays with the call record.

These panels answer questions about the pool itself. To carry a visit’s marketing source onto the call record — where the call log, its filters, and its exports can use it — see Tag calls with their marketing attribution.

Expected result

A visitor on a tracked page sees a pool number, a call to that number reaches your phone system through your normal routing, and the visit appears under Recent Sessions & Attributes as converted with the marketing details it arrived with. Pool utilization stays below its ceiling during your busiest hours.

Troubleshooting

  • The page says Dynamic Numbers isn’t enabled yet: No active pool exists for this phone system. Ask your Steer Phones administrator to enable one; the dashboard has no create or enable action.
  • You can see the page but not Configure: Changing the pool needs a role that can manage tracking numbers. Copying the snippet does not.
  • Your website still shows your normal number: Confirm the snippet is on that page, that it is the snippet for this phone system, and that the number carries a data-steer-dni attribute set to this phone system’s ID, exactly as in the snippet’s example. Untagged numbers are never swapped, and a number baked into an image cannot be swapped at all.
  • Your number never swaps, but other shops’ numbers do: The pool may track only matching visits. Open Configure and check the preset and rules against the page URL you are testing with — an organic visit with no campaign parameters is expected to keep your own number.
  • One location’s number shows another location’s tracking number: The number is tagged with the wrong phone system’s ID. Each location’s number must carry the ID from that location’s own snippet.
  • Visitors see the fallback number: The pool has nothing free. Check utilization in Pool Stats, add numbers, or shorten the session timeout and quarantine so numbers come back sooner.
  • The fallback number on your site is out of date: The snippet carries the fallback number that was set when it was copied. Copy it again after any fallback change and republish.
  • A number cannot be added: It must belong to this phone system, have an E911 address, and not already be in a pool. The error names which condition failed.
  • A number cannot be removed: It has an active session. Release the allocation or wait for the session to expire, then remove it.
  • Configure and Remove are disabled on the All Numbers page: That number is in the tracking pool. Remove it from the pool on this page first.
  • Sources read Direct / unknown: Those visits arrived with no campaign parameters, no click identifier, and no referring site. Check that your ads and campaign links carry the parameters you expect to report on.
  • The browser console shows SteerDNI: trusted API URL is unavailable: The script could not determine the API origin from its own URL. This happens when the script is loaded without a src ending in /v1/dni.js — for example, if a tag manager inlines it, a bundler wraps it, or it is loaded as a module. Use the snippet exactly as copied from the dashboard, or add apiUrl: 'https://<your-dni-origin>' (the origin only, with no path) to the SteerDNI.init call.