Metric · Marketing

What is ROAS, and how do you measure it in Metabase?

ROAS — return on ad spend — is conversion value divided by ad spend, per campaign, channel, or period. It's the efficiency read for paid media:CAC tells you what a customer costs, ROAS tells you what a dollar of ads brings back. Measure it in Metabase from daily performance data synced from Google Ads, Meta Ads, and the rest of your paid stack.

TL;DRconversion_value ÷ spend, segmented by campaign objective. Platform-reported ROAS is directional, not truth: every platform attributes under its own model. Breakeven depends on your margin, not a universal 4x.

What ROAS measures

It measures how much conversion value a unit of spend generates, which makes it the day-to-day steering metric for budget allocation within a channel. It does not measure profit — a 5x ROAS on a 15% margin product loses money — and it does not measure incrementality, because the platform reporting the number also grades its own homework. Segment it by campaign objective: prospecting, retargeting, and brand campaigns play different roles and should be judged against different bars.

ROAS vs. MER

Per-platform ROAS answers "which campaign should get the next dollar?" Blended MER — total revenue ÷ total marketing spend — answers "is the whole program working?" Because each platform self-reports conversions under its own attribution window, summed platform ROAS routinely exceeds what your revenue table can support. The fix isn't picking a winner; it's charting both and treating a widening gap as the signal that platforms are double-claiming conversions.

What data does it need?

  • An ad_performance_daily table with campaign_name, channel, stat_date, spend, and conversion_value, unioned across platforms.
  • An orders (or revenue) table for the blended MER comparison — the one number no ad platform can inflate.

SQL patterns

ROAS by campaign by weekPostgreSQL
SELECT
  campaign_name,
  date_trunc('week', stat_date) AS week,
  SUM(spend) AS spend,
  SUM(conversion_value) AS conversion_value,
  ROUND(SUM(conversion_value) / NULLIF(SUM(spend), 0), 2) AS roas
FROM ad_performance_daily
WHERE stat_date >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY 1, 2
ORDER BY 2, 1;
Channel ROAS vs. blended MER by monthPostgreSQL
WITH channel_spend AS (
  SELECT
    channel,
    date_trunc('month', stat_date) AS month,
    SUM(spend) AS spend,
    SUM(conversion_value) AS platform_conversion_value
  FROM ad_performance_daily
  GROUP BY 1, 2
),
blended_revenue AS (
  SELECT
    date_trunc('month', order_date) AS month,
    SUM(order_total) AS revenue
  FROM orders
  GROUP BY 1
)
SELECT
  c.month,
  c.channel,
  ROUND(c.platform_conversion_value / NULLIF(c.spend, 0), 2)
    AS platform_roas,
  ROUND(
    r.revenue / NULLIF(SUM(c.spend) OVER (PARTITION BY c.month), 0),
    2
  ) AS blended_mer
FROM channel_spend c
JOIN blended_revenue r ON r.month = c.month
ORDER BY 1, 2;

Pitfalls

Summing platform-reported conversions across platforms.→ Google, Meta, and TikTok each attribute under their own model, so the same order gets counted twice or three times. Cross-channel ROAS from platform numbers is directional at best — anchor totals to your revenue table.
Ranking awareness campaigns against retargeting.→ Retargeting harvests demand prospecting created, so it always "wins" on ROAS. Compare campaigns within the same objective, or the budget quietly migrates to the bottom of the funnel until there's nothing left to retarget.
Ignoring margin.→ Revenue ROAS treats a 15%-margin sale like a 70%-margin one. Compute breakeven as 1 ÷ gross margin per product line, or better, put gross profit in the numerator and rank campaigns on profit ROAS.
Presenting one attribution window as truth.→ A 7-day-click ROAS and a 1-day-click ROAS of the same campaign can differ by multiples. Pick a window, label it on the chart, and keep it constant across the comparison — changing windows mid-quarter rewrites history.

Where this metric applies

Metrics

Dashboards

FAQ

ROAS vs. MER — what's the difference?
ROAS is per-channel: conversion value divided by spend for one campaign or platform, using that platform's attribution. MER (marketing efficiency ratio) is blended: total revenue divided by total marketing spend, with no attribution at all. ROAS tells you where to shift budget; MER tells you whether marketing as a whole is paying for itself. When per-platform ROAS looks great but MER is sinking, the platforms are claiming credit for the same conversions. Track both on a paid channel performance dashboard.
What's a good ROAS?
There is no universal 4x. Breakeven ROAS is 1 ÷ gross margin: at 25% margin you need 4x just to break even, at 70% margin 1.4x is already profitable. Set the target from your own margin, then adjust for campaign objective — retargeting should clear a much higher bar than prospecting, because it harvests demand the top of the funnel created. Compare against CAC when the goal is new customers rather than revenue.
Why doesn't platform ROAS match my revenue data?
Each platform self-reports conversions under its own attribution model — Google Ads uses data-driven attribution, Meta Ads defaults to 7-day click plus 1-day view — so both can claim the same order. Platform ROAS is directional for optimizing within a channel; the source of truth for the total is your revenue table. That gap is exactly why the blended MER comparison belongs on the same dashboard.
How do you calculate ROAS?
Divide conversion value by spend: SUM(conversion_value) / SUM(spend), grouped by campaign, channel, or period. Guard the denominator with NULLIF so paused campaigns don't divide by zero. Decide up front whether the numerator is revenue or gross profit — revenue ROAS flatters low-margin products, so profit ROAS is the version worth ranking campaigns on.
How do you track ROAS in Metabase?
Sync daily spend and conversion value from Google Ads, Meta Ads, and TikTok Ads into one ad_performance_daily table, then chart ROAS by campaign and week. Join to your revenue table for the blended MER line, and pin both next to ad spend pacing so efficiency and budget burn read together.