GoHighLevel Number Pools & Call Tracking Setup (2026) — HL Growth Partner, Dr Priya Jaganathan

GoHighLevel Number Pools & Call Tracking Setup (2026)

August 28, 2026

GoHighLevel Number Pools & Call Tracking Setup (2026)

By Dr Priya Jaganathan, GoHighLevel Certified Admin · HL Growth Partner, Australia · Updated 28 August 2026 · 8 min read

GoHighLevel number pools let you swap the phone number shown on a page depending on where the visitor came from, so a call can be attributed back to a specific campaign, ad group or keyword instead of landing in a bucket marked "phone". A pool is a set of tracking numbers held in the sub-account, and a small piece of JavaScript — dynamic number insertion, or DNI — rewrites the number in the page markup when a visitor arrives. Assign the number to that session, log the call against it, and you have a chain from click to conversation.

The practical question most agencies get wrong is not how to build a pool. It is whether they need one at all. I have set up pools for clients doing 4,000 sessions a week where the maths was obvious, and I have talked clients out of pools when 60 visitors a week meant a single static tracking number would have given the same answer for a tenth of the cost and none of the debugging. This post covers how pools actually behave in GoHighLevel, what LC Phone versus Twilio changes about the cost, how to size a pool without guessing, where the DNI snippet goes on funnels and third-party sites, and how call data flows into workflows and back out to Google Ads and Meta.

How GoHighLevel number pools work under the bonnet

A number pool is a group of phone numbers reserved in a sub-account and pointed at a single destination — usually the business's real line, or a call-routing workflow. When someone lands on a page carrying the DNI script, the script calls back to HighLevel, which checks whether a number is free and, if so, leases one to that visitor for a defined session window. Every subsequent page view in that session shows the same number. If that visitor calls, the inbound call is stamped with the attribution data captured at lease time — source, medium, campaign, and where available the GCLID or fbclid from the landing URL.

Two things follow from this that people underestimate. First, a leased number is unavailable to other visitors for the whole session window, typically 30 minutes but configurable. Concurrency, not traffic volume, is what determines pool size. Second, when the pool is exhausted, the script falls back to the default number on the page. Those calls still connect — nothing breaks — but they arrive with no attribution. A pool that is too small does not fail loudly; it quietly under-reports your best campaigns.

Session windows and the attribution hold

The lease window is a trade-off. A long window (say 60 minutes) catches the person who reads three pages, makes a coffee, then rings. It also ties up numbers. A short window (10–15 minutes) recycles numbers fast but risks a visitor calling a number that has since been reassigned, which silently attributes their call to somebody else's campaign. For most Australian service businesses — trades, clinics, legal — 30 minutes is a sensible default because the call-now behaviour is immediate. For considered purchases where people compare quotes over an afternoon, push it to 45–60 and buy the extra numbers.

What gets recorded against the call

When the call comes in, HighLevel creates or matches a contact, logs the call in Conversations, and writes attribution fields you can reference later. That record is the raw material for everything downstream: workflow triggers, opportunity creation, and offline conversion uploads. If you are still working out the basics of inbound handling, our guide to the GoHighLevel phone system and call tracking covers the routing layer that sits underneath pools.

LC Phone versus Twilio: what changes for pools

Number pools consume two things — a monthly rental per number, and per-minute charges on connected calls. Which telephony provider you are on changes both, and it also changes how much administrative pain a large pool causes.

LC Phone (LeadConnector) is HighLevel's own resold telephony. Numbers are provisioned inside the sub-account, billing runs through the agency wallet, and rebilling to the client is a markup setting rather than a separate invoice. For a pool of twenty numbers, that convenience matters: you are not managing twenty line items in a Twilio subaccount and reconciling them against a client's retainer. The trade-off is less control over number types and, in some regions, slower provisioning of specific area codes.

A direct Twilio connection gives you finer control, direct access to the Twilio console for call logs and debugging, and rates you can verify yourself against Twilio's Australian voice pricing. It also means you carry the reconciliation. For agencies running one or two large pools, Twilio direct is usually cheaper at volume; for agencies running twenty small pools across twenty sub-accounts, LC Phone is usually cheaper in labour. We break the numbers down properly in our comparison of LC Phone vs Twilio cost and setup.

The verification layer nobody budgets for

Australian local numbers require address and identity documentation before provisioning. That is a one-off per bundle, but it is not instant. If you are launching a campaign on the first of the month, order your pool numbers a week earlier. I have watched more than one launch go out with a single fallback number because the bundle was still pending. Check current HighLevel provisioning requirements in the HighLevel help centre before you promise a client a go-live date.

Sizing a pool without guessing

The rule of thumb that actually works: estimate peak concurrent visitors on your tracked pages, then add headroom. Peak concurrency is roughly your busiest-hour sessions multiplied by the session window as a fraction of an hour. A page taking 40 sessions in its busiest hour, with a 30-minute window, has around 20 concurrent leases at peak. Add 30–50 per cent headroom for bursts and you want 26–30 numbers.

Most Australian SMB clients are nowhere near that. A suburban dental practice running $3,000 a month on Google Ads might see 300 landing page sessions a week, clustered on weekday mornings. Peak concurrency is two or three. A pool of six numbers is comfortable; a pool of twenty is money burnt.

Busiest-hour sessionsApprox. peak concurrent leases (30-min window)Recommended pool sizeIndicative monthly number rental (AUD)
Under 101–5Single static tracking number — no pool$3–$5
10–255–136–10 numbers$18–$50
25–5013–2516–24 numbers$48–$120
50–10025–5032–60 numbers$96–$300
100+50+Model per campaign; consider splitting pools by channel$300+

Rentals vary by number type and provider; treat the right-hand column as an order-of-magnitude planning figure and confirm against current GoHighLevel pricing and your own wallet rates. Per-minute charges sit on top and are usually the larger line: at roughly 2–4 cents a minute for inbound local calls, 300 calls averaging four minutes costs $24–$48 a month, which will often exceed a small pool's rental.

When a pool is overkill

If you only need to know "did this lead come from Google Ads or from the letterbox drop", you do not need a pool. Two static tracking numbers — one on the ads landing page, one on the flyer — answer that for under $10 a month with no script, no session logic and nothing to break. Pools earn their keep when you need attribution below the channel level: campaign, ad group, keyword. Ask the client what decision the data will change. If the honest answer is "none", sell them a static number and spend the budget on the offer.

Installing the DNI snippet on funnels and websites

On a HighLevel funnel or website, the tracking script belongs in the funnel or site-level custom code (Settings → Tracking Code, header), not pasted into individual page sections. Site-level placement means every step of the funnel shares the same lease and a visitor moving from landing page to booking page keeps the same number.

Then the number itself has to be findable by the script. The reliable pattern is a class on the element wrapping the number — commonly number-pool or whatever class the pool configuration specifies — applied to both the visible text and the tel: link. Two failures I see constantly: the visible text gets swapped but the tel: href still points at the old number, so mobile taps bypass tracking entirely; and the number is rendered inside an image or an SVG button, where no script can touch it. Numbers must be live text.

Third-party sites: WordPress, Webflow, Shopify

The same script works on external sites. On WordPress, put it in the theme header via a code-snippets plugin rather than editing the theme directly, so a theme update does not wipe it. On Webflow, use Project Settings → Custom Code → Head. On Shopify, theme.liquid before the closing head tag. In every case, verify with the browser console after publishing: load the page with a test UTM string, confirm the number changed, then load it in a private window and confirm you get a different number from the pool. If both windows show the same number, your lease logic is not doing what you think it is.

Preserving the click identifiers

DNI is only half the attribution story. The GCLID and fbclid arriving on the landing URL need to be captured into contact fields at the same time, because those are what let you push conversions back to the ad platforms later. If your forms are stripping query parameters, or your funnel is redirecting and losing them, your call attribution will look fine inside HighLevel and be useless to Google. Our walkthrough of GoHighLevel conversion tracking with GA4 and the Meta Pixel covers the capture side.

Attribution reporting and feeding workflows

Once calls are flowing, the Call Reporting dashboard breaks volume down by source, and the contact record carries the attribution fields. What turns that from a dashboard into revenue is the workflow layer.

The pattern I build for most clients: an inbound call triggers a workflow that checks call duration and status. Answered and over 60 seconds → tag as a qualified call, create an opportunity in the pipeline, notify the owner. Missed or under 20 seconds → fire a text back within seconds and add to a follow-up sequence. The duration threshold matters because a 12-second call is a wrong number, not a lead, and counting it as a conversion teaches Google Ads to chase junk. If you have not built the missed-call path yet, it is the single highest-return automation on this list — see our missed call text back setup.

Pushing call conversions to Google Ads and Meta

A qualified call with a stored GCLID can be uploaded to Google Ads as an offline conversion, which is what lets Smart Bidding optimise toward calls that actually convert rather than clicks. The workflow marks the call qualified, the conversion is uploaded with the GCLID and a conversion time, and Google attributes it back to the originating keyword. Meta works similarly through the Conversions API with the fbclid. This is where number pools stop being a reporting nicety and start changing where the money goes — the mechanics are covered in Google Ads offline conversions in GoHighLevel.

Layering in a voice agent

If after-hours volume is meaningful, pool numbers can route to an AI voice agent rather than voicemail, with the same attribution intact. The agent qualifies, books, and hands the transcript to the workflow. Attribution is unaffected because the leasing happens at page load, well before the call is answered by anything.

Common mistakes to avoid

  • Sizing the pool on monthly traffic instead of peak concurrency — a site with 8,000 monthly sessions all arriving on Tuesday mornings needs a bigger pool than one with 8,000 spread evenly.
  • Swapping the visible number but leaving the tel: link hardcoded, so every mobile tap — the majority of calls — goes untracked.
  • Rendering the phone number inside an image, an icon button or an SVG, which the DNI script cannot rewrite.
  • Counting every inbound call as a conversion, including 10-second hang-ups and wrong numbers, then feeding that noise into Smart Bidding.
  • Building a 20-number pool for a client with three concurrent visitors, and billing them for rentals that answer no question they were asking.
  • Forgetting the fallback number is untracked — if pool exhaustion is common, your reporting understates your best-performing campaign precisely when it is working hardest.

If you want your call tracking and attribution wired up properly in GoHighLevel, book a strategy call with the HL Growth Partner team.

Book Your Strategy Call →

Frequently asked questions

How many numbers do GoHighLevel number pools actually need?

Size on peak concurrent visitors, not monthly totals. Take your busiest-hour sessions on tracked pages, multiply by the session window as a fraction of an hour, then add 30–50 per cent headroom. Most Australian SMB clients land between 6 and 16 numbers. Anything above 30 should be justified with real hourly traffic data rather than a round guess.

Do HighLevel number pools work on WordPress or Webflow sites?

Yes. The DNI script goes in the site's head via a code-snippets plugin on WordPress, Project Settings custom code on Webflow, or theme.liquid on Shopify. The requirement is the same everywhere: the phone number must be live text with the pool class applied to both the visible text and the tel: link, not baked into an image.

What happens when every number in the pool is already leased?

The page shows the default fallback number. The call still connects normally, so nothing breaks for the caller, but it arrives without campaign attribution. This is why exhaustion is dangerous — it happens during your busiest periods, which are usually your best-performing campaigns, so the under-reporting is systematically biased against your winners.

Is LC Phone or Twilio cheaper for running a large pool?

At high call volume on a single sub-account, a direct Twilio connection usually wins on raw per-minute and rental rates. Across many sub-accounts with small pools, LC Phone typically wins once you price your own reconciliation time, because billing and rebilling stay inside HighLevel rather than requiring separate Twilio subaccount management.

Can call data from a pool be sent to Google Ads as a conversion?

Yes, provided the GCLID was captured into a contact field at landing and the call meets your qualification rule. A workflow marks the call qualified, then the offline conversion is uploaded with the GCLID and conversion timestamp. Set a duration threshold — usually 60 seconds — so short hang-ups do not train Smart Bidding on rubbish.

Dr PriyaJaganathan

Dr PriyaJaganathan

Dr Priya Jaganathan is a Go High Level Certified Admin, trusted CRM consultant based in Australia, and a keynote speaker at SaaSpreneur Sydney and Level Up 2025 in Dallas.

Back to Blog