The GA4 AdSense link picker says No results found
The GA4 AdSense link picker shows "No results found" when the Google account you are signed in with does not administer the AdSense account. Linking needs edit rights on the Analytics property and admin access on AdSense from the same login. Add one account to the other, then retry.
A link picker that could not find our own account
We opened Admin, Product links, Google AdSense links on a property we held edit rights to, clicked to create the link, and the publisher picker came back saying No results found. No error, no explanation, and an AdSense account that plainly existed. The account simply sat under a different Google login. Confirming which login owned the pub-XXXXXXXXXXXXXXXX publisher took about fifteen seconds once we knew to vary the u/0 index in the AdSense URL, but the empty list itself had already cost an afternoon.
Signing in as the owning account and going straight to the link screen finished the job without changing anything permanent. Revenue figures then took time to appear rather than appearing at once, and allowing up to 24 hours before treating the link as failed is the difference between waiting and re-doing the whole thing.
In Google Analytics you go to Admin, Product links, Google AdSense links, and click to create a link. The publisher picker opens and says No results found. You definitely have an AdSense account. There is no error and no explanation.
The requirement nobody states plainly
Creating this link needs two permissions held by the same signed in Google account:
- Edit rights on the Analytics property
- Administrator access on the AdSense publisher
The picker lists only publishers the current account administers. If your AdSense account belongs to a different Google login than the one you are using in Analytics, the list is legitimately empty. The interface does not say so, which is what makes this cost an afternoon.
Find out which account actually owns AdSense
This takes about fifteen seconds. Sign in as any account and go to your AdSense URL. If that account lacks access, the denial page helpfully lists the other accounts on the browser that do have it:
https://adsense.google.com/adsense/u/0/pub-XXXXXXXXXXXXXXXX/home
Vary the u/0 index to check each profile. The account that loads the dashboard is your AdSense owner.
The fix, in order of preference
Sign in as the owning account. If that account already has access to the Analytics property, this is the whole fix and it changes nothing permanent. Go directly to the link screen as that user:
https://analytics.google.com/analytics/web/?authuser=1#/aACCOUNTpPROPERTY/admin/integrations/google-adsense/new
Only if that is not possible, add your preferred account as an AdSense administrator under Account, Access and authorization. Do not reach for this first. Adding an administrator to a revenue account is a permanent change to who controls your payments, made to solve a temporary inconvenience.
Search Console linking fails the same way
The neighbouring Search Console link has the same shape of requirement: you must be a verified owner of the Search Console property, from the same account. An empty list there means the same thing, and the same account check applies.
Write down which account owns what
Analytics, AdSense and Search Console can each sit under a different Google account, and nothing in any of their interfaces tells you when they do. Once you have worked it out, record it somewhere durable. It is the single most useful line of documentation for a small site network, and reconstructing it takes far longer than writing it down.
The three IDs, and which one anything is asking for
Half the time lost in GA4 setup is spent supplying the wrong identifier, because there are three, they look nothing alike, and the interface uses "ID" for all of them.
The measurement ID looks like G-XXXXXXXXXX. It goes in your page tag, and it is the only one that appears in your HTML. If a snippet is asking you to paste something into a website, it wants this.
The property ID is a plain number, nine or ten digits, and it is what every API asks for. It is not shown next to the measurement ID; you find it under Admin, Property Settings, or in the URL of the Analytics interface after /p. Anyone hitting the Data API and getting a permission error is usually sending a measurement ID where a property ID belongs.
The stream ID is another plain number, belonging to the individual data stream inside the property. It is rarely what you want and it is easy to grab by mistake because it sits on the same screen as the measurement ID.
One property per site, or one property for everything
Worth deciding deliberately rather than by accident, because migrating later is painful.
Separate properties per site give you clean, independent reporting and separate AdSense links, and they are what most people end up with because each site gets set up on its own. The cost is that comparing across the network means opening several properties, and any API work has to loop over them.
A single property with one data stream per site puts everything in one report, which is genuinely better for spotting patterns across a network. The cost is that GA4's reporting does not separate hostnames as cleanly as you would hope, and you end up filtering by hostname in every report or building comparisons to do it for you.
For a handful of small sites, separate properties and a script that pulls all of them through the Data API is the arrangement that causes the least pain. You get clean per-site data and one place to see the whole picture.
What the AdSense link actually gives you
The link is worth making for one report, and it is worth knowing which one before you spend an afternoon on permissions.
With Enable Revenue Data Reporting turned on, AdSense revenue becomes a metric you can put next to Analytics dimensions. That turns page-level reporting from "which pages get views" into "which pages earn", and it lets you break revenue down by traffic source, device, and country.
That distinction matters more than it sounds on a content site, because pageviews and earnings do not correlate as neatly as people assume. A page that gets a lot of quick bounces from social can earn less than a page with a third of the traffic that arrives from search with commercial intent. Without the link you are guessing at which of your pages is carrying the site.
Allow up to 24 hours after linking for data to appear, and do not conclude the link failed before then. It routinely looks broken on day one.
The same account problem, in the other direction
The reverse case produces a different empty list. If you are signed in as the AdSense owner and the Analytics property does not appear where you expect, the property belongs to a different account and you need Editor rights on it. Analytics access is granted at the account or property level under Admin, Access Management, and adding a user there is reversible and low risk, unlike adding an AdSense administrator. When two Google products need to be connected and one of them controls money, grant access on the side that does not.
Check the tag is firing before you debug the link
One thing to rule out before spending time on integrations: whether the measurement tag is actually running on the live site. A tag that is present in your source but blocked, misplaced, or pointing at the wrong measurement ID produces an empty property, and an empty property makes every downstream problem look worse than it is.
curl -s https://yourdomain.com/ | grep -o 'G-[A-Z0-9]\{10\}' | sort -u
That confirms the ID in the shipped HTML matches the property you are looking at. On a multi-site network, the failure this catches is a copied template carrying the previous site's measurement ID, which sends one site's traffic into another site's reports and is close to impossible to spot from inside Analytics.
Then use the Realtime report with your own visit to confirm the tag fires. If Realtime shows nothing while you are actively on the page, the problem is the tag, not the link, and nothing you do in Product Links will help.
Revenue reporting problems after the link works
Getting the accounts lined up only creates the link. It does nothing about an empty property caused by a tag that is not firing, or by a copied template shipping the previous site's G-XXXXXXXXXX measurement ID into the wrong property, and it will not tell you which of the three IDs an API is asking for. It has no bearing on indexing, on ads.txt, or on whether your latest deploy actually put the tag on the live site. If Realtime shows nothing while you are on the page, nothing in Product Links helps.
Questions about linking GA4 and AdSense
Why does the AdSense publisher picker say No results found when I have an AdSense account?
The picker lists only publishers that the Google account you are currently signed in as administers. If your AdSense account belongs to a different Google login, the list is legitimately empty and the interface does not say so.
How do I find out which Google account owns my AdSense account?
Sign in as any account, go to https://adsense.google.com/adsense/u/0/pub-XXXXXXXXXXXXXXXX/home and vary the u/0 index to check each profile. The account that loads the dashboard is the owner, and a denial page lists the other accounts on the browser that do have access.
Should I just add my main Google account as an AdSense administrator?
Only if signing in as the owning account is not possible. Adding an administrator to a revenue account is a permanent change to who controls your payments, made to solve a temporary inconvenience, so sign in as the owner first.
What permissions do I actually need to link GA4 and AdSense?
Two permissions held by the same signed in Google account: edit rights on the Analytics property, and administrator access on the AdSense publisher. One account with only one of the two produces an empty picker.
How long until AdSense revenue shows up in Google Analytics?
Allow up to 24 hours after linking with Enable Revenue Data Reporting turned on. It routinely looks broken on day one, so do not conclude the link failed before that.
Is the measurement ID the same as the property ID?
No. The measurement ID looks like G-XXXXXXXXXX and is the only one that appears in your HTML, while the property ID is a plain nine or ten digit number found under Admin, Property Settings, or in the Analytics URL after /p, and it is what every API asks for.