In this article · 11 sections
- What ROAS is and how to calculate it
- ROAS vs ROI: what is the difference
- How to calculate break-even ROAS for your margin
- What is a good ROAS
- Why ROAS in Meta differs from the sales in your store
- How to get your real ROAS from the orders in CloudCart
- ROAS by channel: Meta, Google, TikTok and email
- How to raise ROAS without raising your budget
- How an AI agent calculates ROAS for you
- Mistakes that make ads lose money
- Frequently asked questions
In short: ROAS (return on ad spend) is the revenue your ads bring in divided by what you spent on them. €2,500 of revenue from €1,000 of ads is a ROAS of 2.5. A good ROAS is any ROAS above your break-even ROAS, which is 1 ÷ contribution margin. With a 35% margin on VAT-inclusive revenue, ads only make money above a ROAS of 2.86, so a ROAS of 2.5 loses money.
This guide is for store owners in Europe who run ads on Meta, Google or TikTok: the formulas, break-even ROAS with VAT and shipping, how it changes between EU countries, why Ads Manager shows more sales than your store, and how to get real ROAS from your CloudCart orders. CloudCart facts come from the platform documentation and the pricing page.
What ROAS is and how to calculate it
ROAS is the revenue your advertising generated divided by the money you spent on it. The formula is ROAS = ad revenue ÷ ad spend. You will see it written as a number (4), a ratio (4:1) or a percentage (400%). All three mean the same thing: every €1 of ads brought back €4 in sales.
Google Ads uses the percentage. The Target ROAS bid strategy takes a value such as 500%, and Google adjusts your bids in each auction to get as close to that target as it can (Google Ads Help: about Target ROAS bidding). Meta shows the number as "Website purchase ROAS" in Ads Manager, calculated from the purchase value its pixel reported.
A worked example
A cosmetics store spends €1,000 on Meta ads in October. Ads Manager reports 42 purchases worth €2,520, so ROAS is 2.52. Whether the store made money depends on the margin.
ROAS vs ROI: what is the difference
ROAS measures revenue; ROI measures profit. ROI (return on investment) is (contribution margin − ad spend) ÷ ad spend × 100%.
In the cosmetics example, the 42 orders bring €21 of contribution margin each, €882 in total. ROI is (882 − 1,000) ÷ 1,000 = −11.8%. The same campaign has a ROAS of 2.52 and a negative ROI. That is why ROAS is the number you steer campaigns by day to day, while ROI answers whether the advertising was worth it at all.
| Metric | Formula | What it tells you |
|---|---|---|
| ROAS | Ad revenue ÷ ad spend | How much revenue €1 of ads brings back |
| ROI | (Contribution margin − spend) ÷ spend × 100% | How much profit €1 of ads brings back |
| Break-even ROAS | 1 ÷ contribution margin | The ROAS below which ads lose money |
| CPA (cost per purchase) | Ad spend ÷ number of purchases | What one order costs you in ads |
| MER (marketing efficiency ratio, or blended ROAS) | Total store revenue ÷ total ad spend | Whether advertising as a whole lifts sales |
CAC (customer acquisition cost) is close to CPA but counts only new buyers. How to calculate it together with LTV is in the guide to the 10 KPIs of an online store.
How to calculate break-even ROAS for your margin
Break-even ROAS is the ROAS at which your ads bring back exactly as much margin as they cost. The formula is break-even ROAS = 1 ÷ contribution margin, and the margin has to be calculated against the same revenue the ad platform reports. The most common mistake is using product margin (selling price minus cost price) without taking out VAT, shipping and fees.
Contribution margin is what is left of an order after you pay for everything that order created: VAT, the goods, packaging, the shipping you cover, the payment fee and average returns. Every EU country sets its own VAT rates, and the standard rate cannot be lower than 15% (European Commission: VAT rates). The Meta pixel sends the order value as it appears in your store, so if your prices include VAT, the ROAS in Ads Manager includes VAT too.
- Average order value, VAT included. Take it from your store's analytics, for example €60.
- Take out VAT. At a 20% rate: €60 ÷ 1.2 = €50 of revenue before VAT.
- Take out the goods. Cost price of €25 per order. €25 is left.
- Take out the shipping and packaging you pay for. €4 per order. €21 is left.
- Take out the payment fee and returns. With CloudCart Pay the transaction fee is 0% through Dec 31, 2026. If returns cost you on average 2% of revenue, take that out too. Here it is €0 to keep things simple. €21 is left.
- Divide by the revenue the ad platform sees. €21 ÷ €60 = a 35% contribution margin on VAT-inclusive revenue.
- Calculate the threshold. 1 ÷ 0.35 = 2.86. Below a ROAS of 2.86 in Ads Manager, every order from your ads costs you money.
The same number gives you your maximum cost per purchase: €21. If one order from your ads costs more than €21, you lose. With a 50% product margin instead, you would treat a ROAS of 2 as break-even and lose €9 on every order.
Important: compare ROAS and margin on the same basis. If the revenue in the report includes VAT, the margin must also be calculated on VAT-inclusive revenue. In CloudCart's Analytics dashboard, the order total excludes shipping but includes VAT and product discounts.
Selling to other EU countries: one break-even per VAT rate
Once your distance sales to consumers in other EU countries pass €10,000 a year, you charge VAT at the rate of the customer's country and can declare it all through the One-Stop Shop (OSS), under the rules that apply since July 1, 2021 (Your Europe: cross-border VAT). If your shelf price stays the same, a higher VAT rate leaves you less margin, and your break-even ROAS goes up.
| VAT rate in the customer's country | €60 order without VAT | Contribution margin (goods €25, shipping €4) | Break-even ROAS |
|---|---|---|---|
| 17% | €51.28 | €22.28 (37.1%) | 2.69 |
| 20% | €50.00 | €21.00 (35.0%) | 2.86 |
| 21% | €49.59 | €20.59 (34.3%) | 2.91 |
| 23% | €48.78 | €19.78 (33.0%) | 3.03 |
| 25% | €48.00 | €19.00 (31.7%) | 3.16 |
So one ROAS goal across several countries can be profitable in one market and lose money in another. Set a separate target per country, or per store if you run a separate store per country with its own language and currency. How that setup works is in the guide to multilingual, multi-currency and multi-store selling, and the VAT side is in the guide to OSS and EU VAT for cross-border sales.
What is a good ROAS
A good ROAS sits above your break-even ROAS by as much profit as you want from advertising. The formula for target ROAS is 1 ÷ (contribution margin − desired profit as a share of revenue). If you want ads to leave you 10% of revenue as profit at a 35% margin, the target is 1 ÷ 0.25 = 4. Industry averages for a "good ROAS" do not help much, because a furniture store with a 50% margin and an electronics store with a 12% margin have completely different thresholds.
| Contribution margin (on VAT-inclusive revenue) | Break-even ROAS | Target ROAS for 10% profit | Target ROAS in Google Ads |
|---|---|---|---|
| 15% | 6.67 | 20.0 | 2,000% |
| 20% | 5.00 | 10.0 | 1,000% |
| 25% | 4.00 | 6.67 | 667% |
| 30% | 3.33 | 5.00 | 500% |
| 35% | 2.86 | 4.00 | 400% |
| 40% | 2.50 | 3.33 | 333% |
| 50% | 2.00 | 2.50 | 250% |
| 60% | 1.67 | 2.00 | 200% |
The often-quoted "a good ROAS is 4:1" is simply break-even ROAS for a store with a 25% margin. For a store with a 50% margin, the same ROAS of 4 leaves half of the ad revenue as profit.
Retargeting usually clears the target easily, while a new-customer campaign can run near break-even if buyers order again and LTV covers the gap. How to raise average order value, which lowers the threshold, is in the guide to upsell and cross-sell.
Why ROAS in Meta differs from the sales in your store
Ad platforms report more sales than your store because each one credits the order by its own rules. Meta counts purchases within the ad set's attribution setting, which can include people who only saw the ad. Google Ads counts conversions up to 30 days after a click by default, adjustable from 1 to 90 days (Google Ads Help: conversion windows). When a customer saw an ad on Instagram and later clicked one on Google, both platforms can report the same order.
| Cause | What happens | What to do |
|---|---|---|
| Views without a click | Meta counts an order from someone who only saw the ad | Compare click-only attribution in Ads Manager |
| Double counting | Meta, Google and TikTok all report the same order | Check the sum of the platforms against your store's MER |
| Cancelled and returned orders | The pixel counts the purchase at checkout; the store later drops the cancelled order | Count only paid and fulfilled statuses |
| Cookie refusal | A customer who refused advertising cookies is not tracked by Meta | Assume Meta sees less than really happened |
In the EU, storing or reading tracking cookies on a visitor's device needs the visitor's consent under Article 5(3) of the ePrivacy Directive (EUR-Lex: Directive 2002/58/EC, consolidated). In CloudCart, the Meta pixel and the Conversions API stop if the visitor refuses the advertising (Targeting) cookies in the banner, and so do the TikTok events. The Conversions API is not included in the standard plans on the pricing page, where the browser pixel does the work. Setup is in the guide to the Meta Pixel, Conversions API and TikTok Pixel and consent in the guide to GDPR and cookies.
Your store credits each order once, to the first visit in the session. The platform tells you which ads work; the store tells you how much money actually came in.
How to get your real ROAS from the orders in CloudCart
Real ROAS is the revenue from store orders with a given source divided by the spend from the ad account for the same period. In CloudCart, revenue by source is in the Analytics dashboard, and spend is in Meta Ads Manager, Google Ads or TikTok Ads Manager.
- Choose which orders count. In Analytics, open the dashboard settings (the gear at the top right) and keep only paid, completed and fulfilled statuses. Pending orders are selected by default.
- Open the Sales by traffic source (referral) box. It ranks sources by order revenue. In the paid ads group, CloudCart recognises the ad by the click parameter:
fbclidfor Meta Ads,gclidandgad_sourcefor Google Ads (with the network: Search, Display, YouTube, Discover),ttclidfor TikTok Ads. - Compare periods. The details compare each source with the previous period and export to CSV.
- Split by campaign. The Sales by Source / Medium box shows revenue by
utm_sourceandutm_medium, for examplefacebook / cpc, and then byutm_campaign. UTM tracking is part of CC Pro and CC Master according to the pricing page. - Get the spend for the same days. From Ads Manager, Google Ads or TikTok Ads Manager, for the campaigns with the same UTMs.
- Calculate and compare. Store revenue ÷ spend is your real ROAS. Compare it with the break-even ROAS calculated on the Analytics basis: VAT included, shipping excluded.
Both boxes also split orders by device. If an ad brings most visits from phones but few phone orders, fix the mobile checkout before the ad (mobile version guide). UTM setup is in the guide to GA4, Tag Manager and UTM.
ROAS by channel: Meta, Google, TikTok and email
Each channel has its own ROAS report; compare them all against the same threshold, because the margin on an order is the same whichever channel brought it.
| Channel | Where the platform shows ROAS | How CloudCart recognises the order |
|---|---|---|
| Meta (Facebook, Instagram) | Ads Manager, "Website purchase ROAS" | fbclid → Meta Ads; UTM facebook / cpc |
| Google Ads | Google Ads, "Conv. value / cost" | gclid, gad_source → Google Ads by network; UTM google / cpc |
| TikTok | TikTok Ads Manager, ROAS on CompletePayment | ttclid → TikTok Ads; UTM tiktok |
| Email campaigns (Marketing Suite) | Campaign statistics: revenue and conversion | Automatic UTMs: utm_source=cloudcart, the channel and the campaign name |
Email has no cost per click, so its cost is your monthly plan and its ROAS is often high; see the guide to email marketing. Campaign setup is in the guides to Meta Ads, Google Ads and TikTok ads.
How to raise ROAS without raising your budget
You raise ROAS in three ways: a bigger order from the same click, more orders from the same visits, and less spend on clicks that do not buy. The first two happen inside your store and lift the ROAS of every campaign at once.
- Raise average order value. At the same conversion rate, ROAS grows exactly as much as average order value: from €60 to €66 (+10%), the ROAS of 2.52 in the example becomes 2.77. The Bump Cart module shows in the cart how much is left until free shipping or a discount. More ideas are in the guide to upsell and cross-sell.
- Win back abandoned carts. A visitor from an ad who put a product in the cart and left is a click you already paid for. CloudCart sends an email with a link that restores the cart, with a discount code if you choose (abandoned carts). What works is in the guide to abandoned carts.
- Let search find the product. A customer from an ad who searches your store and finds nothing leaves. Aura Search searches by meaning, handles typos and shows products while the customer is still typing, from €9 a month (Aura Search).
- Take products below the threshold out of your ads. A product with a 20% contribution margin has a break-even ROAS of 5 and drags overall ROAS down. The Google Shopping app sends your catalogue to Google Merchant Center, and you can switch syncing on and off for each product. How to set up the feed is in the guide to Google Shopping and Merchant Center.
- Cut by the data. Below break-even for 7 days with dozens of purchases means the campaign loses money; move that budget.
How an AI agent calculates ROAS for you
An AI agent connected to your store calculates real ROAS by campaign from one sentence in plain English. In CloudCart you connect Claude Code, ChatGPT Codex, Gemini CLI, Cursor or VS Code with a personal access token (PAT) from the admin, which gives access to orders, products and customers. Orders keep their UTM source, medium and campaign, so the assistant adds up revenue per channel on its own. Ad spend is not in the store, so you paste a CSV export from Ads Manager.
| Task | The sentence to the agent |
|---|---|
| Real ROAS by campaign | "Here is the Ads Manager export for October. Divide revenue from paid orders with utm_source facebook by spend per campaign and sort from lowest." |
| Break-even ROAS | "Prices include 20% VAT, shipping costs me €4, here are my cost prices. Calculate contribution margin and break-even ROAS." |
| Break-even by country | "Split last month's paid orders by shipping country, apply each country's VAT rate and give me break-even ROAS per country." |
By hand, the check is 6 steps per channel every week, 18 for Meta, Google and TikTok. With the agent it is one sentence, with the same statuses and periods every time. Why running your store through an AI agent pays off is in the guide to what an AI agent saves an online store.
Mistakes that make ads lose money
- One ROAS goal for every country. With OSS each country has its own VAT rate, so the same €60 order leaves a different margin in each market.
- Decisions from Ads Manager alone. The sum of all platforms can come out higher than your store's total revenue.
- Pending orders in revenue. Orders that are never paid or never collected inflate ROAS on paper.
- Mismatched periods. Spend for the whole month and orders for 25 days give a ROAS about 17 to 19% too low.
- Judging too early. 5 purchases do not give a reliable ROAS; wait a week and dozens of purchases.
CloudCart, the ecommerce platform with 0% commission on sales, shows revenue by ad source and by device in the Analytics dashboard, and the AI agent turns it into real ROAS by campaign. Plan prices are on the pricing page (billed annually, excluding VAT: Baby Pack €14, Starter Pack €33, CC Pro €83 and CC Master €249 a month). Create a store for €1 and work out your ad threshold this week. Questions: support@cloudcart.com.
Frequently asked questions
ROAS (return on ad spend) is the revenue from ads divided by what you spent on them. €3,000 of revenue from €1,000 of ads is a ROAS of 3, or 300%. The profit from advertising is measured by ROI.
A good ROAS is above your break-even ROAS, which is 1 ÷ contribution margin. At a 35% margin the threshold is 2.86, and for 10% profit on revenue the target is 4. The often-quoted 4:1 is the break-even point at a 25% margin, so general averages do not apply to your store.
Break-even ROAS is 1 ÷ contribution margin. Contribution margin is the order minus VAT, the goods, the shipping you pay, the payment fee and returns, divided by the revenue the ad platform reports. With a €60 VAT-inclusive order at 20% VAT and €21 of margin, the threshold is 2.86.
Meta can count purchases from people who saw an ad without clicking, and Google and TikTok may report the same order. Your store counts each order once, by the first visit in the session. Check against revenue by source in your store and against MER.
Ad platforms receive the order value as it is in your store, so with VAT-inclusive prices ROAS includes VAT. That is fine as long as your contribution margin is also calculated on VAT-inclusive revenue. If you sell to several EU countries, each VAT rate gives a different margin and a different break-even ROAS.
Revenue by campaign is in Analytics, in the Sales by Source / Medium box, by utm_source, utm_medium and utm_campaign (UTM tracking is in CC Pro and CC Master). Take the spend from your ad account for the same period and divide. An AI assistant connected with a personal access token does the calculation from one sentence.
Sources
- Google Ads Help: about Target ROAS biddingsupport.google.com
- European Commission: VAT ratestaxation-customs.ec.europa.eu
- Your Europe: cross-border VATeuropa.eu
- Google Ads Help: conversion windowssupport.google.com
- EUR-Lex: Directive 2002/58/EC, consolidatedeur-lex.europa.eu
