An undersized tracking pool doesn’t fail loudly. It quietly hands a number that’s still tied to one visitor’s session to the next visitor, and when a call comes in, the platform credits it to whichever session held the number last. The dashboard still shows calls. Some of them now belong to the wrong ad.
Call tracking pool sizing is the calculation of how many phone numbers a dynamic number insertion (DNI) setup needs so that every tracked visitor can be shown a unique number for as long as a call from them should still be attributed to their session. Too few numbers and attribution degrades. Too many and you pay monthly for numbers that never ring. The formula is simple; the inputs are where teams go wrong.
Everything below is illustrative. The traffic figures and number costs are invented to show the shape of the trade-off.
What a misattributed call costs
Start with the consequence, because it’s what makes the math worth doing.
Suppose an agency manages paid search spend for a home services client, and phone calls are the main conversion. The client reallocates budget monthly based on cost per call by campaign. If 10% of calls are credited to the wrong campaign, the budget decisions built on that data are wrong in a way nobody can see. Money drifts toward campaigns that look good because they inherited calls from campaigns that actually drove them.
That’s the real cost of an undersized pool: not a failed call, but confident decisions made on polluted data. Oversizing is the opposite error, and it’s cheaper, but it’s still waste. The goal is a pool sized to the traffic, with a buffer you’ve chosen deliberately.
Session-level vs source-level tracking
Before sizing anything, decide which kind of tracking you need, because it changes the answer by orders of magnitude.
Source-level tracking assigns one number per marketing source: one for Google Ads, one for organic, one for a particular email campaign. Every visitor from that source sees the same number. It needs only a handful of numbers, and it tells you which channel drove calls, not which keyword or visit.
Session-level tracking assigns a unique number to each visitor session from a pool, so a call can be tied to the specific session and everything known about it: keyword, landing page, pages viewed. That’s what DNI pools are for, and it’s where sizing matters.
A contrarian point worth stating: many businesses buy session-level tracking when source-level would answer every question they actually ask. If your client reallocates budget by channel, not by keyword, a few source numbers may do the job. Size the pool only once you’re sure you need session detail.
The formula
Each number in the pool is “occupied” from the moment it’s shown to a visitor until the attribution window after their session ends. The pool must cover the peak number of simultaneous occupancies.
A workable formula:
Numbers needed = peak tracked visitors per hour × (average session minutes + hold minutes) ÷ 60 × (1 + buffer)
Where:
- Peak tracked visitors per hour is the busiest hour’s count of visitors who’ll be shown a tracking number, not your daily average.
- Average session minutes is how long a visitor stays on the site.
- Hold minutes is how long after the session ends the number stays assigned to that visitor, so a call a few minutes later is still attributed correctly.
- Buffer covers spikes and variance.
The logic: each number can serve 60 ÷ (session + hold) visitors per hour. Divide peak visitors by that, and add the buffer.
A worked example
Take an illustrative site with:
- 1,200 tracked visitors in its peak hour
- 6-minute average session
- 15-minute hold after the session
- 15% buffer
Each number is occupied for 21 minutes per visitor. So each number serves 60 ÷ 21, or about 2.86 visitors per hour.
1,200 ÷ 2.86 ≈ 420 numbers. Add the 15% buffer: about 483 numbers.
That’s the pool. If you run 300 numbers against this traffic, roughly 120 visitors in the peak hour won’t get a unique number, and depending on your platform, they’ll either see a default number (lost attribution) or a number still held by someone else (wrong attribution).
Hold time dominates the answer
The input most teams set without thinking is the hold time, and it has more effect on pool size than anything else.
Keeping the same 1,200 visitors, 6-minute sessions and 15% buffer, here’s how the hold choice changes the pool:
| Hold after session | Minutes occupied | Numbers before buffer | Numbers with 15% buffer |
|---|---|---|---|
| 5 minutes | 11 | 220 | 253 |
| 15 minutes | 21 | 420 | 483 |
| 30 minutes | 36 | 720 | 828 |
Going from a 5-minute to a 30-minute hold more than triples the pool. So what should the hold be? Look at your own data: for calls that came from tracked sessions, how long after the session ended did the call arrive? If nearly all arrive within ten minutes, a thirty-minute hold is buying you little attribution for a lot of numbers. If a meaningful share arrive later, because visitors research and call after a meeting, a longer hold earns its cost.
The same principle applies to session length. If your average is inflated by a few long sessions, the median may be a better input, with the buffer absorbing the long tail.
Use peak, not average
Pools fail at peak. Sizing to average traffic guarantees misattribution during exactly the hours when the most calls happen.
Find your peak hour from analytics, and check it against campaign calendars. A TV spot, a seasonal promotion or a newsletter send can produce a spike well above your normal peak. Either size for the known spikes or expand the pool ahead of them. Many DNI platforms let you add numbers temporarily; buying them a week before a big campaign is cheap insurance.
For multi-location or multi-client setups, size each pool separately. Pooling across clients saves numbers on paper but mixes attribution across accounts if anything goes wrong, and it complicates billing. If you’re running pools for many tenants, our guide to multi-tenant DID inventory covers how to manage the stock underneath them.
Know what happens when the pool runs out
Every DNI platform has a fallback behavior when no free number is available, and you should know which one yours uses. The common options are to show a default number for the source, which loses session detail but keeps channel-level attribution, or to reuse the least recently used number early, which keeps session detail for some visitors and misattributes others.
The first is safer. Misattribution is worse than missing attribution, because missing data is visible and wrong data isn’t. If your platform reuses numbers early, monitor how often it happens. That count is your best signal that the pool is undersized.
The cost side of the trade
Pool size translates directly into monthly number cost, so it’s worth putting the two side by side.
Illustratively, if numbers cost $0.80 per month each, the three pools above would cost about $202, $386 and $662 per month. For an agency attributing a client’s substantial monthly ad spend, the difference between the 5-minute and 30-minute pools is small relative to the value of accurate data. For a small site, it may not be.
The decision rule: compare the pool cost with the value of the attribution it protects. If the extra numbers from a longer hold catch calls that change budget decisions, they’re worth it. If they don’t, cut the hold and the pool.
Number quality matters as much as quantity
A pool isn’t just a count. The numbers themselves affect results.
Match the local area. A visitor in one city shown a number from another area code is less likely to call. For local businesses, pool numbers should match the market the site serves.
Avoid freshly recycled numbers. A number recently released by a previous owner may still receive calls meant for them, which pollute your data with calls that have nothing to do with your campaigns. Ask your provider how long numbers are aged before reassignment, and watch new numbers for unexpected call patterns in their first weeks.
Route every pool number identically. All numbers in a pool should reach the same destination with the same routing, so the caller’s experience doesn’t depend on which number they happened to see.
Don’t confuse tracking pools with outbound rotation. DNI pools are for inbound attribution. Cycling outbound caller IDs is a different practice with different consequences, which we cover in our piece on number rotation for outbound programs.
Keep the pool right-sized over time
Traffic changes, so pool size should too. Review utilization monthly: peak concurrent assignments against pool size, the count of fallback or early-reuse events, and the distribution of call delay after sessions. Grow the pool if fallbacks rise; shrink it if peak utilization sits well below capacity for several months.
For call tracking platforms serving clients in several countries, sourcing numbers through one provider keeps this manageable. IDT Express provides DID numbers in 140+ countries, which lets a platform build local pools in each market from a single supplier. For number pricing by country, see the DID numbers pricing page, and for the basics of how DIDs work, our guide to DID numbers.
Frequently asked questions
How many phone numbers do I need for dynamic number insertion?
Multiply your peak-hour tracked visitors by the minutes each number stays assigned (average session length plus hold time), divide by 60, and add a buffer, commonly 10 to 20%. The result is the pool size needed to give each visitor a unique number during your busiest hour.
What is a hold time in call tracking?
Hold time is how long a tracking number stays assigned to a visitor after their session ends, so a call made shortly afterward is still attributed to that session. Longer hold times capture later calls but require more numbers.
What happens when a call tracking pool runs out of numbers?
Depending on the platform, visitors are shown a default source number, which loses session-level detail, or a number reused early from another visitor, which can misattribute calls. Showing a default number is the safer fallback.
Is session-level call tracking always better than source-level?
No. Session-level tracking gives detail such as keyword and landing page, but it needs a large number pool. If decisions are made by channel rather than keyword, source-level tracking with a few numbers may be enough.
Why should tracking numbers match the local area code?
Visitors are more likely to call a number that looks local to them. For businesses serving specific markets, using pool numbers from the same area improves call rates and keeps the tracking realistic.
See DID pricing for tracking pools
Sizing pools across several markets? See DID numbers pricing by country to model your monthly number cost.


