Return on ad spend — ROAS — is the simplest ratio in marketing: what a campaign brought in, divided by what it cost to run.
The formula is never the problem. The problem starts when there's more than one channel, because that's when both numbers stop being obvious. The full definition and calculation are on the ROAS and ad spend page; this article covers the multi-channel case, which is the real-world case.
The division, to fix the vocabulary
ROAS = revenue attributed to the campaign ÷ campaign distribution spend
A ROAS of 3 means three dollars earned for every dollar spent. You can also write it as a percentage — 300% — without anything changing.
Two neighbors worth keeping distinct:
| What you're calculating | The formula | What it answers |
|---|
| ROAS | revenue ÷ ad spend | Does my distribution earn more than it costs? |
| ROI | (gain − total cost) ÷ total cost | Is the whole operation profitable, all in? |
| Break-even ROAS | 1 ÷ margin rate | At what ROAS do I start making money? |
The third line is the one people forget, and it's the only one that decides anything. A ROAS of 3 is excellent at 60% margin and ruinous at 25%. Our free calculator places the break-even point next to the result, with a margin slider — and it requires no sign-up, because a division isn't something you pay for.
The first leak: the spend that belongs nowhere
The denominator seems like the safer of the two: the invoice exists, it's down to the cent. Except that distribution spend isn't always an ad invoice.
- Production time. Three hours of editing for a reel doesn't appear on any ad invoice. That's not distribution spend, so it's not ROAS — it's ROI. Mixing the two makes organic social look infinitely profitable, since its denominator is zero.
- Costs that live elsewhere. An email platform subscription, a scheduling tool, an affiliate commission. Affiliate commissions especially are real distribution spend: they belong in the denominator of the affiliate channel, otherwise that channel shows an infinite ROAS.
- Ad account spend that was never imported. The most common and most costly case: a campaign is running, it's selling, and its spend is nowhere in the table. The overall ROAS goes up for a purely bookkeeping reason.
Hence a simple rule: a channel with no known spend has no ROAS. It has revenue. Showing a dash is honest; showing a false number isn't visible as such.
The second leak: revenue counted twice
The numerator is the real trap in multi-channel setups. A sale almost always has multiple touchpoints before it. If each channel claims the full sale, the sum of revenue by channel will far exceed actual revenue — and all the ROAS figures are inflated at the same time.
This is exactly what ad platforms do to each other: each measures in its own silo, each claims the conversion, and adding up the reports produces a revenue figure that accounting doesn't recognize. The mechanism has a name — deduplication — and there are only two ways out.
Either you pick a model and stick with it. First click, last click, or linear: each sale is shared exactly once, and the sum of the shares equals the amount collected. The choice of model changes the channel rankings, not the total. The attribution article details what each model answers and where each goes wrong.
Or you calculate a global ROAS across the entire setup, and give up comparing channels against each other. That's less flattering, and sometimes it's the only honest thing you can say about a small volume.
What you should not do is add up revenues from overlapping sources. The number you get doesn't correspond to anything.
Unattributed revenue is not an error
On any honest setup, some revenue isn't tied to any click: word of mouth, branded search, a customer coming back six months later. That's unattributed revenue, and it needs to appear in the table.
The instinct is to redistribute it "proportionally" to make things look tidy. That's exactly what you shouldn't do: it inflates every channel with an invented amount, and their ROAS with it. A gap is visible and discussable; a smoothed number isn't.
The currency trap, which doesn't forgive
This one is costly because it doesn't look like an error. An ad account billed in dollars, revenue collected in euros: the division produces a perfectly plausible number, with a decimal and everything needed to copy into a presentation.
That's not a ROAS. In our data model, an ad account's currency is pulled from the platform and never converted: when it doesn't match the currency of the sales, the ratio stays blank rather than approximate. The exchange rate on the day of spend is not the rate on the day of the sale, and nobody knows which one to use.
Another calendar detail, less well known: a platform adjusts its numbers after the fact. Importing yesterday's spend once locks in a figure that isn't the final figure. That's why our imports pull a rolling window of several days on each cycle, not just the previous day.
The method, channel by channel
| Channel | Spend in the denominator | What to watch |
|---|
| Paid ads | platform spend, re-imported | currency, and post-run adjustments |
| Newsletter | sending tool subscription | no per-send ROAS if the subscription is monthly |
| Organic social | no distribution spend | ROI rather than ROAS |
| Affiliate | commission paid | a missed commission gives an infinite ROAS |
| Influencer | fee, or value of gifted product | an untracked touchpoint falls to "unattributed" |
The right column says the same thing five times: ROAS breaks at the denominator.
Where to start, concretely
- One link per placement, so revenue is attributable before you even talk about spend.
- Import the spend from each platform, keeping its original currency. A channel with no imported spend doesn't belong in the ROAS table.
- Choose an [attribution model](/lexique/modele-d-attribution) and keep it for the entire comparison period. Switching models mid-month makes the report incomparable to the previous one.
- Show unattributed revenue on its own line, without redistributing it.
- Set your break-even point before commenting on a ROAS. Without margin, the number says nothing.
Questions that come up
"My channel-level ROAS doesn't add up to my overall ROAS — why?" Because the sum of channel revenues exceeds actual revenue: multiple channels are claiming the same sales. That's a sign that no sharing model is applied, or that two tools are measuring in parallel.
"What ROAS should I aim for?" Whatever exceeds your break-even ROAS, and nothing else. A universal target doesn't exist: it depends entirely on your margin, and a retail margin is not a services margin.
"Should I include tax?" Stay consistent throughout: revenue ex-tax and spend ex-tax, or both with tax. Mixing the two shifts the result by twenty percent without warning.
"Over what period should I calculate?" At least one full purchase cycle, with an attribution window calibrated to that cycle. A window that's too short cuts off late sales and drops the ROAS of discovery channels. The click lifespan article explains that setting.
"What about for a client I need to convince?" Show the spend, the attributed revenue, the unattributed amount, and the break-even point on the same screen. The client report is built for that, and the monthly report article explains why a spreadsheet convinces nobody.
The full method, with imported spend side by side with campaign revenue, is detailed on ROAS and ad spend. For a store, the e-commerce page shows the same calculation with orders; for an agency managing multiple accounts, it's here.