“Google Ads vs. Meta Ads — same budget, which one is more efficient?” I hear this question almost every week from ecommerce operators. Most of them compare by sessions, and that almost always leads to the wrong answer.
I made the same mistake myself once. Meta Ads was driving 1.5x the sessions of Google Ads, so I shifted budget. End of month, total revenue was down.
The fix was a simple division: revenue ÷ sessions, by channel. The metric is called RPS (Revenue Per Session), and it’s the only number that compares revenue efficiency across ad channels apples-to-apples.
TL;DR
-
RPS = Revenue ÷ Sessions. It’s the only metric that says “how much revenue per visit.” With the relationship
AOV × CVR = RPS, it folds AOV and CVR into one number — the integrated decision axis. - Sessions alone misjudges ad channels. Cheaper sessions ≠ revenue-generating sessions. RPS is the right axis for budget allocation across paid channels.
- AOV-only or CVR-only optimization hits a hidden trap. Raising free-shipping thresholds raises AOV but drops CVR — and RPS goes down. Only RPS reveals “is this initiative actually good for the business?”
Why Sessions-Based Comparison Misjudges Ad Channels
Ad reports lead with sessions. “Meta Ads has 12,000 sessions this month, Google Ads has 8,000. Meta is winning.” This reading is wrong almost every time.

Sessions tells you how many people came. It doesn’t tell you how much revenue they brought. Same $10,000 budget across three channels:
- Google Ads: 8,000 sessions, $9,600 revenue → RPS $1.20
- Meta Ads: 12,000 sessions, $9,600 revenue → RPS $0.80
- TikTok Ads: 20,000 sessions, $8,000 revenue → RPS $0.40
By sessions, TikTok wins handily. By RPS, Google Ads is 3x more efficient than TikTok. The exact opposite conclusion.
The mistake I made was the same shape: Meta Ads was driving more sessions, but the traffic mix had lower average AOV and CVR, so the quality per session was worse. Budget moved in the wrong direction. Ad budget allocation should be judged by RPS, not sessions.
Why AOV-Only and CVR-Only Optimization Hit a Trap
The other strength of RPS is that it folds the interaction between AOV and CVR into a single number.

Take raising the free-shipping threshold from $50 to $80. AOV jumps from $62 to $74 (+19%). Looks great. But customers who were “$20 short of free shipping” drop off, taking CVR from 2.4% to 1.8% (-25%). Net effect: RPS goes from $1.49 to $1.33 (-11%). AOV-only reads as a win. RPS reveals it’s a loss.

The reverse pattern works too. A 3-item, 20%-off bundle: AOV $48 → $52 (+8%), CVR 2.0% → 2.6% (+30%), RPS $0.96 → $1.35 (+41%). When AOV and CVR move together, RPS jumps dramatically.

The shared structure: maximizing a single metric usually sacrifices another. Discounts to lift CVR drag AOV down. Thresholds to lift AOV drag CVR down. When the three metrics move independently, you need RPS as the integrated axis to judge the net effect.
How to Compute RPS in GA4 (and Why It’s Painful)
GA4 has a metric called Average purchase revenue per user, which is conceptually close — but it’s per user, not per session. If one user visits 3 times before purchasing, the per-user view counts that as 1 user with 1 purchase. The per-session view counts 3 sessions with 1 purchase. Ad-channel decisions need the second one.
To get session-level RPS in GA4, you need an Exploration with a custom calculation: “Total revenue (purchase) ÷ Sessions” — and the denominator must include sessions that didn’t purchase. Standard reports won’t surface this directly, which is where most operators get stuck.
The cleaner approach is to join sales data and session logs in your data warehouse and compute it in SQL:
SELECT
channel,
SUM(revenue) / COUNT(DISTINCT session_id) AS rps
FROM
sessions s
LEFT JOIN
orders o ON s.session_id = o.session_id
GROUP BY
channel
One query, channel-level RPS. The real value of RPS comes from channel comparison, so you want an environment that can produce this granularity.
The “Sessions × RPS” Worldview
Once RPS is in place, ecommerce decision-making collapses into a simple equation:
Revenue = Sessions × RPS
Every initiative ultimately moves one of these two axes:
- SEO and paid ads → move sessions
- Thresholds and bundles → move RPS via AOV
- UX and LP optimization → move RPS via CVR
Operators with reliable RPS measurement can judge any initiative across two axes — “did sessions grow?” and “did RPS move?” — and ad investment, channel selection, and LP optimization priorities all become genuinely data-driven.
I’ve been building RevenueScope on this exact premise: open the dashboard and channel-level RPS is right there, so the next budget decision lands in under a minute.
What’s your current RPS by channel? If your dashboard shows sessions but not RPS, the channels you’re scaling might not be the channels that drive revenue. Curious to hear from anyone who’s flipped from sessions-comparison to RPS-comparison — what changed?
