Jun 21, 2026 · 8 min read
Google Ads + Shopify: Real Campaign Profitability
First-hand guidance from the Daymark team on analytics workflows, growth reporting, and the operational metrics teams use to make decisions.
Google Ads ROAS and Shopify profit are different numbers. Most Shopify brands use ROAS to decide which campaigns get more budget. That's a problem, because ROAS does not account for margin, discounts, or refunds.
This guide explains why the two numbers disagree, and how to blend Google Ads spend with Shopify orders and margin data to find which campaigns are actually worth the budget.
Why Google Ads ROAS and Shopify Profit Tell Different Stories
Google Ads ROAS is calculated from conversion value divided by ad spend. Conversion value comes from Google's own tracking. It's attributed within a chosen conversion window, commonly 30 days for clicks. Many accounts adjust this further with conversion value rules and modeled conversions for users Google can't directly track.
None of that touches:
- Cost of goods sold. A $100 order on a 70%-margin product and a $100 order on a 25%-margin product look identical in Google Ads. They are not identical to your bank account.
- Discounts. If the campaign drove traffic to a 20%-off landing page, Google still counts the full order value as conversion value, not the discounted amount you actually collected.
- Refunds and returns. Google Ads does not retroactively subtract a return that happened nine days after the sale. Shopify does.
- Payment processing and fulfillment costs. These are real, per-order costs that scale with revenue. Google Ads has no visibility into them.
- Attribution window inflation. A 30-day click window means a customer who searched your brand name two weeks after seeing a Shopping ad gets attributed to that ad, even if they would have bought anyway.
It's common for a Shopify store to see a 4x ROAS campaign that is barely break-even, or even unprofitable, once margin is applied. The reverse also happens. A "weak" 1.8x ROAS campaign on a high-margin product line can be one of the most profitable things you run.
What Campaign Profitability Actually Requires
To know whether a campaign is profitable, you need three things in the same view. Spend by campaign, matched revenue from actual Shopify orders, and a margin layer covering COGS, discounts, refunds, and per-order variable costs.
Put together, the formula looks like this:
Campaign Contribution Margin =
Matched Shopify Revenue
- COGS
- Discounts Given
- Refunds
- Payment & Fulfillment Costs
- Ad Spend
That number, not ROAS, is what tells you whether a campaign is worth scaling.
How to Build This View, Step by Step
Turning that formula into something you can actually use takes four steps: clean spend data, a real match to Shopify orders, a margin layer on top, and a process to keep it current. Here's each one.
Step 1: Get Clean Spend Data by Campaign
Pull daily spend at the campaign level from Google Ads. Use ad group or product group level too, if you can. If a large share of spend sits in Performance Max, treat it as one line item rather than forcing a granularity the platform doesn't expose. You'll get more signal from comparing PMax as a whole against Search and Shopping than from guessing at its internals.
Step 2: Match Spend to Real Shopify Orders
This is the step most teams skip, and it's the one that actually matters. Google's attributed conversions and Shopify's orders are not the same dataset. Don't try to reconcile them order by order. Instead:
- Use discount codes unique to a campaign where possible. They are a far more reliable join key than UTM parameters, which get stripped, duplicated, or lost across redirects.
- For campaigns without unique codes, use Shopify's own marketing attribution data (landing page, referring source) as a directional match, not a perfect one.
- Compare blended totals: total Google Ads spend against total revenue from sessions that arrived via Google Ads, over a week or month. Blended accuracy beats false last-click precision.
Step 3: Layer In Real Margin
Once spend and revenue are matched at the campaign level, apply your margin data. A simplified example:
| Campaign | Spend | Matched Revenue | Google Ads ROAS | COGS + Fulfillment | Contribution Margin |
|---|---|---|---|---|---|
| Shopping: Bestsellers | $4,000 | $16,000 | 4.0x | $11,200 | $800 |
| Search: Brand | $1,200 | $7,200 | 6.0x | $5,040 | $960 |
| Shopping: Clearance | $3,000 | $13,500 | 4.5x | $10,800 | -$300 |
| PMax: All Products | $6,500 | $22,000 | 3.4x | $15,400 | $100 |
The Clearance campaign has the second-best ROAS in the table, and it's the only one losing money. It's pushing low-margin inventory at a discount. Without margin in the view, this campaign looks like one to scale. With margin, it's the first one to pause or restructure.
Step 4: Make It a Recurring View, Not a One-Time Spreadsheet
COGS changes. Discounting changes. Google reshuffles budget across campaigns constantly, especially inside Performance Max. A profitability check you run once a quarter in a spreadsheet is stale within weeks.
Most teams rebuild this join by hand every week: a Google Ads export, a Shopify export, and a margin tab, stitched together manually. Daymark connects directly to Google Ads and Shopify, so you can ask "what's the contribution margin by campaign for the last 30 days" in plain English and get a dashboard instead of rebuilding a spreadsheet every Monday.
A Simple Framework for Acting on the Data
- Scale: positive and stable contribution margin over at least 2 to 3 weeks of consistent spend.
- Watch: revenue is healthy but margin is thinning. Usually this means rising discount rates, a shift toward lower-margin SKUs, or creeping CPCs.
- Cut or restructure: negative contribution margin sustained over multiple weeks at meaningful spend, not a single bad day. Don't kill a campaign on noisy, low-volume data.
Frequently Asked Questions
Why doesn't my Google Ads ROAS match my Shopify profit?
Google Ads ROAS is based on attributed conversion value within a tracking window. It has no visibility into COGS, discounts, refunds, or fulfillment costs. Shopify profit accounts for all of that, so the two numbers measure different things and will rarely match. Treat ROAS as an efficiency signal, not a profit number.
What's a good ROAS for a Shopify store?
It depends entirely on your margin. A useful shortcut is breakeven ROAS, roughly 1 divided by your contribution margin percentage before ad spend. A brand with 40% margin before ads breaks even around 2.5x ROAS. A brand with 20% margin needs closer to 5x just to break even, before other costs.
Should I trust Performance Max reporting for profitability decisions?
Treat PMax spend and conversion data as directional, not precise. Google limits breakdown by channel and product within these campaigns. It's still worth blending PMax spend against matched Shopify revenue at the campaign level, but expect less granularity than you'd get from Search or standard Shopping campaigns.
Do I need a dedicated attribution tool to do this?
Not necessarily. Attribution platforms solve cross-channel modeling, which matters more once you're running Google, Meta, and other channels at the same time. If the question is specifically Google Ads campaign profitability against Shopify margin, connecting the two data sources and applying a margin layer is usually enough on its own.
How often should I review campaign profitability?
Weekly works well for most Shopify brands. That's frequent enough to catch margin erosion or a budget shift into a low-margin campaign, but not so frequent that you end up reacting to normal day-to-day noise in a small data sample. Move to a daily check only once spend is high enough that a single day carries real signal.
Can I build this without SQL or a data team?
Yes. The manual route is a recurring spreadsheet pulling Google Ads exports, Shopify order exports, and a margin tab. The faster route is connecting both sources to Daymark, which keeps the join current and lets you ask for the breakdown in plain English instead of rebuilding it each week.
Conclusion
ROAS tells you how efficiently a campaign converts ad spend into attributed revenue. It does not tell you whether that revenue was profitable. The fix is not a better attribution model. It's joining Google Ads spend with real Shopify orders and your actual margin, so "good campaign" and "profitable campaign" mean the same thing again.
If you're already connecting Google Ads and Shopify for reporting, the next step is putting contribution margin at the center of the budget conversation, not ROAS.
