Magento Campaign ROI: Connecting Ads, Orders and Profit

Magento campaign ROI is the profit a campaign makes after ad spend, product costs, shipping, discounts and refunds - not its ROAS. Return on ad spend only measures revenue per pound of advertising, so a headline 6x ROAS can still lose money on thin-margin or return-prone products. To judge a campaign properly you connect three things that live apart: ad spend, orders and margins from Magento, and refunds.
Why ROAS alone is not enough
ROAS is revenue divided by ad spend. It's the number every ad platform shows you because it's the number that makes the platform look good, and it ignores everything that happens to an order after the click. A 5x ROAS sounds like £5 back for every £1 spent, but that £5 is revenue - before you've paid for the product, the shipping, the payment fee, or accounted for the third of orders that come back.
The trap is that ROAS and profit can point in opposite directions. A campaign pushing discounted, low-margin bestsellers can post a gorgeous ROAS and lose money on every order. A campaign selling full-price, high-margin products at a more modest ROAS can be the most profitable thing you run. Optimise on ROAS and you'll pour budget into the one that's quietly bleeding.
Two campaigns that flip when you measure profit
Here's the same two campaigns judged two ways. Both spent £1,000.
| Campaign A (high ROAS) | Campaign B (lower ROAS) | |
|---|---|---|
| Ad spend | £1,000 | £1,000 |
| Revenue | £6,000 | £3,500 |
| ROAS | 6.0x | 3.5x |
| Product margin | 18% (discounted bestsellers) | 45% (full-price range) |
| Gross margin £ | £1,080 | £1,575 |
| Refunds | £900 (15% return rate) | £175 (5%) |
| Shipping and fees | £420 | £210 |
| Net profit after ad spend | −£340 | +£690 |
On ROAS, Campaign A wins six to three-and-a-half and gets the budget increase. On profit, Campaign A lost £340 and Campaign B made £690. The ranking doesn't just narrow, it inverts. This is the single most common way ecommerce ad budgets get misallocated: the winning campaign on the dashboard is the losing campaign in the bank.

What you need to connect ads, orders and profit
True campaign ROI needs three data sources joined up. Each lives somewhere different, which is why most stores never join them.
- Ad spend, per campaign. From Google Ads, Meta and wherever else you buy. This is the denominator, and it has to be current - a campaign's ROI changes every time spend does.
- Orders attributed to the campaign. This is the join, and it's the hard part. You need to know which orders came from which campaign, which means UTM parameters captured at the click and carried through to the order.
- Real profit on those orders. Product margin, shipping, fees and refunds - the same per-order profit that keeps revenue reporting truthful, now grouped by campaign.
Miss any one and you're back to ROAS. Miss attribution and you can't group orders by campaign at all. Miss profit and you're grouping revenue, which is the mistake we started with.

How UTM tracking connects a click to an order
UTM parameters are the tags you add to a campaign's links (utm_source, utm_medium, utm_campaign) so you can tell where a visitor came from. The mechanism is simple: the customer clicks a tagged link, the parameters are captured and stored (usually in a cookie), and when they order, those values are attached to the order so you know which campaign earned it.
Two things break this in practice. First, tags have to be consistent - "facebook", "Facebook" and "fb" are three different sources to a report, so a naming convention isn't optional. Second, the captured campaign has to actually reach the order record; many analytics setups send UTMs to the analytics tool but never write them to the order in the store, so you can see the click in one system and the order in another with no line between them. That gap is why campaign profit is so rarely calculated - the profit lives in Magento and the campaign lives in analytics, and nothing joins them.
Attribution caveats worth knowing
Before anyone treats a campaign-profit figure as gospel, three caveats:
- Last-click over-credits the closer. Attaching an order to the last campaign clicked ignores the campaigns that introduced the customer weeks earlier. It's the simplest model and the easiest to act on, but it flatters bottom-of-funnel and starves awareness.
- Repeat purchases muddy the first campaign. A customer acquired by an expensive campaign who then buys full-price for two years is far more valuable than the first order's ROI suggests. Campaign ROI on the first order alone undervalues acquisition.
- Cross-device and privacy gaps lose clicks. Someone who clicks on mobile and buys on desktop, or blocks tracking, breaks the chain. No attribution is complete, so treat campaign profit as directional - good enough to reallocate budget, not accurate to the penny.
A campaign scorecard
A scorecard forces every campaign onto the same set of columns, so ROAS sits next to the numbers that qualify it. The columns that matter:
| Column | What it tells you |
|---|---|
| Ad spend | The cost side, current |
| Revenue | The headline, kept in context |
| ROAS | Useful as a first filter, not a verdict |
| Product margin % | Whether that revenue is worth anything |
| Refund rate | How much of it comes back |
| Net profit after ad spend | The actual verdict |
| Profit per order | Efficiency, comparable across campaigns |

How this applies to Magento 2
Magento 2 doesn't connect any of this on its own. It records orders but not the campaign that earned them - there's no UTM field on an order, no ad-spend data, and no profit figure, so there's nothing to group and nothing to divide by. A connected Google Analytics property sits on the other side with campaign data but no product costs, so it can show revenue per campaign and never profit. As of Magento 2.4.9, connecting spend, orders and profit is a join you have to build or add.
A tracking layer that pushes ecommerce events and UTMs to GA4 - which is what a module like AnalyticsEasy does - gets you clean campaign attribution and revenue-per-campaign in Google's tools. That's the attribution half solved. What it deliberately doesn't do is carry product cost or margin, because GA4 has no concept of what a product cost you; the profit half has to come from Magento.
Where Moogento helps
Connecting the two halves is where Pulse earns its place. It syncs Google Ads spend and lines it up against order data on a campaign analytics view, and when ProfitEasy is installed it pulls in real per-order profit - so a campaign's return is measured against margin after costs and refunds, not just revenue. That's the ROAS-to-profit jump the ad platform can't make for you, because it never sees your costs. Pulse also classifies campaigns by return so the loss-makers stand out rather than hiding behind a healthy ROAS.
ProfitEasy is doing the quiet work underneath: it tags each order with an acquisition source and calculates the profit on it, so "orders from this campaign" and "profit on those orders" are the same records rather than two systems you're trying to reconcile in a spreadsheet. Get product costs populated, keep your UTM tagging consistent, and the campaign scorecard above stops being a manual export and becomes something you can actually read each week.
Campaign ROI audit checklist
- For your top campaign by ROAS, can you state its net profit after margins and refunds? If not, you're flying on ROAS.
- Do your orders record which campaign earned them, or does that data stop at analytics?
- Is your UTM tagging consistent, or do "facebook", "Facebook" and "fb" all appear?
- Do you know the product margin on what each campaign actually sells?
- Are refunds subtracted from campaign performance, or ignored?
- Which attribution model are you using, and does everyone know it's last-click?
- Would a high-ROAS, negative-profit campaign be visible to you, or would it keep getting budget?
FAQ
What's the difference between ROAS and campaign profit?
ROAS is revenue divided by ad spend - a gross figure that ignores what the products cost, what shipping and fees took, and what came back as refunds. Campaign profit subtracts all of those, plus the ad spend, to show what the campaign actually made. A high ROAS with thin margins and heavy returns can still be a loss, which is why profit is the real verdict.
How do I track which campaign an order came from in Magento?
Through UTM parameters captured at the click and carried to the order. Magento doesn't do this natively - the campaign data typically stops at your analytics tool and never reaches the order record. You need a tracking layer that captures UTMs and a way to attach the source to the order, so campaign and profit sit on the same data.
Is a high ROAS always good?
No. ROAS only measures revenue against ad spend, so a campaign selling discounted, low-margin or return-prone products can post a strong ROAS and lose money once real costs land. Use ROAS as a quick first filter, then judge on net profit after margins, shipping, fees and refunds before you scale a campaign's budget.
What ROAS do I need to break even?
It depends entirely on your margin, so there's no universal number. Roughly, break-even ROAS is one divided by your gross margin - a 25% margin needs about a 4x ROAS just to cover the product and the ad, before shipping and refunds. That's why "good ROAS" is meaningless without knowing the margin behind it.
Start by pulling your highest-ROAS campaign and working out its real profit after margins and refunds. If the number surprises you, your budget is probably being allocated by the wrong metric.



