Where the ROAS leaks live, sort descending = winners to scale, ascending = losers to pause.
At a glance
Per-campaign ROAS, the breakdown that drives daily decisions. The headline ROAS hides huge variance: Branded Search at 14× props up Display Remarketing at 1.2×. Sort descending to find winners worth scaling, ascending to find losers worth pausing.
| The formula | SUM(metrics.conversions_value) ÷ (SUM(metrics.cost_micros) ÷ 1,000,000) per campaign, computed across FROM campaign filtered to campaign.status = 'ENABLED'. Returns one row per active campaign in the window. |
| GAQL resource + metric | FROM campaign, fields campaign.name, metrics.cost_micros, metrics.conversions_value. Paused/removed campaigns excluded by status filter. |
| Account currency (single by design) | Account currency from customer.currency_code. Multi-currency advertisers run separate Google Ads accounts per currency, so this card is always single-currency per account. |
| Conversion attribution model (configurable) | Whatever you’ve set in Google Ads (Tools > Attribution). Default for new accounts is Data-driven attribution (DDA), older accounts default to Last click. The model affects every row equally; switching DDA -> Last click can shift ROAS rankings by 15-25% per campaign. |
| View-through inclusion (excluded by default) | Uses conversions_value (primary), which excludes view-through. All conversions value (which includes view-through) is materially higher for Display and YouTube campaigns and would re-rank the table. |
| Bot / IVT filter | Google’s Invalid Click Filter strips detected bots pre-reporting. Residual 2-5% IVT slips through, more on Display Remarketing than on Branded Search, so low-ROAS Display campaigns may be dragged a touch lower than their “true” performance. |
| Micros conversion | cost_micros divided by 1,000,000 to get account-currency units. conversions_value is already in currency units (no division). |
| Real-time vs ingestion lag | 1-4 hour event-ingestion lag, longer for cross-device. Today’s per-campaign ROAS is unreliable, the 7-day rolling read is what to trust. |
| MCC aggregation | Per child account only. MCC managers see a separate row set per account, the engine does not sum campaigns across accounts. |
| Time window | 30D (no vsP comparison on this card; use ROAS Trend for time-series). |
| Alert trigger | Any ENABLED campaign ROAS < 1.0 flags as wasted-spend candidate. Drives sentiment_key: roas. |
| Roles | owner, marketing, finance |
Calculation
Calculated automatically from your Google Ads data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.Worked example
A UK fashion brand running four ENABLED Google Ads campaigns. The 30-day window covers 14 Mar 26 to 12 Apr 26.| Campaign | Spend | Conversions | Conv. value | Campaign ROAS |
|---|---|---|---|---|
| Branded Search | £4,200 | 412 | £62,400 | 14.86x |
| Performance Max (PMax) | £18,400 | 482 | £74,200 | 4.03x |
| Shopping (legacy) | £3,600 | 88 | £8,400 | 2.33x |
| Display Remarketing | £1,200 | 14 | £2,100 | 1.75x |
| Account total (Hero ROAS card) | £27,400 | 996 | £147,100 | 5.37x |
- The headline 5.37x is misleading on its own. Branded Search at 14.86x is largely intent-capture (people searching the brand name were buying anyway). Performance Max at 4.03x is the real acquisition workhorse. Display Remarketing at 1.75x is below the typical 2.0x DTC profitability floor and is a candidate for pause or budget cut.
- Branded Search inflates the headline. Strip Branded out and the “true acquisition ROAS” across PMax + Shopping + Display drops to about 3.4x. Most agency reporting quietly leaves Branded in; for honest reads exclude it.
- The £147,100 conversions_value is Google’s measurement, not your commerce-platform revenue. The same window in Shopify Total Revenue might show £150-180k of orders attributable to Google Ads (GA4 typically agrees within 10-20%). For the CFO read, divide commerce-platform revenue by Google Ads spend, not this number.
- Spend up, ROAS held vs prior 30D = healthy scaling. If next month spend rose to £33k and account ROAS dropped to 4.6x, that is scaling beyond the efficient frontier (more volume, lower marginal efficiency). If spend rose to £33k and ROAS held at 5.4x, the auction was elastic, keep going.
- PMax opacity bites at this granularity. PMax shows one ROAS row, but its inventory is split across Search, Display, YouTube, Discover, and Gmail. You cannot break the 4.03x down further inside Google Ads. If PMax ROAS drops, the only diagnostic is to look at PMax asset-group reports, the breakdowns table is intentionally coarse.
- Any ENABLED row at ROAS < 1.0: instant wasted-spend flag.
- Branded Search at < 8x: pixel or bid problem; this should always be the highest-ROAS row.
- PMax ROAS dropping > 25% in 7 days: check if Google added unprofitable inventory (use PMax insights, not this card).
- New campaign showing 0 conversions and £500+ spend: see Zero Conversion Spend.
Sibling cards merchants should reference together
| Card | Why pair it with ROAS by Campaign |
|---|---|
| Google Ads ROAS | The headline this card decomposes. ROAS by Campaign explains which campaigns drove the headline number. |
| Google Ads Spend by Campaign | The denominator per row. A high-ROAS, low-spend campaign is a signal to scale; high-ROAS-already-maxed-spend means you are saturated. |
| Google Ads Revenue by Campaign | The numerator per row. Pair with this card to spot campaigns where ROAS is good but absolute revenue contribution is small. |
| Google Ads ROAS Trend | Daily series at the account level. Use to confirm whether a campaign-level drop is part of an account-wide trend or a campaign-specific regression. |
| Google Ads Conversions by Campaign | Volume per campaign. Pair to find low-ROAS campaigns that are still useful at the top of the funnel. |
| Google Ads Wasted Spend | Campaigns at ROAS < 1.0 surface here. Direct workflow card for pause/budget decisions. |
| Google Ads Zero Conversion Spend | The extreme tail of this card: campaigns that recorded zero conversions despite spend. |
| GA4 Revenue by Channel | Independent attribution check. GA4’s Paid Search and Paid Shopping channel revenue is the closest external read on Google Ads performance. |
| Shopify Total Revenue | The truth side. Real per-campaign ROAS for the business uses commerce-platform revenue (with UTMs) and rarely matches Google’s conversions_value exactly. |
Reconciling against the vendor’s own dashboard
Where to look in Google Ads UI: Google Ads > Campaigns > Columns: Cost, Conv. value, Conv. value / cost. Add the Conv. value / cost column from the modify-columns picker. The values per ENABLED campaign should match this card to within 1-2% (sub-percent drift comes from real-time ingestion lag). Other Google Ads views that look like the same number but aren’t:- All conv. value / cost: includes view-through and secondary conversions. This card uses primary conversions only, so the All-conversions view will sit higher, especially for Display and YouTube.
- Reports > Predefined > Performance > Campaign: same data, different layout.
- Search Lost IS (rank/budget): a coverage metric, not ROAS.
- Tools > Attribution > Top Paths: model-comparison view; switching the model in this UI silently rewrites every row above.
- PMax campaign drilldown: shows asset-group performance but no per-channel split (Search vs Display vs YouTube). The 4.03x in your PMax row is intentionally opaque downstream.
| Reason | Direction of divergence |
|---|---|
| Real-time event-ingestion lag (1-4 hour). Vortex IQ reads a snapshot; the UI re-renders on each pageload. | Marginal on the most recent 24 hours, zero after that. |
Attribution-model change mid-window. Switching DDA <-> Last click rewrites conversions_value retroactively in both this card and the UI. No drift, but rankings shuffle. | None vs UI; large vs prior reads of this same card. |
| Currency. Both this card and Google Ads UI render in account currency. | None. |
| Refresh lag. The card respects the engine’s refresh cadence (typically 4 hours). | UI may be ~4 hours fresher. |
conversions_value per campaign is whatever Google’s pixel recorded at click-time within the attribution window. Real per-campaign profitability factors that this card does NOT see:
- First-purchase cap. If your pixel sends only the first-purchase value (a common cap to prevent loyalty programmes inflating ROAS), the campaign’s ROAS understates returning-customer revenue.
- Modelled value. Google fills tracking gaps with modelled conversions. Real cash to the bank is whatever the commerce platform recorded.
- Tax inclusivity. Pixel-side revenue may include tax (UK, EU defaults) or exclude it (US sales-tax setups). Compare to commerce-platform
subtotal_pricevstotal_priceaccordingly. - Returns. ROAS does not net returns; a campaign at 4x ROAS with a 25% return rate is closer to 3x net.
- COGS / contribution margin. ROAS is gross. A 2.5x ROAS on 35% gross margin is unprofitable.
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
google_analytics.ga_revenue_by_channel (Paid Search + Paid Shopping rows) | GA4 channel revenue should be within 10-20% of the sum of conversions_value across this card’s rows. Google Ads usually reads higher. | GA4 last-non-direct vs Google Ads ad-click-window; different attribution timing. |
shopify.total_revenue (filtered to UTM source=google medium=cpc) | (Sum of conversions_value across this card) <= Shopify revenue tagged as Google CPC. | The Google number is a subset of all Google-attributed revenue (only campaigns currently ENABLED in window). |
bigcommerce.total_revenue | Same logic as Shopify. Use BC analytics UTM filtering for the comparison. | Same as Shopify. |
Known limitations / merchant FAQs
My account ROAS looks fine but one campaign is at 1.2x, do I pause it? Not automatically. Check three things first: (1) Is it a brand-new campaign still in learning phase? Smart Bidding needs 30-50 conversions to stabilise; pausing too early kills the experiment. (2) Is it a top-of-funnel campaign (Discovery, YouTube, Display Prospecting) where 1.2x last-click ROAS is expected and the assist value is invisible here? Cross-check with GA4 Revenue by Channel and assisted conversions. (3) Is it Display Remarketing on a small audience? Below 1x with low spend (£100-£300/mo) is often the cost of staying in front of people who weren’t going to convert via paid anyway. If none of those apply, pause it or move budget to PMax. Why is my Branded Search ROAS 15x+ on this card? People searching for your exact brand name were going to buy anyway. Branded captures 70-90% of that intent for cheap clicks. Branded ROAS is a poor measure of paid-acquisition health, you are paying Google to defend traffic that would arrive organically. Most agency reporting quietly includes Branded; for honest acquisition reads exclude it from this view (filter by campaign name). My ROAS dropped 30% on one campaign overnight, what should I check first? In order of likelihood: (1) Conversion-tracking regression on that campaign’s landing pages. Check Clicks vs Conversions, if clicks held but conversions cratered, the tag broke. This is by far the most common cause of a sudden drop. (2) Attribution-model change at account level (Tools > Attribution); affects every row equally. (3) Promo period rolled over. ROAS during a 30%-off campaign rolls into “normal” the day after. (4) CPC spike, a competitor entered the auction. Check CPC by Campaign. (5) Broken landing page or checkout for products that campaign drives. Should I optimise for highest ROAS or highest absolute conversion volume? Depends on your phase. If you are profitability-constrained (need each pound of spend to break even), optimise for ROAS and accept lower volume. If you have headroom and unit economics work, optimise for absolute conversions; ROAS will compress as you scale into less-efficient inventory but total profit grows. The right answer is rarely the highest-ROAS campaign; it is “highest ROAS subject to spending the budget”. My Performance Max campaign claims 4x ROAS but I cannot see which channels are working, why? PMax is intentionally opaque. Google’s optimiser shifts spend across Search, Display, YouTube, Discover, and Gmail without exposing the per-channel mix. The 4.03x is the headline; no breakdown is exposed via this resource (or via the Google Ads UI for that matter). Trade-off you accept with PMax. The closest visibility is PMax asset-group reports inside Google Ads. Can I trust today’s per-campaign ROAS? Less than the rolling 7-day. Today’s per-campaign read is built from incomplete data: conversions take 1-4 hours to ingest, view-through windows accumulate over multiple days, and small-volume campaigns swing wildly on a single conversion. The 7-day rolling read is what we recommend for daily decisions; only restructure on 30-day windows. My multi-currency setup, how does this card work? Google Ads accounts are single-currency by design. Multi-currency advertisers run separate accounts per currency. This card is per-account, so each account shows campaign rows in its own currency. The cross-account ROAS comparison has to happen outside Google Ads (in Vortex IQ Nerve Centre’s MCC view, when present, or in a downstream BI tool). Why does this card show fewer campaigns than Google Ads UI? The card filterscampaign.status = 'ENABLED' only. Paused and removed campaigns are excluded. To see all-time campaign performance including paused ones, look directly in Google Ads with the status filter cleared.
Why does my GA4 channel revenue disagree with the sum of this card?
Three reasons: (1) Google Ads counts conversions on click-through within its attribution window (default 7-day click + 1-day view by default per conversion action, but configurable). GA4 typically uses last-non-direct click which can credit a different channel for the same conversion. (2) Google Ads applies enhanced conversions modelling; GA4 reports raw measurements (with optional Consent Mode v2 modelling). (3) Different sampling and aggregation. Google Ads is usually 10-20% higher than GA4. Both are subsets of actual commerce-platform revenue.