Skip to content

Your ROAS is inflated by shipping and discounts (Smart Bidding is optimizing for the wrong number)

GOOGLE ADS
Your ROAS is inflated by shipping and discounts (Smart Bidding is optimizing for the wrong number)
Conner Crowe

A $6M Shopify home brand audit, last quarter. Blended ROAS reading 2.4 in their Looker Studio dashboard. Contribution margin per order: negative on 28% of revenue once shipping, returns, and platform fees were deducted. Twelve months of media optimization, and the algorithm had been quietly steering them toward the orders that lose them money. Nobody at the brand had touched the conversion value variable since the GA4 migration in 2023.

The bid layer was doing exactly what they told it to do. The thing they told it to do was wrong.

Quick Take

Smart Bidding optimizes against the conversion value you send it. The default Shopify + GA4 + Google Ads stack sends gross transaction value, which includes shipping, tax, and discounts. A $200 order with $50 shipping reports as $250. Smart Bidding then thinks that order is more valuable than a $250 free-shipping order and bids harder on the high-shipping segment. Margin contribution drifts down quietly for 6 to 12 months. The fix is a 10-minute change in your purchase event variable. The result is a 6-week algorithm rebalance toward profitable orders.

How transaction value gets to Google Ads

In a stock Shopify + GA4 + Google Ads setup, the Purchase event fires when checkout completes. GA4 receives a transaction_value parameter that defaults to the cart total. The cart total includes the merchandise, the shipping line, the tax, and any discount that has been applied as a negative line item. Then GA4 forwards that value to Google Ads via the linked-property connection.

Google Ads treats every dollar of that value identically. It does not know that $50 of the $290 was shipping. It does not know that the brand makes negative margin on that shipping line. It does not know whether the $40 discount was a strategic loyalty incentive or a 30% sitewide fire sale that burned margin. From the bidding algorithm’s perspective, $290 is $290.

So Smart Bidding, doing its job, looks at the historical Purchase data and asks: which audience segments produce the highest conversion value per click? The answer comes back skewed. People who buy heavy products that ship from a single warehouse generate higher recorded “values” (because the shipping line is larger). People who only buy when there’s a discount generate slightly lower recorded values, but they convert at a higher rate. The algorithm bids harder on both. The brand pays more for high-shipping cart shoppers and discount-hunters than it should.

Twelve months of this and the contribution margin curve crosses zero on a meaningful chunk of revenue. The dashboard never tells anyone because the dashboard is reporting the inflated number.

The moment in the account where this becomes obvious

Day two of the audit. I opened GTM and searched for the Purchase tag. Variable mapping: Transaction Total pulled from the dataLayer. Pulled the Shopify checkout source, scrolled to the dataLayer push. The push contained total_price, which Shopify defines as merchandise + shipping + tax minus discounts. Not net to the brand.

Then I opened the GA4 property, Events > Purchase > Modify event. Default value parameter. Same number. Then Google Ads, Goals > Conversions > Purchase > Edit. Conversion value: “Use the value from the event.” Inherited again.

The whole stack was reporting gross-with-shipping-with-tax. Smart Bidding had been optimizing on that signal since the GA4 migration. The agency the brand was working with had not touched it. Probably because the dashboard looked fine.

I pulled Shopify’s last 90 days of transactions and rebuilt the value column manually. Net revenue (gross minus shipping minus tax minus discounts) ran about 18% lower than the value Google Ads was seeing. The orders that drove the largest gap, predictably, were the high-shipping segment.

The 4-step fix

These are in order. Each one is a 1-3 minute change in the relevant console.

  1. Define a net revenue variable in Shopify (or via GTM). Either compute it server-side with a Shopify Function on the checkout, or pull subtotal_price and total_discounts from the dataLayer and subtract. Net = subtotal minus discounts. Tax and shipping never enter the equation. This is the number that maps to contribution margin.
  2. Replace the value parameter in GA4. In GTM, edit the GA4 Purchase event tag. Swap the value field from the existing transaction_total variable to the new net_revenue variable. Publish a new container version. Verify in GA4 DebugView that the next purchase event sends the lower number.
  3. Re-import the purchase conversion in Google Ads. Google Ads will pick up the change automatically through the linked GA4 property within a day or two. Confirm in Goals > Conversions > Purchase that the recent conversion values match the new lower numbers. If they don’t, the conversion is being inherited from a non-GA4 source (usually the Google Ads tag itself); replace that source too.
  4. Wait 6 weeks. Smart Bidding needs around 50 conversions of the new signal to rebalance. During the 6 weeks, hold your tROAS target and your bid strategy constant. Do not also change creative, also change audiences, also change campaign structure. One variable per change window or the algorithm has nothing clean to learn from.

Step 4 is where most teams fail. The dashboard ROAS will look worse for those six weeks because the same orders are now reporting lower values. The temptation is to “fix it.” Don’t. The algorithm is recalibrating against the right signal for the first time.

What happens if you don’t do this

The dashboard keeps showing healthy ROAS because the dashboard is reporting the wrong number. Smart Bidding keeps bidding hardest on the high-shipping segment and the discount segment because those are the ones it thinks are most valuable. Contribution margin per order drifts down ~2-4% per quarter as the audience composition shifts. After three quarters, the CFO notices it in the gross-margin line. After four quarters, the founder cuts media budget by 25%.

The remaining 75% of the budget is now bidding against the same broken signal, on the same skewed audience model, which makes the cheap-margin problem worse, not better. Eighteen months later the brand concludes that Google Ads doesn’t work for furniture. They are not wrong about the symptom. They are wrong about the root cause.

I have audited 14 mid-market Shopify brands in the last two years. Eleven of them had this exact configuration. Of those eleven, three had also been told by their previous agency that the issue was “creative fatigue.”

Receipts

Audit ran across the $6M furniture brand’s Shopify account, GTM container, GA4 property, and Google Ads account. The conversion value swap took effect on day 8. Smart Bidding completed the rebalance over weeks 5 through 8. Reported ROAS dropped from 2.4 to 2.0 over that window. Contribution-margin ROAS (the number that maps to the P&L) rose from 1.4 to 1.7. Margin-per-click rose 22% on the same media spend. The shipping-heavy segment dropped from 41% of orders to 28% as Smart Bidding rebalanced. The wasted-spend calculator on this site is built around the same model.

The same brand’s CAC payback curve, calibrated against the corrected contribution-margin ROAS, walks through in the CAC payback post. The two reads compound: a corrected ROAS proves the spend is honest; the payback curve tells the founder whether the next budget increment is buying growth or buying a cash crunch.

Keep going

If this hit, the next two pieces in the same universe:

Free PDF: The 25-page Tracking Stack. No email gate. The exact GTM + GA4 + Google Ads architecture I rebuild every Shopify account around.

What’s next

If you run a $1-10M home, furniture, or decor brand on Shopify and the dashboard ROAS does not match what the P&L says, this is the diagnostic I run first. The full audit, the conversion-value rebuild, and the Smart Bidding rebalance live inside the program here: connercrowe.com/for-home-brands.

Want a review like this on your account?

Want this kind of review
on your account?

Thirty minutes on the phone. Same person on the call as on the work. Walk out with a clear set of next steps.

Book a Call