Guide

How to see profit per product in Performance Max

Google Ads reports product-level cost and conversion data for Performance Max on the Products tab and on each asset group’s Listing groups tab. It shows gross profit only if you also send cart data and a cost of goods per item, and it never shows net profit after refunds and ad spend. You get profit either from Google’s gross-profit reporting (conversions with cart data plus a cost_of_goods_sold value in Merchant Center) or by joining cost per item ID to Shopify orders, refunds and cost per item — in a spreadsheet, or continuously with a tool such as Opteno.

Last checked · More guides

Method 1: gross-profit reporting inside Google Ads

Google Ads can show gross profit per product: its product-reporting page, which covers Performance Max, says cart data reveals ‘true item-level profitability’. It needs two things in place: purchase conversions that carry cart data, and a cost_of_goods_sold value on each item in your Merchant Center feed. Without cart data, the product views stop at cost, clicks, conversions and conversion value; with cart data but no cost_of_goods_sold you also get revenue and orders, but no gross profit.

There are two places to look. The Products tab (Campaigns menu → Products) shows product performance across campaign types; at account level it covers Standard Shopping and Performance Max. The Listing groups tab sits inside each Performance Max campaign: Campaigns → your campaign → Asset groups → Listing groups.

Neither is guaranteed to match the campaign, and Google explains why. The Listing groups tab “can only report on product-level data”: when one ad slot shows several products, each collects an impression while the campaign counts one. On the Products tab, cost and conversions are only the share attributed to ads that served Merchant Center products; the rest of the campaign’s spend is not reported against any product.

Since June 2026, Performance Max product metrics cover all networks rather than Search alone, so older exports are not like for like.

  • What it needs

    Biddable purchase conversions from the Google tag or Google Tag Manager (or imported from Google Analytics, Search Ads 360 or Firebase) with each order’s items attached, using item IDs that exactly match your linked Merchant Center feed. Then cost_of_goods_sold per item: a number plus an ISO 4217 currency code, which Google accepts as an estimate or an average.

  • What it computes

    Revenue, cost of goods sold, gross profit (revenue − COGS) and gross profit margin, in the Conversions columns on the Campaigns, Ad groups and Products pages. By Item ID it shows every sale that followed an ad featuring the product; by Item ID sold, sales of the product whichever ad was clicked.

  • What it still leaves out

    Refunds, unless you upload conversion adjustments that restate or retract the original conversion (matched by order ID, or by click ID and conversion time). Payment fees, shipping you bear, and VAT if your conversion value includes it. The ad spend, which you subtract yourself to reach net profit. And any item without a COGS value, which drops out of gross profit — Google says the figure is then inaccurate.

Method 2: join cost by item ID to Shopify orders

Without cart data you can still get the answer, because Google knows the cost per item ID and Shopify knows what each variant sold, refunded and cost. For one store with around thirty products it is an afternoon well spent.

  1. Step 1: Fix one period for both sides

    Use the same dates in Google Ads and Shopify, ending yesterday, so a partial day distorts neither.

  2. Step 2: Export cost by item ID

    From a shopping-performance report segmented by item ID, take cost for your Shopping and Performance Max campaigns, with the account’s total spend for the same period beside it.

  3. Step 3: Match item IDs to Shopify variants

    Map each item ID to the Shopify variant it represents, then roll variants up to products.

  4. Step 4: Take revenue from Shopify

    Gross sales per variant on the order date, minus the refunds recorded in the same period. This counts every sale, not only those that followed an ad.

  5. Step 5: Subtract cost of goods

    Units sold × each variant’s cost per item, or a store-wide percentage where you have no per-variant cost. Mark a missing cost as missing, never as zero.

  6. Step 6: Compute three numbers

    ROAS = revenue ÷ spend. POAS = (revenue − COGS) ÷ spend, break-even at 1.00×. Net profit = revenue − COGS − spend.

  7. Step 7: Keep unattributed spend on its own line

    Account spend minus the sum of item-level cost is spend no product can be charged with. Report it as one line; do not spread it across products. If the ad account bills in another currency, convert each day at that day’s rate before summing.

Worked example: three products, one campaign

Every figure below is an example, not a real store: one Performance Max campaign, three products, the 30 days ending yesterday, in euros. Revenue is after refunds; COGS is units sold × cost per item. Break-even POAS is 1.00×.

  • Example product A

    Revenue €6,000 · COGS €2,400 · spend €1,000 · ROAS 6.00× · POAS 3.60× · net profit €2,600. Verdict: well above break-even; a candidate for more budget.

  • Example product B

    Revenue €3,000 · COGS €1,950 · spend €750 · ROAS 4.00× · POAS 1.40× · net profit €300. Verdict: above break-even, thinly. Watch it.

  • Example product C

    Revenue €2,400 · COGS €1,680 · spend €800 · ROAS 3.00× · POAS 0.90× · net profit −€80. Verdict: below break-even. Its 30% gross margin (after cost of goods only) needs at least 3.33× ROAS to cover its ad spend; at 3.00× it lost €80 over the period.

  • Example unattributed spend

    €250 of campaign spend not tied to any item ID, on its own line and charged to no product.

The same campaign, added up

Added up to campaign level, the example is €11,400 of revenue against €2,800 of spend: a 4.07× ROAS and €2,570 net profit (€11,400 − €6,030 − €2,800). The total is profitable, and nothing in it points at product C.

Method 3: let Opteno run the join on every sync

Opteno runs the Method 2 join continuously. It reads products, variants, orders, refunds and cost per item from Shopify, and daily spend, impressions, clicks and conversions per product offer from Google Ads, and joins them on the offer identifier Google reports spend against. Both connections use the provider’s own OAuth sign-in, with no script or pixel on your store.

  • Revenue = gross sales − refunds; COGS from each sold variant’s cost per item, or a store-wide percentage
  • POAS beside ROAS and net profit on one row per product, break-even at 1.00×
  • Rolling 7, 14, 30 and 60-day windows, each ending yesterday
  • Variant, country and Shopify market breakdowns under each product
  • Unattributed spend reported separately, never spread across products, so attributed plus unattributed equals what the account spent
  • Each day’s spend converted at that day’s rate; a missing cost or rate shown as unavailable with the reason, never as zero

Its limits: Google Ads Shopping and Performance Max only, not Meta; no halo or incremental revenue; comparing two date ranges of your choice is a paid add-on. Pricing is per store per month — $14.99 for one store, $11.99 each for two, $9.99 each for three or more — with a 7-day free trial of Google Ads sync that needs a card. Opteno is in early access.

Which method fits which store

  • Google’s gross-profit reporting

    Best if you send cart data, or can add it, and want gross profit inside Google Ads without another tool. Where supported (Google lists detailed cross-sell reporting for Shopping ads), it can also show what people bought after interacting with an ad for a different product.

  • A spreadsheet

    Best for a small catalogue and a one-off answer; it drifts as costs, prices and campaigns move.

  • Opteno

    Best if you want the answer kept current across windows, variants and markets, and want to act on it with offer exclusions applied only after a person approves.

What to do with the answer

  1. Step 1: Fill the missing costs first

    A product with no cost per item cannot be judged; fix those gaps in Shopify before anything else.

  2. Step 2: Read the bottom of the list

    Sort by net profit, lowest first, and compare the 7-day window with the 30-day one to tell a bad week from a bad product.

  3. Step 3: Decide on price, cost or spend

    A product below 1.00× POAS needs a higher price, a lower cost or less spend. The break-even ROAS entry (/glossary/break-even-roas) and the calculator at /tools/break-even-roas-calculator turn a margin into the ROAS it needs.

  4. Step 4: Exclude the persistent losers

    Exclude the listing group from the Listing groups tab in Google Ads. The guide at /guides/exclude-unprofitable-products-performance-max covers that; Opteno’s approval-gated version is described at /features/google-ads.

Questions

Why does a healthy Performance Max ROAS hide losing products?

Because the campaign figure is a blend: the stronger products pay for the weak ones. In the worked example, a campaign at 4.07× ROAS contains a product at 0.90× POAS whose 30% gross margin needs at least 3.33× ROAS just to cover its ad spend.

Can Google Ads show profit per product?

Gross profit, yes, if you send purchase conversions with cart data and add cost_of_goods_sold to your Merchant Center feed. It is revenue minus COGS before ad spend, and refunds count only through conversion adjustments, so subtract spend yourself to reach net profit.

Why don’t product numbers add up to the campaign?

Product impressions count once per product shown, so on the Listing groups tab an ad that shows, for example, five products records five product impressions but one campaign impression. And product-level cost and conversions cover only the share attributed to ads that served Merchant Center products.

Does Google credit the product advertised or the product bought?

It depends on the view. With cart data, Item ID shows the revenue of everything bought after an ad featuring that product; Item ID sold shows the revenue of that product, whichever ad was clicked. A join on Shopify orders counts the product sold, so the two can disagree without either being wrong.

What POAS should a product reach?

Break-even POAS is 1.00× for every product; below it, the product’s gross profit does not cover what was spent advertising it. Payment fees and shipping you bear are not in cost of goods, so leave room above 1.00× for them.

Last checked and sources

Last checked 29 September 2026, when the Google Help pages below were read; if a step no longer matches your screen, check its source. Opteno’s formulas and behaviour come from this site’s own product pages.

  • Listing groups in Performance Max: support.google.com/google-ads/answer/11596074
  • About product reporting: support.google.com/google-ads/answer/17035334
  • Navigate the Products tab: support.google.com/google-ads/answer/15092136
  • About conversions with cart data: support.google.com/google-ads/answer/9028254
  • Cost of goods sold for profit reporting: support.google.com/google-ads/answer/14943482
  • Metrics available with cart data: support.google.com/google-ads/answer/16564103
  • How to adjust your conversions: support.google.com/google-ads/answer/7686280
  • Merchant Center cost_of_goods_sold attribute: support.google.com/merchants/answer/9017895

See which products are losing you money

Connect Shopify and Google Ads in under five minutes. From $14.99 a month, cancel whenever you want, and no change to your store or your campaigns without your approval.

support@opteno.app