3 October 2026 · 9 min read

Ad Revenue in GA4: Where AdSense and Ad Manager Numbers Land

You link AdSense to a GA4 property, wait a day, open the publisher report, and the revenue figure is not the one in your AdSense dashboard. It is close on some days, short on others, and it never reconciles cleanly. The instinct is to assume something is broken. Most of the time nothing is. GA4 and AdSense answer two different questions, and the join between them has rules that are documented, specific, and easy to miss.

This matters more than it used to. Once the link is live, publisher revenue stops being a number that sits in another tool. It feeds GA4's total revenue, it appears in explorations, and it travels into anything downstream that reads those figures. Know what the number is made of and the report is genuinely useful. Do not, and you will spend an afternoon chasing a gap that is arithmetic rather than a bug.

What the link turns on

Linking AdSense to an Analytics property is a two-sided permission job. You need Admin access in AdSense and the Editor role in Analytics, and the web property has to collect data through the Google tag. Once the link exists it is listed in Admin, under Product links, as Google AdSense Links. The Ad Manager equivalent sits in the same section.

The integration then collects three events automatically. ad_impression fires when an ad is shown, ad_click when one is clicked, and ad_query carries the identifier that lets Google join the two data sets. GA4 and AdSense tags compare a query_id generated on the page, so an impression and its analytics event are matched by the same ID. The join itself runs against AdSense log files rather than inside the tag, and it uses the configuration that was in place when each event fired. That detail explains a common surprise: changing your tag setup or a page dimension later will not rewrite the past.

Ad Manager has the same shape with a heavier set of conditions. You need to be an Administrator in Ad Manager plus Editor in Analytics, the site has to run the Google tag, the majority of your ad tags need to be Google Publisher Tags, and app reporting needs the Ad Manager GMA SDK inside the app. Ad Manager brings the same ad_impression and ad_click events on web and adds ad_query, ad_exposure and adunit_exposure on apps. Each event carries its own query_id and ad_event_id.

One structural limit is worth knowing before you build analysis on top of it. Ad Manager tags served inside an iframe cannot share IDs with the page, so the join fails, and passback tags are normally rendered in an iframe. That inventory does not reach GA4 at all. If a slice of your ad serving works that way, the publisher report will be short by exactly that slice and no tagging work will close it.

There is a billing note for 360 properties as well. Because Analytics collects these events for every ad on every page, the billable event count rises once the link is live.

Where the data lands

Revenue and engagement from either integration appear in the Publisher ads report, which is a pre-made detailed report rather than something you have to build. Google's own integration pages place it in slightly different parts of the navigation, under Monetization in one and Advertising then Publishing in the other, so use the search box in the left nav if it is not where you expect it.

Four dimensions come populated: Ad format, Ad source, Ad unit, and Page path and screen class. Four metrics arrive with them: Ad unit exposure, which is the time an ad unit was shown in milliseconds, Publisher ad clicks, Publisher ad impressions, and Total ad revenue. Everything except page path depends on the integration. If your ads are served by a platform other than AdMob or Ad Manager, the dimensions stay empty unless you send the ad_impression event yourself with the values attached.

Page path is the dimension that earns its keep, because it is the one that pins revenue to the content that produced it. That turns a vague question into a specific one: which pages pay for themselves, and which pull traffic that never sees a paying ad. The report is also available inside Explorations, where ad revenue can sit next to sessions, engagement and channel, and that is where the useful comparisons live.

The revenue figure is fixed when the event fires

Total ad revenue is defined as the sum of the advertising revenue for a user. The interesting part is where that figure comes from. For Ad Manager, GA4 calculates revenue using the Rate field value that was present at the moment the ad event was registered. Change that value in Ad Manager afterwards and GA4 will not move, because it is joining against what happened rather than rereading the current state of the account.

That is the right design for a behaviour join and the wrong shape for a finance figure. Your ad platform stays the commercial record. It applies its own adjustments, handles invalid traffic, and produces the number you invoice against. GA4 produces a behaviour-linked estimate anchored to the moment of the impression. Read the two as different instruments and the gap stops being a mystery.

Ad revenue does not sit off to the side

The part that catches people out is that publisher revenue is not isolated. GA4 defines total revenue as purchases plus in-app purchases plus subscriptions plus total ad revenue, minus refunds. Ad revenue also feeds return on non-Google ad spend, which divides non-Google spend into that same combined figure.

So on a site that runs advertising alongside ecommerce, or a publication with subscriptions, total revenue is a blended number. It is not wrong, but it is not the figure your commerce manager expects either. If you report total revenue to anyone, say out loud what is inside it. The safer habit is to read purchase revenue and total ad revenue as separate lines and leave the combined figure to top-level summaries where nobody reads it as sales.

Why the two dashboards never agree

Google documents the causes of AdSense and Analytics discrepancies, and the list is short enough to work through in order.

Work down that list before you touch anything else. In practice most gaps come down to timezone, blocking, or a tag setup that skips the config command on part of the site.

The consent layer

The link changes nothing about your consent obligations, but it does make the measurement gap visible. The ICO's guidance on storage and access technologies, finalised in April 2026, treats advertising as its own consent category, and ad personalisation is gated on that consent. Where a visitor withholds it, the ads that serve are less targeted and the revenue profile changes. Where a blocker or a hard refusal stops the impression from firing, GA4 records nothing and the page simply looks unproductive.

Do not read a low-revenue page as a content problem before checking whether the ad slot rendered for the people you care about. The publisher report measures what fired, not what could have.

What to actually look at

Three views repay the setup cost.

Revenue by page path, first. Sort it and read the top and the bottom. A page with heavy traffic and almost no revenue is either a placement problem or a page whose visitors are the ones blocking ads, and those are different jobs.

Revenue by ad source and ad format, second. When a partner network's share moves, the publisher report shows it on the same timeline as your traffic, which is usually enough to place the cause.

Revenue per session against channel, third. Ad revenue is exposed in Explorations, so build a free-form report with channel as the row and total ad revenue alongside sessions. A channel that brings volume at a low rate per session is doing a different job from one that brings fewer, more engaged readers, and the blended RPM in your ad platform will not tell you which one you have.

One habit sits above all of them. Reconcile the two tools by cause, not by total. When the figures differ, name the reason from the list above, write it down, and move on. That is faster than trying to force an analytics join to behave like a payment statement.

Does Your Ad Revenue Report Hold Up?

North Digital checks publisher integrations end to end: the link, the events, the joining rules and the consent layer underneath. You get the gaps named with their cause, a clean set of reports, and a short list of what to fix first.

Book a Measurement Review