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
- 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. - 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.
- The visitor calls the number they were shown. The call reaches your phone system as usual, and the session is marked converted.
- 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.
- Select Get code snippet.
- Copy the snippet with Copy to clipboard.
- 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.
- 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.
What the script changes on the page
The script only rewrites markup it recognizes. Make sure the numbers you want swapped are written one of these ways:
| Markup on your page | 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 attribute |
Rewrites the attribute and the visible text |
An element with the phone-number class |
Rewrites the visible text |
North American numbers are written back in (555) 123-4567 form; other numbers keep the form they
are stored in. Swapped elements get a dni-loaded class, which is a convenient hook for anyone
verifying the install or styling around it.
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, the visitor sees the fallback number. The visit is still recorded with its marketing details, but a call to the fallback number cannot be tied back to it.
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.
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.
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
- 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 on the page is written as a
tel:link, an element with adata-phoneattribute, or an element with thephone-numberclass. Anything else — a number baked into an image, for example — cannot be swapped. - 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.