ROAS, MER and cost per purchase in Meta ads: what each number measures and which to trust
How Meta's ROAS differs from MER based on shop revenue, how cost per purchase is counted, and how to read them in Campaigns and Creatives without double counting.
On this page
ROAS, MER and cost per purchase are the three numbers a shop owner uses to judge Meta ads. They sound alike but count different things: ROAS and cost per purchase rest on purchases Meta credited to ads, MER on the shop's entire sales. This article explains each with a simple example, shows where to find them in Basketly and says honestly what none of them proves.
What is ROAS?
ROAS (return on ad spend) is the value of purchases credited to ads divided by spend. A ROAS of 3 means that for every unit spent on Meta, Meta credited 3 units of sales to the ads. The key word is “credited”: Meta reports purchases and their value under its own attribution rules.
Attribution is the rule that decides which ad a purchase “belongs” to. Meta counts a purchase if the shopper clicked or saw an ad within a certain time window before buying. That is useful because it lets you compare campaigns with each other. But it is not proof the purchase would not have happened without the ad: the shopper might have come anyway from search or a newsletter.
In Basketly ROAS is purchase value (Meta) divided by spend, in the ad account's currency.
What is cost per purchase?
Cost per purchase is spend divided by the number of purchases Meta credited to ads. It says how much one purchase cost on average according to Meta. With products at similar prices it compares campaigns well; with very different basket sizes ROAS is better, because it accounts for the order value.
When the period has no purchase at all, Basketly shows “—”, not zero or infinity. Dividing by zero says nothing and should not pretend to be a result.
What is MER and how does it differ from ROAS?
MER (marketing efficiency ratio) is the shop's whole revenue for the period divided by spend. On the Meta tab of Campaigns the divisor is Meta spend; MER over every channel is covered below. It does not ask which purchase came from an ad. It takes every paid order from every source and sets it against what you spent. So it tells you how much the shop sold for each unit of advertising.
An example with made-up numbers, for illustration only:
| Number | Value in the example | How it is counted |
|---|---|---|
| Meta spend | Value in the example10,000 | How it is countedfrom Meta's report |
| Purchases (Meta) | Value in the example40 | How it is countedcredited to ads by Meta |
| Purchase value (Meta) | Value in the example16,000 | How it is countedcredited to ads by Meta |
| Cost per purchase | Value in the example250 | How it is counted10,000 / 40 |
| ROAS | Value in the example1.6 | How it is counted16,000 / 10,000 |
| Shop revenue | Value in the example45,000 | How it is countedevery paid order of the period |
| MER | Value in the example4.5 | How it is counted45,000 / 10,000 |
A ROAS of 1.6 may look weak and a MER of 4.5 strong. Both are true and say different things. The 29,000 gap is sales Meta did not credit to itself: returning customers, search, newsletters, comparison sites, but also some shoppers who saw an ad and bought later another way. Which part is the ads' “doing” is something none of these numbers tells you.
How to use both:
- ROAS compares campaigns, ad sets and ads with each other, because each row has its own purchases.
- MER shows the health of the whole. If budget grows and MER falls for several weeks, the extra spend is not turning into shop sales.
What about MER over every channel?
When you advertise beyond Meta, MER counted on Meta spend alone flatters the result: Google Ads, TikTok or a newsletter bring shop revenue too. That is why Reports and the "All channels" tab of Campaigns show MER (blended): shop revenue divided by the spend of every connected ad channel (Meta, Google Ads, Microsoft Ads, TikTok, Pinterest) plus costs outside ad platforms typed in by hand, such as comparison sites, the e-mail tool or an agency. Meta's own MER stays in the Meta row of the Channels table.
In the example above, if next to 10,000 on Meta you spent 3,000 on Google Ads and paid a comparison site 2,000, MER (blended) is 45,000 / 15,000 = 3. In the Channels table each channel also has its own conversions as its platform reports them and the orders of the last click Basketly read. Conversions of different platforms are never added up, because their attribution windows overlap.
How does Basketly count Meta purchases without double counting?
Meta reports the same purchase under several action types at once. Basketly takes one type from each report row, the first available in this order: purchases across all channels (omni_purchase), the Pixel or Conversions API purchase, the generic purchase. It never adds them up, because the sum would count one purchase two or three times.
Purchase value comes from the same action type, in the ad account's currency. Purchases are read from Meta's report together with spend, so they refresh on the same schedule.
How does Meta know about purchases in the first place? From the Pixel in the shop and from the Conversions API, i.e. purchases sent from the server. Whether your purchases actually reach Meta is covered in the article on the purchase balance.
How it looks in Basketly
Everything is in Analytics → Campaigns, on the Meta tab (the page opens on "All channels" with the totals of every platform). When Meta reports purchases or the shop has orders in the period, sales tiles appear at the top: Purchases (Meta) with cost per purchase, Purchase value (Meta) with ROAS and, for the whole account, Shop revenue with the order count and MER.
Details worth knowing:
- The period is 7, 30 or 90 days or a custom range up to 366 days, compared with the previous period of the same length. When the period ends today, spend, purchases and ROAS are compared without today in both periods (Meta reports them per whole day).
- Shop revenue is bought, not cancelled orders placed in the period, from every source, in the same currency as the ad account. How to read orders is covered in the article on shop orders.
- A campaign or ad set filter hides shop revenue and MER, because one campaign's share of the shop's sales is unknown.
- The table Campaigns / Ad sets / Ads shows status, optimisation goal, spend, purchases (Meta), cost per purchase, ROAS and Basketly orders (from the last click Basketly read) by default, with a totals row. “Columns” adds purchase value, CPC, CPM, CTR, impressions or video rates, lets you drag them into order and save the layout as a view; you can also define a custom column with a formula (e.g.
baskety_revenue / spend). The CSV export carries the visible columns. - Currencies are not converted on the Meta tab: each account currency gets its own tile set.
- “Show products” on a campaign or ad lists the catalogue-ad products with impressions, clicks, spend and the product's shop sales (not attributed). More in the article on products not shown.
In Analytics → Creatives (Meta tab) the main metric is cost per purchase as Meta reports it. The ranking of best creatives, the fatigue signal and the format comparison follow it, and the totals show spend, purchases, cost per purchase, ROAS, CTR and hook rate. How to read video metrics next to cost per purchase is covered in the article on hook rate and hold rate.
The same numbers, week on week, arrive in the Monday sales report e-mail. More about the page: Campaigns.
Which number should you trust when deciding on budget?
None on its own. ROAS and cost per purchase are fit for comparing campaigns with each other, because they are counted the same way for every row. MER is fit for judging the whole, because it does not depend on attribution. A budget decision should take both sides: which campaign looks best according to Meta, and whether the whole shop sells more when you spend more.
A few practical rules:
- Compare within the same period and currency. A week with a sale and a week without are two different worlds.
- Watch the MER trend, not one day. Single days jump with big orders and paydays.
- Do not add up campaign ROAS to get account ROAS. ROAS is a ratio, so for the whole count it from total value and total spend; Basketly does this in the tiles.
- Low ROAS with high MER is a reason to check, not to switch off. A campaign may bring shoppers who buy later another way. Without a test you cannot settle it.
Limits
- ROAS is Meta's attribution, not proof. Purchases credited to ads depend on Meta's attribution settings and do not tell you how much you would sell without ads.
- MER has no attribution. It also rises when sales grow for other reasons (season, newsletter, search). Do not credit the whole increase to Meta.
- MER for the whole account only. It cannot be counted honestly for a campaign, ad set or ad.
- MER on the Meta tab counts Meta spend only. Other paid channels (Google Ads, Microsoft Ads, TikTok, Pinterest) and costs outside ad platforms are in the divisor of MER (blended) in Reports and in Campaigns → All channels.
- No purchases per product from Meta. In “Show products”, sales are shop orders, not purchases from the ad.
- Older reads. Spend rows read before Basketly started reading purchases show 0 purchases until the next read.
- An accepted send is not optimisation. Purchases reaching Meta do not prove a campaign optimises on them; you check the optimisation goal in Ads Manager.
Next step
Open Campaigns, set the period to 30 days and note three numbers: ROAS, cost per purchase and MER. In a week compare them with the next 7 days in the sales report. If Meta shows clearly fewer purchases than paid orders, start with the purchase balance.
About the author
Aleksander
Founder of Basketly.io, BooksyAudit.pl and SMSPortal.app
Founded Basketly.io, BooksyAudit.pl and SMSPortal.app. In the knowledge base he explains how to send shop purchases to Meta, how to keep a product catalogue in shape and how to measure what a purchase from ads costs.
All articles by the authorFrequently asked questions
What is the difference between ROAS and MER?
ROAS counts only the purchases Meta credited to ads under its attribution. MER takes the shop's whole revenue for the period, from every source, and divides it by Meta spend. ROAS says what Meta credits to itself; MER says how much the shop sold per unit of spend.
Why do I not see MER on a campaign?
Because nobody knows what share of the shop's sales belongs to one campaign. Shop revenue and MER are shown for the whole account only; with a campaign or ad set filter they disappear, so as not to fake an attribution that does not exist.
Does Meta count a purchase twice when it comes from the Pixel and the Conversions API?
Meta reports the same purchase under several action types. Basketly takes one type from each report row, the first available of: omni_purchase, the Pixel or Conversions API purchase, then the generic purchase. It never adds them up.
Does Basketly convert currencies?
Not on the Meta tab: each ad account currency gets its own set of tiles, and ROAS and MER are counted in one currency only. Total spend and MER (blended) in Reports and in Campaigns → All channels take spend in another currency only when the owner or an admin switches on conversion by the NBP average rate of the spend day; otherwise it stays apart.
When do Creatives rank by cost per purchase?
Always. Creatives are compared on cost per purchase as Meta reports it, and the ranking, the fatigue signal and the format comparison follow it. A creative without purchases in the period shows “—” as its cost, never 0.