Skip to content

Ad campaign ROI: the arithmetic from spend to profit

Start from Shopify net sales, take off cost of goods, fees and shipping, then the ad spend, and divide by the ad spend. The ROI holds only if the ads caused the orders, so stress-test it before you scale.

By , Founder & CEOPublished 5 min read

Run the numbers for your store: the free marketing ROI calculator, or the free profit margin and markup calculator.

A campaign's ROI is what its orders leave after everything they cost, the ad spend included, divided by the ad spend, and the platform's revenue column is only the first line of that sum. For illustration: EUR 10,000 of platform revenue on EUR 2,000 of ad spend is a ROAS of 5.0 (10,000 ÷ 2,000), but after discounts, returns, goods, fees and shipping the same campaign leaves EUR 2,000 of profit, an ROI of 100% (2,000 ÷ 2,000), and 0% if half of those orders would have happened anyway.

What does ROI need that ROAS does not?

ROAS is revenue over ad spend. ROI asks what is left: contribution before ad spend, minus the ad spend, over the ad spend. Contribution is net sales less what the orders cost you to deliver. So you need the lines the platform does not have: discounts, returns, cost of goods, and the payment fees and shipping you pay.

For one campaign, with invented numbers in EUR:

Ad spend                                   2,000
Platform revenue                          10,000   ROAS 5.0  (10,000 / 2,000)
Shopify gross sales, same orders          10,000
  less discounts                          -1,000
  less returns                            -1,000
Net sales                                  8,000
  less cost of goods, 40% of net sales    -3,200
  less fees and shipping, 10%               -800
Contribution before ad spend               4,000   50% of net sales
  less ad spend                           -2,000
Profit after ad spend                      2,000
ROI                                         100%   (2,000 / 2,000)
Break-even ROAS on net sales                2.0    (1 / 0.50)
Break-even ROAS on platform revenue         2.5    (1 / 0.40)
If half the orders would have happened anyway:
  contribution the ads caused               2,000  (4,000 x 0.5)
  profit after ad spend                         0  (2,000 - 2,000)
  ROI                                          0%

The ledger assumes the platform and Shopify agree on the orders, which is what the reconcile step below tests. For illustration, the two break-evens differ: the same campaign breaks even at 2.0 on net sales but 2.5 on platform revenue, because the platform's revenue column is bigger than net sales. Hold a ROAS against the break-even on the same basis.

Which revenue number do you start from?

Three systems, three definitions. Shopify's total sales is "gross sales - discounts - sales reversals + taxes + shipping + fees", so it includes tax, while net sales is "gross sales - discounts - sales reversals". Returns "display as a negative number on the date the return was processed", so a week's net sales is reduced by returns on earlier orders. GA4's purchase revenue is "The sum of revenue from purchases made on your website or app, minus any refunds given." The ad platform counts whatever falls inside its window: Google Ads 30 days after a click by default, and GA4 looks back 90 days for most key events.

Start from Shopify's net sales for the campaign's orders, and write down the dates and the window each number used. Platform revenue is the claim you are testing. Net sales is what you can bank.

Does the ROI say the ads caused the profit?

No. The ledger holds only if the orders the platform credited were caused by the ads, and two peer-reviewed studies say that is the hard part. Across 25 field experiments, "The median confidence interval on return on investment is over 100 percentage points wide" (Lewis and Rao, Quarterly Journal of Economics, 2015). In 15 Facebook experiments, observational methods "often fail to produce the same effects as the randomized experiments" (Gordon et al., Marketing Science, 2019). Treat the ledger's ROI as what the campaign earns if the platform is right, then stress-test it.

How do you check one campaign's ROI this week?

  1. Pick one campaign and whole weeks. Closed weeks only, in one time zone.
  2. Pull spend and platform revenue, and write the platform's window next to them.
  3. Pull the same campaign's orders from Shopify for the same order dates, and read gross sales, discounts and sales reversals. GA4's purchase revenue, which is net of refunds, is a cross-check. The difference between the platform's revenue and Shopify's is the part of the platform's claim your store doesn't show, and the number to watch week to week.
  4. Fill in cost of goods. Shopify's gross profit is narrower than it looks: "Only Net sales with cost recorded are included in your Cost of goods sold report, and count toward your Gross profit". Check the net sales without cost recorded before you trust it.
  5. Compute ROI and the break-even ROAS on the same basis. The break-even ROAS calculator does the division.
  6. Stress-test it. Credit the campaign with half of the contribution and recompute. Half is a stress test, not a measurement. The pass is an ROI still above zero at half credit. The fail is a negative ROI at half credit: treat the campaign as unproven and run a holdout before you scale it.

Sources, 30 September 2026: Finance reports (Shopify Help Center, 2026); Sales report (Shopify Help Center, 2026); Analytics dimensions and metrics (Google Analytics Help, 2026); Select attribution settings (Google Analytics Help, 2026); About conversion windows (Google Ads Help, 2026); The Unfavorable Economics of Measuring the Returns to Advertising (Lewis and Rao, Quarterly Journal of Economics, 2015); A Comparison of Approaches to Advertising Measurement: Evidence from Big Field Experiments at Facebook (Gordon, Zettelmeyer, Bhargava and Chapsky, Marketing Science, 2019).

Frequently asked questions

  • How do you calculate ROI on ad spend?
    Take net sales from the campaign's orders, subtract cost of goods, fees and shipping to get contribution, subtract the ad spend, and divide by the ad spend. ROAS alone skips every cost except the ad spend.
  • What is break-even ROAS?
    The ROAS at which ROI is zero: one divided by your contribution margin, on the same revenue basis as the ROAS. For example, a 50% margin on net sales breaks even at a ROAS of 2.0, and a 25% margin at 4.0.
  • Does a positive ROI mean the ads caused the profit?
    Not by itself. The ROI assumes the orders the platform credited were caused by the ads. Across 25 field experiments, the median confidence interval on ROI was over 100 percentage points wide (Lewis and Rao, 2015). Stress-test it, and confirm large budgets with a holdout.

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.