How to verify an ad network's numbers in your own GA4
A vendor dashboard is a claim. Your analytics is a second opinion. Here is the mechanical way to get one, and how to read the gap when the two disagree.
Every ad network shows you a dashboard. The dashboard is produced by the party you are paying, using a counter they control, and there is no version of that arrangement in which you should simply accept the output. This is not a claim about anyone's honesty. It is the basic structure of the transaction.
The good news is that getting a second opinion is mechanical, free, and takes about fifteen minutes to set up.
Step 1: insist on UTM parameters you choose
Before anything runs, give the network the exact landing URL you want used, with your own tracking parameters already attached. Not their tracking - yours. A workable convention:
utm_source=networkname, utm_medium=display, utm_campaign=your-campaign-name, utm_content=placement-or-size
The utm_content slot is the one people skip and the one that pays off. Give every distinct placement its own value - one per site, or one per site-and-size. Without it you can only audit the campaign as a whole; with it you can see which single placement is producing the traffic and which is producing nothing.
If a network will not place links you tagged yourself, that is your answer about the rest of the engagement.
Step 2: read sessions, not clicks
In GA4, open Reports, then Acquisition, then Traffic acquisition, and switch the primary dimension to Session source / medium. Filter to the source you specified. Add Session campaign and Session manual ad content as secondary dimensions to break it down by placement.
What you are looking at is sessions, and sessions will always be lower than the clicks the network reports. That is expected, not suspicious: a click that bounces before the page finishes loading never becomes a session, and blockers and privacy settings stop some GA4 tags outright. A gap of 10-20% between reported clicks and observed sessions is the normal range. Treat it as the baseline against which anything unusual stands out.
Step 3: look at behaviour, which is the part that cannot be faked cheaply
Volume can be manufactured. Behaviour is much harder to manufacture convincingly, and it is where invalid traffic gives itself away. For the traffic from each placement, check:
- Average engagement time. Real visitors from a display ad are not deeply engaged, but a placement where nearly every session sits at zero to two seconds is not sending you people.
- Pages per session. A flat 1.00 across thousands of sessions, with no variance at all, is a machine signature.
- Geography against what you bought. If you paid for Tier-1 and the sessions are somewhere else, you have a concrete, checkable complaint rather than a feeling.
- Hour-of-day distribution. Human traffic follows a daily curve. Traffic that arrives at a perfectly flat rate around the clock is not following a human schedule.
- New versus returning. Display should be overwhelmingly new users. A high returning share on cold prospecting traffic means the same small pool is being recycled.
Step 4: the arithmetic that turns this into a decision
Take the spend on a placement and divide it by the sessions your own analytics recorded. That is your real cost per visitor, and it is the only cost figure in this exercise that is not somebody else's claim. Do it per placement and the media plan usually sorts itself into two or three that are worth renewing and a tail that is not.
Worked example, with made-up numbers: a placement bills $180 for 60,000 measured impressions and 62 reported clicks. GA4 shows 51 sessions, average engagement 24 seconds, 1.4 pages per session, 84% Tier-1. The click-to-session gap is 18% - inside the normal band - and the behaviour looks human. Your real cost is $3.53 per visitor. Now the only question left is whether a visitor is worth $3.53 to you, which is a business question rather than a trust question. That is the whole point of doing this.
When the numbers disagree badly
A gap far outside the normal band is a question, not a verdict. Check the boring explanations first, because they are usually the answer: a redirect that strips query parameters, a landing page that changed mid-flight, a consent banner blocking the tag before it fires, or a timezone mismatch between the two reports. Ask the network which of those applies. A network that engages with the specifics is worth keeping; one that responds by asserting its dashboard is correct has told you what you needed to know.
Disclosure
PraxAds is an ad network and this post teaches you to audit ad networks, including us. That is deliberate. We publish the expected gap in advance and bill on the measured number, which is the smaller one, precisely so that this exercise produces an argument about media rather than an argument about honesty.
Methodology
This is a procedure, not a data post. The UTM parameter names are Google Analytics conventions; the expected discrepancy range is the planning figure PraxAds publishes and bills against, stated on our rate card. Numbers used in the worked example are illustrative and labelled as such.
Sources
- PraxAds rate card - measurement and the 10-20% counting gapas of 2026-07-29