Product
Profit per product inside Performance Max
Performance Max is a single campaign that spends across every surface Google has. It will tell you what the campaign returned. Opteno tells you which products inside it earned, and which were paid for by the rest.
Why Performance Max hides this
A Performance Max campaign is deliberately a black box: one budget, one bid strategy, and Google deciding where the money goes. The reporting follows the structure, so the headline figure is a campaign ROAS blended across everything in the feed.
That blend is where a losing product hides. A campaign at 3.2× can comfortably contain a product running at 0.8× on your real margins, and nothing in the campaign view will point at it.
Google does report cost against the product offer identifier, though. That identifier is also on the Shopify order. Joining the two is the entire trick, and it is what Opteno does on every sync.
What Opteno does with it
Attributes spend to products
Daily spend, impressions and clicks are read per offer in the ad account’s own currency, and joined to the Shopify product the offer belongs to. Spend that cannot be tied to a product is reported as unattributed, never spread across the catalogue — attributed plus unattributed always equals what the account spent.
Applies your real costs
Cost of goods comes from each sold variant’s cost-per-item, or a store-wide percentage if you set one. Refunds come off revenue. What is left, divided by the spend, is POAS — and its break-even is 1.00× for every product.
Shows it over windows that mean something
Rolling 7, 14 and 30-day windows, each ending yesterday. The short one catches a product turning this week; the long one keeps one bad week from condemning a good product.
Lets you act on the bottom of the list
Select the products losing money and Opteno plans the exclusion per offer per asset group, validates it with Google without applying it, and shows you which offers change, which do not, and which are blocked and why — before anyone approves anything.
How an exclusion actually works
Step 1: Opteno reads the asset groups
It finds the Performance Max asset groups the selected offers appear in, and reads each one’s listing-group tree.
Step 2: It plans the change per offer, per asset group
An offer in three asset groups is three planned changes, not one — because that is how the account is actually built.
Step 3: It validates with Google, without applying
A dry run comes back with an outcome per offer. Offers that cannot be changed — most often because Google caps the number of listing-group filters in an asset group — are reported as blocked, with the reason.
Step 4: A person approves
Only then is anything applied, and each offer’s outcome is recorded, so a partial apply is visible and retryable rather than something discovered later in Google’s interface.
Step 5: And it is reversible
Including an offer again is the same flow in the other direction. Nothing about an exclusion is one-way.
What is never touched
Budgets, bids and campaign status. Opteno cannot change a budget, cannot change a bid and cannot pause a campaign — the single write available to it in Google Ads is the offer-level listing-group filter inside a Performance Max asset group. A preview goes stale after thirty minutes and must be re-run rather than applied late.
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.