In short
- Total revenue ÷ ad spend credits your ads with organic, direct and email sales.
- In our example it read €20 back per €1; the paid channels alone returned €4.
- Use the revenue of the channels your spend landed on, over all of your spend.
- Do the same for cost per order: spend over the paid channels' orders, not every order.
- Google Ads' own conversion value per cost already counts only sales after an ad interaction, by its own rules.
You spent €3,000 on Google Ads last month and the shop took €60,000. Divide one by the other and the ads look superb: €20 back for every €1. It is a quick sum, and it is the one that ends up on a slide.
The trouble is the €60,000. Most of it came from people who found you on Google's free results, typed your address, or clicked a newsletter. The ads did not bring in those sales, but the sum gives the ads credit for them. The return looks high because the business is doing well, not because the ads are.
An example
An invented shop, one month. Revenue and orders come from GA4's Traffic acquisition report, by channel; spend comes from Google Ads.
| GA4 channel | Revenue | Orders | Ad spend |
|---|---|---|---|
| Organic Search | €30,000 | 300 | |
| Direct | €12,000 | 110 | |
| €6,000 | 70 | ||
| Paid Search | €7,000 | 70 | €2,000 |
| Paid Shopping | €5,000 | 50 | €1,000 |
| All channels | €60,000 | 600 | €3,000 |
Two ways to read the same table:
- All revenue ÷ ad spend: €60,000 ÷ €3,000 = €20 back for every €1. Cost per order: €3,000 ÷ 600 = €5.
- Paid channels' revenue ÷ ad spend: (€7,000 + €5,000) ÷ €3,000 = €4 back for every €1. Cost per order: €3,000 ÷ 120 = €25.
Same month, same shop. The first version makes the ads look five times better and each order five times cheaper. In this example, 80% of the revenue came from channels with no ad spend at all.
It also moves for the wrong reasons. If organic search brings in another €10,000 next month and the ads do exactly what they did, the first figure rises to €23.33. If organic search has a bad month and loses €10,000, it falls to €16.67. The paid figure stays at €4 both times, because nothing about the ads changed.
Why it happens
Return on ad spend is meant to be the revenue the ads brought in, divided by what they cost. Google Ads' own help describes a target ROAS the same way: "$5 USD in sales ÷ $1 USD in ad spend". The mistake is in the top half of that sum, the revenue.
Google Ads and GA4 each give you a revenue figure, and they cover different things:
- Google Ads records a conversion only within a set period "after an ad interaction (such as an ad click or video view)", 30 days by default. Its conversion value per cost already leaves out sales with no ad behind them. It has its own blind spots, covered in why Google Ads and GA4 never agree, but crediting organic sales is not one of them.
- GA4 sees every sale, from every channel, and its Traffic acquisition report sorts them by default channel group: Organic Search, Direct, Email, Paid Search, Paid Shopping and so on. For session-scoped dimensions like this one, Google says GA4 uses "the paid and organic channels last click attribution model", so each sale goes to one channel.
The flattering number appears when the two are mixed: the total from GA4, which includes every channel, over the spend from Google Ads, which bought only some of them.
A return on ad spend should only count revenue the ads could have earned. Everything else is the rest of your marketing, and it deserves its own credit.
Where it bites
- Budget decisions. At €20 back per €1, spending more looks like an easy win. At €4 it may still be worth it, but it is a different conversation once the goods are paid for.
- Client reports. A figure that rises when organic search has a good month credits the ads with work done by SEO, content or email.
- Cost per order. Dividing spend by every order makes a paid order look far cheaper than it was: €5 instead of €25 above.
How to get the right number
- In GA4, open Reports > Acquisition > Traffic acquisition, set your dates, and read the Total revenue column by Session default channel group.
- Add up only the channels your ad spend landed on. For Google Ads that means Paid Search for Search campaigns, Paid Shopping for Shopping, Display, Paid Video, and Cross-network for Performance Max and Demand Gen (see where Performance Max shows up in GA4). Leave out Organic Search, Direct, Email, Referral and the other channels you do not pay for.
- Take all of your spend for the same dates, including any campaign you cannot place on a channel. That money was spent, and leaving it out would flatter the result.
- Divide: paid channels' revenue ÷ total spend. For cost per order, total spend ÷ the paid channels' orders.
- Check what else is on those rows. GA4's Paid Search is for "ads on search-engine sites like Bing, Baidu, or Google". If you also run Microsoft Advertising, its sales are on that row, so add its spend too, or the return is flattered again.
- Use the same currency on both sides. A Google Ads account has its own currency, set when the account was created and used for billing. GA4 shows revenue in the property's reporting currency. If the two differ, convert one before dividing.
Even the fairer figure is not proof that the ads caused every sale on those rows. Some people who clicked an ad might have bought anyway. But it is a figure about the ads, which the first one is not.
How Glancely handles it
On Glancely's Revenue page, the "Back per €1" card and the cost per conversion are labelled "On the channels you pay for". Both use only the revenue and conversions of channels that had ad spend. Google Ads spend is put on a GA4 channel by campaign type, and spend on a campaign type Glancely cannot place stays in the total spent. Above the channel table, the page says what share of your revenue came from channels you don't pay for. If the ad account and the GA4 property use different currencies, the return is not shown.
Kosmas Botsis · Founder of Glancely
Kosmas Botsis is the founder and lead data engineer of KB Analytics, an analytics engineering practice in Athens working with clients across Europe and the US: more than 250 projects for over 194 clients, and in Toptal's top 3% of talent. Glancely is what came out of that work.
About Kosmas at KB AnalyticsMore from the blog
- Why your Google Ads campaigns don't line up with GA4's
Put Google Ads spend beside GA4 revenue by campaign and half the rows often come back empty, because the join is on a name and the names don't agree. Here is where GA4's campaign name comes from, and how to match them without hiding your best campaign.
- Where Performance Max shows up in GA4
GA4 files Performance Max visits under a channel called Cross-network, not Paid Search or Paid Shopping. Put its spend anywhere else and every channel's return is wrong; here is where it belongs and how to read it.
- Why averaging daily rates gives you the wrong number
Average a week of daily click-through rates and you get a number for the week that is almost always wrong. Rates can't be averaged; they have to be worked out again from the totals. Here is why, and how.