Skip to content

What is a good ROAS for a Shopify store?

A good Shopify ROAS is any ROAS above your break-even point: 1 divided by your margin after product cost, shipping, fees and refunds. Clear that line first, then check that the ads caused the sales, because platform ROAS also counts sales that were coming anyway.

By , Founder & CEOUpdated 6 min read

Run the numbers for your store: the free break-even ROAS calculator.

A good ROAS for a Shopify store is usually any ROAS above your break-even point, and that point is 1 divided by your margin. If you keep 40% of each sale after costs, you break even at 2.5x. Above that you make money, but only if the ads caused those sales.

The usual answer is a single ratio for every store, recited like a speed limit. It skips two questions. What does a sale leave you once the costs are paid? And would that sale have happened without the ad? Your margin answers the first. The second is where ROAS gets generous with itself.

What one store's data shows

One store's anonymised GA4 export, 1 January 2024 to 21 August 2026. It holds shares of revenue only: no ad spend, no order counts.

What the export showsValueSource cell
Break-even ROAS at a 40% margin (1 divided by 0.40)2.5xBreak-even sheet, 40% margin row
Direct, in last click, first click and touched views57.7% of revenueChannels sheet, Direct row
Paid Social, in all three views0.0% of revenueChannels sheet, Paid Social row
Journeys with one touch (0.5 days to buy)79.5% of revenueJourneys sheet, 1 touch row

Start with the first row, because it is the only one about ROAS. It is arithmetic, not a result: at a 40% margin, 1 divided by 0.40 gives a break-even ROAS of 2.5x (Break-even sheet). The export holds no ad spend, so it cannot say whether this store cleared that line.

The next two rows are about who gets the credit. Direct holds 57.7% of revenue in this store's last click, first click and touched views alike (Channels sheet). Google defines Direct as a visit from a saved link or a typed address. So more than half of this revenue arrived with no ad attached, as far as GA4 could tell.

Paid Social sits at 0.0% in all three views (Channels sheet). That has two readings. Either the store ran no paid social, or it ran ads that GA4 never filed under Paid Social. Outside Google Ads, GA4 files a click under Paid Social only if two things hold. The source is a social site, and the medium reads as paid, such as cpc. The export holds no spend, so it cannot say which reading is true.

Then the journeys. 79.5% of revenue came from journeys with one touch, and those buyers took 0.5 days (Journeys sheet). With one touch there is nothing to share out: every model hands that sale to the same channel.

What the export cannot show matters more for your question. It has no spend, so it gives no ROAS. It has no holdout, so it cannot say whether any channel caused a sale. Shares of credit are not shares of cause.

Why does the usual answer mislead?

Because one ratio cannot fit every margin. For illustration: at a 25% margin you need 4x just to break even, and at a 50% margin you need 2x. So, for illustration, a 3x campaign loses money for the first store and makes money for the second.

Shopify's margin is also the generous version. Its help page calculates margin as price minus cost, divided by price, and cost means what the product costs you. The shipping you pay, payment fees, discounts and refunds still come off before the money is yours. Divide 1 by the margin left after those, or your line will sit too low.

Then there is credit. ROAS divides the revenue a platform credits to its ads by what you spent there. Credit is not cause. A returning customer who clicks your brand-name ad on the way back was coming anyway, and the ad still books the sale.

Two dashboards rarely agree on that credit either. Google's help says Google Analytics and Google Ads attribute key events differently, so the same dates can show different numbers. Neither number tells you what the ads added.

Even the format trips people up. Google Ads writes ROAS as a percentage: its help page's 500% target means $5 of sales per $1 of spend, or 5x. For example, a 400% in Google Ads and a 4x elsewhere are the same claim.

What can the ROAS number not tell you?

It cannot tell you whether the ads caused the sales. A campaign can clear break-even on paper while every buyer it claims was already on the way. To find out, switch the spend off for some buyers, keep it on for others, and compare total sales. That is a holdout test, and it answers the question ROAS skips.

It cannot see what happens after the sale either. If buyers come back, first-order ROAS undercounts what the ad started. If they send the order back, the ROAS still counts a sale you no longer have.

And it cannot tell you where to move budget. A channel with a modest ROAS may be the one quietly filling the Direct row. Cut it, and Direct may shrink with it. That is a question about cause, and ROAS only answers questions about credit.

What to do this week

  1. Find your break-even line. In Shopify, go to Analytics, then Reports, filter the Category to Profit Margin and open Gross profit by product. Take shipping, fees and refunds off that margin, then divide 1 by what is left. Pass: one break-even ROAS per product group. Fail: blank margins, because those products sold without a Cost per item.
  2. Sort your campaigns against it. In Google Ads, open the Columns drop-down, choose Modify columns and add Conv. value/cost from the Conversions list. Mark each campaign above or below your line. Pass: you know which campaigns clear it with room to spare. Fail: campaigns sit just above the line, where a few refunds would tip them under.
  3. Ask GA4 who else claims the sale. In GA4, open Advertising, then Planning, then All channels, for the same dates. Compare the revenue GA4 credits to that channel with what the ad platform claims. Pass: both put the campaign on the same side of break-even. Fail: one says profit and the other says loss, so the ROAS is not settled.

Check the homework. Your GA4 Attribution paths export already holds the evidence. Causality Engine reads that one file and shows what each channel caused next to what last-click gave it, in 1 to 2 minutes, for €99 once (excluding VAT), refundable within 30 days. Check the homework

Sources, 1 October 2026: Product details page (Shopify Help Center); Profit reports (Shopify Help Center); About Target ROAS bidding (Google Ads Help). Default channel group (Google Analytics Help); All channels performance report (Google Analytics Help).

Frequently asked questions

  • Why is my ROAS high but my profit low?
    Because ROAS counts revenue, not profit. Product cost, shipping, payment fees, discounts and refunds all come out before profit. ROAS also counts sales the ads did not cause, such as returning buyers who click a brand-name ad on their way back.
  • Should I judge my ads by ROAS or by MER?
    Use both. ROAS judges a campaign on the sales its platform credits to it. MER, total revenue divided by total ad spend, counts each order once. If a platform's ROAS climbs while MER stays flat, the platform is claiming sales from somewhere else.
  • Does a higher ROAS always mean better ads?
    No. ROAS can rise because a campaign drifted toward buyers who were coming anyway, such as people searching your brand name. Credit goes up while new sales stay flat. Check total revenue and new customers next to it before you scale.

Go deeper: Causal attribution, explained.

Sixty-second versions of these ideas: Causality Engine on YouTube Shorts.

Keep reading

Terms in this article

Browse the full glossary

Your platforms guess.
We run the math.

Upload a GA4 export and see what each channel caused, next to last-click, in 1–2 minutes. The read is yours to keep.

Free, in your browser: your file is not uploaded. The full read is €99, refundable within 30 days. Prices exclude VAT.
Or book a 30-min call.