Optimising your Google Shopping feed purely for ROAS is one of the most expensive mistakes a performance team can make — it trains Google's algorithm to maximise revenue on the SKUs that eat your margin fastest. After auditing 50+ Shopify stores in 2025, the single biggest contributor to margin erosion we found wasn't ad spend, creative quality, or bid levels — it was feeds that had no margin signal at all, leaving Google to route budget toward whatever converted at the highest revenue rate regardless of what that revenue actually cost the business.
The ROAS Trap: How Revenue Optimisation Destroys Margin Mix
ROAS as a primary Shopping KPI made sense in the pre-PMax era when you could force exact product coverage via Standard Shopping campaigns. Performance Max changed the contract: you hand Google a feed and a signal, and the algorithm decides what to show, to whom, and when. If the only signal you provide is target ROAS, Google optimises for revenue-per-impression — full stop. There is no built-in mechanism that distinguishes a $300 sale at 15% margin from an $80 sale at 42% margin.
The mechanical problem is that high-revenue SKUs are rarely your best-margin SKUs. A $300 item converting at 4× ROAS generates $300 of revenue per $75 spent. A $80 item at 6× ROAS generates $80 of revenue per $13 spent. Google surfaces the $300 product because it wins on revenue. But if the $300 product carries 15% contribution margin and the $80 item carries 42% margin, the $300 product generated $45 gross contribution versus $33.60 for the $80 item — a meaningful difference per order, and catastrophic at scale once you account for customer acquisition cost, returns, and fulfilment.
We rebuilt feeds for 11 DTC brands this quarter and the pattern emerged without exception: the bottom 20% of SKUs by contribution margin were receiving between 31% and 47% of Shopping impression share. One $4M/yr Shopify apparel brand was spending 38% of its Google Shopping budget on its three worst-margin product lines. Per McKinsey's growth-marketing and sales research, companies that align media investment to margin contribution rather than top-line revenue routinely unlock 15–25% incremental EBITDA without increasing total spend.
The fix is not a bid adjustment. It is a data architecture decision you make at the feed level before a single auction is touched. That distinction matters because bid adjustments are reactive — they chase outcomes after Google has already made routing decisions. Feed-level margin signals shape those decisions upstream.
Mapping Contribution Margin to Feed Attributes Without an ERP
The most common objection to margin-based feed segmentation is "we don't have an ERP that pipes margin data cleanly into our feed." That's fair — and it's not a blocker. Enterprise ERP integration is ideal, but an 80%-accurate margin signal built from Shopify's native cost field is enough to separate your 40%+ margin products from your 12% margin products, which is the only segmentation that changes budget routing materially.
Start by exporting three columns from Shopify: variant_id, price, and cost. If cost is missing for some SKUs, use your category-level average COGS as a proxy — imperfect, but directionally correct enough for tier assignment. Contribution margin at the feed level doesn't need to match your finance team's fully-loaded accounting figure; it needs to be consistent and accurate enough to rank products against each other.
Shopify metafields provide the cleanest injection point. Per Shopify's official metafields documentation, you can create a product.metafields.custom.contribution_margin_tier field and populate it programmatically via the Admin API or a Bulk Operations GraphQL mutation. Once the metafield exists, it surfaces as a pullable attribute inside most feed management tools and supplemental feed pipelines — no custom connector required.
For stores on WooCommerce, the same logic applies via WooCommerce product meta. The critical step, regardless of platform, is calculating the margin tier in your source system and writing it to a product-level attribute — not attempting to derive it downstream inside Google Ads rules, where you lose granularity and version control. The MagicFeed Pro Shopify integration handles the COGS pull and tier write in a single pipeline step, which eliminates the manual export-and-reload cycle that creates lag between a price change and the correct tier being served.
Do not calculate margin tiers using Google Ads feed rules or Merchant Center supplemental feeds alone. Without the margin value living on the product record itself, you cannot version-control it, you cannot audit it at the SKU level, and a price change can temporarily misclassify a product's tier for up to 24 hours — long enough to waste meaningful budget on a drain-tier SKU at an Elite-tier bid.
Custom Label Architecture for 3-5 Margin Tiers
Once you have a margin value per SKU, collapse it into discrete tiers so Google Ads can segment asset groups and bid strategies. Three tiers is the minimum viable architecture. Five tiers gives you surgical control if your margin distribution is wide — typical in multi-category catalogues where apparel, accessories, and bundles occupy completely different margin bands.
Here is the four-tier structure we use across client accounts, calibrated for most DTC verticals. Adjust the percentage thresholds to your actual margin distribution before applying:
| Tier Label | Contribution Margin Range | Custom Label Value | Bid Posture |
|---|---|---|---|
| Tier 1 — Elite | ≥ 45% | margin_elite | Aggressive TROAS expansion |
| Tier 2 — Core | 30–44% | margin_core | Standard TROAS target |
| Tier 3 — Breakeven | 18–29% | margin_breakeven | Conservative TROAS floor |
| Tier 4 — Drain | < 18% | margin_drain | Suppressed or excluded |
Map these values to custom_label_0 in your feed. If custom_label_0 is already in use for another segmentation axis — bestseller rank, seasonality, clearance status — shift margin to custom_label_1. Google Shopping feeds support custom_label_0 through custom_label_4, giving you five independent axes. Document which label maps to which dimension in your feed spec so the architecture survives team turnover and agency handoffs.
MagicFeed Pro's custom label automation handles the COGS-to-tier calculation and label writing in a single pipeline pass — critical when you're managing catalogues above 5,000 SKUs where manual CSV manipulation introduces both lag and error. For smaller catalogues, a Google Sheets formula pulling from an exported product CSV works fine as a starting point.
One nuance worth emphasising on the Drain tier: resist the reflex to exclude every margin_drain SKU immediately. Some low-margin products are deliberate loss-leaders with documented cross-sell lift — accessories that consistently drive repeat purchases of Elite-tier products. For those, create a sub-label margin_drain_strategic and evaluate their halo contribution before removing them from Shopping entirely. Blunt exclusion of loss-leaders has cost more than one brand significant LTV in exchange for a short-term margin bump that looked good in monthly reporting.
Feeding Margin Signals Into PMax Asset Group Segmentation
Performance Max asset groups are the structural lever where margin tiers translate into actual budget routing. The default PMax setup — one asset group, full catalogue — eliminates any ability to give Google differentiated signals by margin tier. You need at minimum two asset groups: one for Elite and Core SKUs, one for Breakeven and Drain. Three asset groups is the recommended starting architecture for most catalogues between 1,000 and 10,000 SKUs.
The three-asset-group structure that works across client accounts:
- Asset Group A — Growth: Tier 1 products (
margin_elite). Highest TROAS target or Target CPA if AOV is consistent across the tier. Full audience signal breadth to allow PMax maximum discovery latitude. - Asset Group B — Sustain: Tier 2 and Tier 3 products (
margin_core,margin_breakeven). Standard TROAS. Moderate audience signal scope. - Asset Group C — Monitor: Tier 4 products (
margin_drain). Either excluded from PMax and shifted to a low-budget Standard Shopping campaign, or retained with a TROAS floor high enough to functionally suppress spend without triggering a full restructure.
Product segmentation inside PMax asset groups maps directly to your feed's custom labels — you filter by custom_label_0 = margin_elite inside the asset group's product group settings. This is the intended use of the custom label attribute per Google Merchant Center's official product data specification, not a workaround.
One structural caveat: PMax consolidates budget across asset groups within a single campaign. If you want hard budget floors per margin tier, you need separate PMax campaigns rather than separate asset groups inside one campaign. Separate campaigns carry the cost of longer learning periods and higher minimum conversion volume requirements. Catalogues below roughly £10k/month in Shopping spend generally perform better with one campaign and three asset groups rather than three separate campaigns each starved of the conversion volume Google needs to exit the learning phase.
Bid Strategy Configuration Once Your Feed Reflects True Margin
With margin tiers live in the feed and asset groups structured around them, bid strategy configuration has a clear mathematical framework. The conceptual shift most teams need is converting contribution margin percentages into TROAS equivalents so the bid strategy is anchored to margin floor rather than revenue floor.
The formula is direct: Minimum acceptable TROAS for a tier = (1 ÷ contribution margin %) × 100
For an Elite-tier product at 48% contribution margin, the minimum TROAS is (1 ÷ 0.48) × 100 = 208%. Your target TROAS should sit 1.4–1.8× above that floor — roughly 290–375% — to give Google headroom to find high-quality impressions rather than scraping breakeven conversions.
For a Drain-tier product at 14% contribution margin, the minimum TROAS is 714%. Setting a 750% TROAS target on a product averaging 280% TROAS in your current campaigns means Google will serve it rarely — which is precisely the intended outcome.
Build a custom column in Google Ads called "Margin-Adjusted ROAS" using the formula: Conv. value ÷ Cost × contribution_margin_%. This gives you a real-time margin efficiency metric that accounts for COGS, not just revenue yield — and it surfaces immediately when a tier-reassigned SKU is still pulling disproportionate spend relative to its margin contribution.
Across 4 client accounts running Performance Max with this architecture, smart bidding stabilised on the new margin-weighted signals within 2–3 weeks. Plan for a firm 30-day observation window before drawing conclusions. The single most common post-restructure mistake is adjusting TROAS targets at day 12 when volume dips — that dip is the algorithm recalibrating, not a signal of structural failure. Bid changes during the learning period restart the clock and routinely extend the effective observation window to 6–8 weeks.
For additional detail on how feed attribute structure affects PMax campaign performance, the MagicFeed Pro feed segmentation guide covers attribute hierarchy and supplemental feed timing in depth.
Case Study: 22% Margin-Per-Order Lift Over 90 Days
A Shopify apparel brand doing $4M/year in e-commerce revenue came to us with a ROAS plateau at 3.8× and a contribution margin problem they hadn't yet quantified. Their DTC founder suspected the feeds were the root cause; the incumbent performance agency had spent six months optimising audience signals and creative assets with no sustained ROAS or margin improvement.
Baseline state at engagement start:
- Total SKUs in feed: 1,847
- SKUs with cost field populated: 0
- PMax structure: 1 campaign, 1 asset group, full catalogue
- Blended TROAS target: 380%
- Contribution margin per order (finance team estimate): 23%
The 8-week implementation sequence:
- COGS populated for all 1,847 SKUs via Shopify cost field, cross-referenced against supplier invoices for the top 200 revenue SKUs.
- Contribution margin calculated per SKU. Distribution: 31% Elite (≥45% CM), 28% Core, 22% Breakeven, 19% Drain.
- Margin tiers written to
custom_label_0via supplemental feed updated nightly. - PMax restructured to 2 campaigns (Growth and Monitor) with 3 asset groups total.
- TROAS targets set per tier using the floor formula above.
- 30-day learning window observed with zero bid changes.
Results at 90 days:
| Metric | Baseline | Day 90 | Change |
|---|---|---|---|
| Blended ROAS | 3.8× | 3.4× | −11% |
| Contribution margin / order | 23% | 28.1% | +22% |
| Total ad spend | $41,200/mo | $39,800/mo | −3.4% |
| Gross margin from Shopping | $62,340/mo | $74,240/mo | +19% |
| Revenue from Shopping | $156,600/mo | $135,300/mo | −14% |
ROAS dropped. Revenue dropped. The founder's first reaction at the day-30 check-in was alarm — and it's the correct reaction if you haven't pre-framed the expected mechanics before the restructure. Gross margin from Shopping increased by $11,900/month on slightly less spend. Annualised, that is $142,800 in additional margin from the same channel at lower total ad cost. The trade-off is structurally positive on a cash basis for any brand operating below 30% blended contribution margin.
Search Engine Land's coverage of margin-based bidding trends in Google Shopping confirms this approach is becoming standard practice in high-performance accounts — and adoption remains low enough in 2026 that teams implementing margin-aware feed segmentation now hold a structural advantage over competitors still optimising for revenue ROAS.
Upload your feed and we'll flag every Drain-tier product currently receiving impression share — along with the exact TROAS floor each one needs to stop bleeding margin.
Related articles

Free Shopping Feed Audit: What It Checks & How to Act
A free shopping feed audit flags GTIN errors, title gaps, and disapprovals draining your ROAS. Find the highest-impact fixes and act on them fast.

Shopping Feed Cold-Start Problem: Rank New SKUs in 14 Days
Google Shopping new product ranking defaults to 6–8 weeks. This feed-signal priming sequence cuts cold-start to 14 days — tested on 3 DTC accounts.

How AI Rewrites Should Prioritize Highlights Over Titles in 2026
AI product feed rewrite priority highlights vs titles: highlights bullets now deliver 22% CTR lift vs 5% for repeat title edits. Here's the sequencing framework.

