The numbers don't match GA4
AdPix is deliberately aligned with GA4 — the session window, the engaged-session definition, the page-view counting rule. A few things legitimately differ. This page says which, and what to make identical before you file a bug.
First, compare like for like#
Most reported "discrepancies" are not discrepancies — they are two different numbers placed side by side. Make these six identical before anything else:
| What to align | The trap |
|---|---|
| Date range | AdPix defaults to the last 30 days, GA4 to 28. Until you set both by hand, you are reading two different numbers |
| Timezone | AdPix cuts days in the property's timezone. If the GA4 property is set to another zone, every day shifts by hours |
| Metric name | GA4's "Views" includes page views and app screen views; the matching AdPix figure counts page views only |
| Report scope | Traffic acquisition is session-scoped and User acquisition is first-touch. AdPix keeps the same two apart; compare one against the other and you will always see a gap |
| Data freshness | GA4's standard reports are processed with a delay. Comparing "today" compares a complete number against an incomplete one |
| Filters | AdPix drops excluded-IP traffic before it is stored. GA4's internal traffic filter is something you must have configured separately |
For the comparison, pick a full day that is at least two days old — not today, not yesterday. That removes processing delay from the equation, and any gap that survives is a real one.
Where they agree by design#
These are design choices, not coincidences. If one of them disagrees, there probably is a real defect.
| Subject | The shared rule |
|---|---|
| Session window | 30 minutes of inactivity; one number everywhere |
| Engaged session | At least 10 seconds of engagement, or at least two page views, or at least one key event |
| Bounce rate | 100 minus the engagement rate — one number, read from the other side |
| Page view | Only on a real URL change; a replaceState on the same URL counts nothing |
| Hash routing | A hash-fragment change does not produce a page view |
| New user | A visitor whose first_visit event falls inside the window |
| Unattributed traffic | The same (direct)/(none) tuple GA4 writes |
| Realtime window | 30 minutes |
| Order snapshot model | Last non-direct |
Where they legitimately differ#
Event time is server receipt time#
AdPix stamps event time at the moment of receipt. The tracker batches events and queues them when the network is down, so an event the user generated at minute 59 can be recorded in the next minute — and near midnight, on the next day.
That is also why no duration is ever computed from the difference between receipt timestamps. Average engagement time comes from the engagement_time_msec parameter the tracker measures itself, discarding any interval longer than 30 minutes so a forgotten background tab cannot report a fake multi-hour dwell.
Consent is enforced at the source#
With the consent module on, the AdPix tracker gates itself in the browser: without the statistics category nothing is sent and no identifier is persisted.
The important difference is that AdPix does not model the behaviour of users who declined. GA4's consent mode recovers a portion of them through modelling. AdPix does not: someone who declined is not in the report. On a site with a low acceptance rate, this alone can be the largest source of the gap.
Blockers and Tag Gateway#
Both tools lose some traffic to blockers, but not the same amount and not from the same lists. If you have Tag Gateway on, the tag and the beacon are served from your own subdomain and AdPix sees traffic GA4 does not. In that case AdPix being higher is correct, not wrong.
Sampling, thresholds and the "(other)" row#
Three GA4 behaviours that have no AdPix equivalent:
- Sampling. GA4 explorations sample on high-volume properties. AdPix builds every metric over real rows with an exact distinct count.
- Data thresholds. GA4 hides rows that could identify an individual, particularly in demographics. AdPix hides nothing.
- Collapsing into "(other)". GA4 folds high-cardinality dimensions into an aggregate row. AdPix reports do not; the one exception is path exploration, which deliberately — and under your control — folds the tail at each step.
The identity graph#
On the home page and the acquisition reports, "users" is the browser's anonymous ID — exactly like GA4.
But several reports group by resolved identity: the funnel, cohort retention, lifetime value and audiences. There, one person's two browsers — or their browser and their app — become one person. The effect is predictable: fewer users than GA4 and a higher conversion rate. That is more accuracy, not a discrepancy. The full logic is in How AdPix identifies visitors.
Server-side events carry no session#
An order that reaches AdPix straight from your CRM or shop has no browser session, and AdPix deliberately does not invent one. If it did, every order would become a new "session" and would distort conversion rate.
The consequence: these events are fully present in event counts, key events, revenue and user attribution, and absent only from metrics whose unit is the session.
Deduplication by event ID#
The AdPix tracker is at-least-once and retries a failed beacon. So that a retry does not become a duplicate row, every event carries its own ID and duplicates are dropped both at receipt and at counting time. The effect is small — measured at roughly half a percent on production data — but it always moves the AdPix number down.
Bots and filters#
AdPix routes known crawler user agents and command-line tools into quarantine, and drops traffic from the property's excluded IP ranges before anything is stored. GA4 has its own list, and its internal traffic filter is something you configure separately. Two different lists, two different numbers.
Which gaps are normal and which are bugs#
| What you see | Reading |
|---|---|
| A gap of a few percent, stable, in either direction | Normal. The sum of the differences above |
| AdPix consistently higher, with Tag Gateway on | Normal and desirable: traffic GA4 loses |
| AdPix lower, with a low consent acceptance rate | Normal. GA4 models a share of the decliners, AdPix does not |
| A clean multiple — two or three times | A bug. Go to Page views are counted twice |
| Users match but page views do not | Almost always page-view over-counting, not an identity problem |
| Almost everything is "Direct" in AdPix | An attribution bug. Go to Everything says Direct |
| The gap changes from day to day | You have not compared like for like yet; go back to the top of this page |
If it still does not match#
Pick one complete, older day, set both tools to that day and that timezone, and write down four numbers side by side: users, sessions, page views, and the count of one specific key event.
The pattern that emerges is usually the answer itself. If only page views are high, the problem is counting. If everything is low by the same ratio, the problem is collection — go to No data is arriving. If only users are low, you are probably comparing a report that groups by resolved identity.
Frequently asked questions#
How much of a gap with GA4 is normal?
A stable gap of a few percent is normal and comes from the deliberate differences. What is not normal is a clean multiple — two or three times — or a gap that changes day to day. A multiple means over-counting; an erratic gap usually means you have not made the range and timezone identical yet.
Does AdPix sample the way GA4 does?
No. Every metric is computed over real event rows with an exact distinct count — no sampling, no pre-aggregated table, no threshold hiding low-volume rows. If your GA4 report is sampled, the gap is coming from that side.
Why are my sessions lower in AdPix but my event count higher?
Two separate effects. Events you send from your backend have no browser session, so they are absent from session counts while fully present in event counts and revenue. In the other direction, if Tag Gateway is on you capture traffic that blockers withhold from GA4.
Do both tools count "users" the same way?
On the home page and the acquisition reports, yes — the unit is the browser's anonymous ID, exactly like GA4. But the funnel, cohort retention, lifetime value and audiences group by resolved identity, joining one person's several browsers. There, AdPix reports fewer users and a higher conversion rate.
Thanks — your feedback helps us improve the docs.