Sign In
← Back to Docs
Call Tracking · Platform Guide

Call Tracking & Attribution

Tie every inbound phone call back to the Google Ads click that drove it — and push the calls that book to Google as offline conversions — without paying for a separate call-tracking vendor. PPC TNT includes its own dynamic-number-insertion (DNI) tracking with pluggable call sources, and it still plays nicely with CallRail if you already use it.

Two ways to track calls

PPC TNT supports two call-tracking paths. You can use either or both, and both feed the same Dashboard call and revenue columns.

☎️

Built-in Call Tracking (DNI)

PPC TNT's own tracking — set up under Vendors → Call Tracking.
📞

CallRail

Third-party call tracking you already use.

How built-in attribution works

  1. Insert a number. The DNI snippet on your landing page swaps the displayed phone number for one from your tracking pool and remembers the visitor's gclid.
  2. Capture the call. When someone calls that number, your call source reports the call outcome back to PPC TNT.
  3. Match & evaluate. PPC TNT matches the call to the session that held the number, and the pool's rule decides whether it counts as a conversion.
  4. Upload to Google. Qualifying conversions are uploaded to Google Ads keyed by the gclid, so Smart Bidding optimizes toward calls that actually book.

Call sources

A call source is how a call's outcome is reported. Each tracking pool uses one:

⏱️

Duration

The default — no extra integration.

A call counts as a conversion once it runs past a minimum length you set (e.g. 60 seconds), filtering out hang-ups and wrong numbers.

🎧

Five9

Pull dispositioned calls from your contact center.

PPC TNT automatically pulls dispositioned calls from your Five9 reporting engine, so the disposition your agents set (booked, not-a-lead, etc.) decides which calls convert. You give the pool a report folder and name, and the list of dispositions that count as qualified.

A Five9 call converts on disposition or not at all. If you also set a minimum duration, it can only narrow a qualifying disposition — never turn a non-qualifying one into a conversion. See the Five9 integration page for setup detail.

A Five9 pool with no qualifying dispositions uploads nothing — on purpose. There's deliberately no fallback to a duration rule, because a wrong conversion trains Smart Bidding and can't be cleanly withdrawn. Until you tell PPC TNT which dispositions mean "real lead", it fails closed. Every run logs why and the pool editor says the same, so 0 conversions doesn't read as a broken integration. Before going live, use Verify report columns — it runs your Five9 report read-only and shows the real header row, which labels resolved, and sample rows, so a renamed column is caught now instead of after a week of silence.
📄

Manual (CSV)

Upload outcomes yourself.

Upload a CSV of call outcomes when you'd rather curate conversions by hand or import from a system PPC TNT doesn't pull from directly. Uploaded values are stored as manual values — the same field as the value box on the call log — which the CRM matcher never overwrites, so they survive the next sync. On a workspace with no CRM connected they feed Revenue, Sold and Close Rate on the dashboard, and they reach CallRail on the nightly push. Where a CRM is connected, jobs remain the authority and manual values are not added on top, so a lead with both is never counted twice.

The call log: checking a pool is actually working

Each pool has a Call log panel. It's the answer to "is this thing on?", and it's designed so you don't have to open Google Ads or wait for an email to find out.

Two failures that used to look like "no calls yet"

Both are now named inline in the log rather than left for you to infer:

What you seeWhat it means
Every call unmatchedThe numbers being dialled aren't ones this pool handed out. Usually the tracking snippet isn't on the page, or the pool's numbers were never swapped in.
Matched, but no click IDThe call tied back to a session, but that session had no gclid — so auto-tagging is off in Google Ads, or your final URL is dropping the parameter.
gbraid / wbraid insteadShown labelled rather than as a missing gclid. A pool running on these is working — it just can't upload conversions, because those identifiers aren't uploadable.

Emailed backups are a different report

A pool can also mail an attributed-call report for a date range to the recipients configured on that pool — on demand, nothing scheduled. Recipients live on the pool itself and a request can only narrow that list, never extend it, because the export carries phone numbers and campaign data.

The emailed CSV deliberately has fewer columns than the one you download. The download is you pulling your own data; the email goes to whatever addresses the pool has configured. So the backup drops the click IDs and the landing URL even when the underlying row has them. If you need those, use Download CSV from the call log.

Duplicating a pool

A pool is usually one Google Ads campaign, which means most of a new pool repeats the last one — same destination number, session TTL, call source and its config, Google Ads customer and conversion action, backup recipients. Duplicate pool in the pool header prompts for a name, creates the copy, and selects it so you can start adding numbers.

What a copy is, and isn't:

Carried overNot carried over
Destination number, session TTL, call source and its full config (including the Five9 report folder, name and dispositions), Google Ads customer and conversion action IDs, backup recipients, and the webhook secret.Phone numbers. A tracking number belongs to exactly one pool, so a copy has to start empty — the note above the health strip says so, since an otherwise-empty Numbers panel reads as a bug. Sessions and calls also stay with the original as its history.

The name defaults to <name> (copy), with a numeric suffix if that's taken, so a workspace can't end up showing two identically-named pools.

Google Ads conversion sync & bad-lead retraction

Sending qualified calls back to Google Ads as offline conversions is what makes Smart Bidding chase the right leads. PPC TNT keys each conversion to the gclid captured at call time.

Bad-lead retraction: if a call or lead is later marked bad (spam, wrong service, an archived or lost job), PPC TNT can upload a retraction so Google stops optimizing toward lookalikes of junk leads — a negative-feedback loop most setups never close.

The Meta half of this loop lives elsewhere. Qualified calls are also reported to Meta through the Conversions API, which matches on a hashed phone or email and so does not need a click id at all — unlike Google. See the Meta Advertising guide.

How it fits with the rest of PPC TNT

Call tracking is the bridge between clicks and revenue. Once calls are attributed, the rest of the platform builds on them:

FAQ

Do I still need CallRail?

No. The built-in DNI tracking is a complete alternative that avoids a separate vendor bill. CallRail still works if you prefer it — its calls flow into the Dashboard and matched job values are pushed back to CallRail automatically.

What is a call source?

How a call's outcome is reported: Duration (converts past a minimum length), Five9 (auto-pulled from your contact center), or Manual (CSV upload). You pick one per tracking pool.

Why does my Five9 pool report 0 conversions?

Almost always because the pool has no qualifying dispositions listed. A Five9 call converts on disposition or not at all — there's no fallback to a duration rule — so until you name the dispositions that mean "real lead", nothing uploads. Every run logs the reason. If the dispositions are set, run Verify report columns next: a renamed column in your Five9 report will break every run.

Why does my duplicated pool have no numbers?

Because a tracking number belongs to exactly one pool, so a copy has to start empty. Everything else — destination number, session TTL, call source and its config, Google Ads IDs, backup recipients — comes across. Add numbers to the copy and it's live.

Where do I get a CSV of calls with their click IDs?

Download CSV in the pool's Call log, which exports the whole selected date range including the raw click ID per call. The emailed backup is a different, narrower report — it deliberately omits click IDs and landing URLs, because it goes to whatever addresses the pool has configured rather than only to you.

The call log shows calls but no click IDs — what's wrong?

The calls matched to a session, but the session never captured a gclid. That means auto-tagging is switched off in Google Ads, or your final URL is stripping the parameter. If you see gbraid or wbraid instead, the pool is working correctly — those identifiers just can't be uploaded as conversions.

How do calls get pushed to Google Ads?

Qualifying calls are uploaded as offline conversions keyed by the Google click ID captured at call time, so Smart Bidding can optimize toward calls that book. Bad leads can be retracted so Google stops chasing lookalikes of them.

Where do I set this up?

Under Vendors → Call Tracking in the app. Create a pool, choose a call source, add your Google Ads customer and conversion-action IDs, and paste the DNI snippet onto your site.

Ready to try it? Sign In and open Vendors → Call Tracking to create your first tracking pool.