Where Performance Max shows up in GA4

GA4 files Performance Max visits under a channel called Cross-network, not Paid Search or Paid Shopping. Put its spend anywhere else and every channel's return is wrong; here is where it belongs and how to read it.

Kosmas Botsis, Founder of Glancely · 6 October 2026 · 5 min read

In short

  • GA4 files Performance Max, Demand Gen and Smart campaign visits under Cross-network, by its own channel rules.
  • Put all of their spend on that row. Splitting it moves real money onto channels it never touched.
  • Filing €3,000 of Performance Max under Paid Search turned a €4.00 return into €1.60 in our example, with the total unchanged.
  • For one campaign's return, use GA4's Session campaign; for where Performance Max ran, use Google Ads' channel performance report.

You run a Search campaign, a Shopping campaign and a Performance Max campaign. In Google Analytics 4 you open the channel report to see what each brought in, and Performance Max is not under Paid Search or Paid Shopping. It is in a channel called Cross-network, a row that is easy to miss.

That is where Google puts it, by its own rules, and it is the right place. The trouble starts when you put your Google Ads spend beside GA4's revenue in a spreadsheet and have to decide which row Performance Max's money belongs on. Guess, and you get a return per channel that looks precise and is wrong.

An example

An invented shop, one month. Spend comes from Google Ads; revenue from GA4's Traffic acquisition report, by channel.

GA4 channelCampaign in Google AdsSpendGA4 revenueBack per €1
Paid SearchSearch€2,000€8,000€4.00
Paid ShoppingShopping€1,000€5,000€5.00
Cross-networkPerformance Max€3,000€9,000€3.00
All three€6,000€22,000€3.67

Now two ways of getting it wrong, with the same numbers:

  • Filing Performance Max under Paid Search, because "it is mostly search ads". Paid Search now costs €5,000 against €8,000 of revenue: €1.60 back per €1 instead of €4.00. Meanwhile Cross-network shows €9,000 of revenue with no cost at all, and looks free.
  • Splitting it evenly across Search, Shopping and Display, €1,000 each. Paid Search falls to €2.67, Paid Shopping to €2.50, Display shows €1,000 spent and nothing earned, and Cross-network again looks free.

The total is €3.67 every time. Only the rows change, and the rows are what you use to decide where the next euro goes. In the first version, a Search campaign returning €4 for every €1 looks like the weakest of the three.

Why it happens

Performance Max is one campaign that shows ads across all of Google's inventory. In Google's words, it gives access to "YouTube, Display, Search, Discover, Gmail, and Maps, from a single campaign".

GA4 sorts every visit into a channel using its default channel group rules. For a visit from Google Ads, the Cross-network rule is: the ad network type is "Cross-network" or "Google owned channels", or the campaign type is Performance Max, App, Smart, Demand Gen or Local. Google's page adds: "Cross-network includes Demand Gen, Performance Max and Smart Shopping."

Cross-network is not a gap in your tracking. It is GA4 telling you the visit came from a campaign that runs on several networks at once, so it does not file it under any one of them.

Your spreadsheet has the same problem GA4 has. Google Ads tells you what the Performance Max campaign cost, as one figure. Nothing in that figure says which part of it bought the visits GA4 recorded on a given channel, so any split you make is a guess.

Where it bites

  • Return per channel, in a spreadsheet or a Looker Studio report that joins Ads spend to GA4 revenue. The example above.
  • Before-and-after comparisons. Move budget from a Shopping campaign to Performance Max and, by the rules above, the visits it buys are filed under Cross-network instead of Paid Shopping. Paid Shopping "falls" and Cross-network "grows" with no change in what shoppers did.
  • Channel tables nobody reads to the bottom. If Performance Max is a large part of your spend, Cross-network can be one of your biggest paid channels and still sit below the rows people look at.

How to get the right number

  1. Put Performance Max spend on the Cross-network row, all of it. The same goes for Demand Gen and Smart campaigns. Search campaigns go to Paid Search, Shopping to Paid Shopping, Display to Display, Video to Paid Video.
  2. Divide each row's GA4 revenue by its own spend. In the example: €9,000 ÷ €3,000 = €3.00 back per €1 for Cross-network.
  3. To see each Performance Max campaign on its own, open Reports > Acquisition > Traffic acquisition in GA4 and change the table's dimension to Session campaign. Revenue per campaign, divided by that campaign's cost in Google Ads, needs no channel guess at all. If your campaigns are missing from the list, check that your Google Ads account is linked to the GA4 property and that auto-tagging is on.
  4. If you need to know where Performance Max ran, ask Google Ads, not GA4. Its channel performance report (Campaigns > Insights and reports > Channel performance) splits a Performance Max campaign's cost, clicks and conversions across Search, YouTube, Display, Discover, Gmail, Maps and search partners, for dates from 6 June 2025. Those are Google Ads' own conversions, counted by its own rules, so read them beside GA4's revenue, not added to it.
  5. When you compare periods, look at Paid Search, Paid Shopping and Cross-network together if your campaign mix changed between them.

How Glancely handles it

Glancely's Revenue page puts Google Ads spend on a GA4 channel row by the campaign's type: Search to Paid Search, Shopping to Paid Shopping, Display to Display, Video to Paid Video, and Performance Max, Demand Gen and Smart campaigns to Cross-network. It does not split them. Spend on a campaign type it has no row for is shown under the table as spend it could not place: counted in your total ad spend, but on no channel, because putting it on a guessed row would make that row look worse and every other row look better.

Kosmas Botsis

Kosmas Botsis · Founder of Glancely

Kosmas Botsis is the founder and lead data engineer of KB Analytics, an analytics engineering practice in Athens working with clients across Europe and the US: more than 250 projects for over 194 clients, and in Toptal's top 3% of talent. Glancely is what came out of that work.

More from the blog

  • Why your return on ad spend counts sales your ads didn't make

    Divide all of your revenue by your ad spend and the ads take credit for every organic, direct and email sale. Here is how to work out the return on the channels you actually pay for, and why it can be five times lower.

  • Why your Google Ads campaigns don't line up with GA4's

    Put Google Ads spend beside GA4 revenue by campaign and half the rows often come back empty, because the join is on a name and the names don't agree. Here is where GA4's campaign name comes from, and how to match them without hiding your best campaign.

  • Why averaging daily rates gives you the wrong number

    Average a week of daily click-through rates and you get a number for the week that is almost always wrong. Rates can't be averaged; they have to be worked out again from the totals. Here is why, and how.