Google Ads ROAS thresholds: reconciling Meta, Google, and Stripe with custom alerts
The right Google Ads ROAS threshold isn't a fixed number — it's based on your margin, CAC payback, Meta-vs-Google attribution gap, and Stripe-actual revenue. Custom alert configuration walkthrough included.
'We target a 3x ROAS' is one of the most common things you hear from media buyers — and one of the least well-reasoned. 3x for what business? 3x on what margin? 3x over what time horizon? 3x on Google-reported revenue, or 3x reconciled against your actual Stripe revenue? A 3x ROAS on a 30% margin product is a disaster. A 3x ROAS on a 70% margin product with high LTV is potentially conservative. And a 3x Google ROAS that turns into a 1.8x once you reconcile with Stripe is a budget bleed nobody's catching.
This post walks through the math for setting Google Ads ROAS thresholds that protect your budget, plus the reconciliation steps that compare Meta-reported revenue, Google-reported revenue, and Stripe-actual revenue — and the custom Slack alert configuration that surfaces threshold breaches before they compound.
The core formula
Minimum ROAS = 1 ÷ (Maximum allowable ad spend as % of revenue)
- 1.Start with your gross margin %. If you make $100 in revenue and COGS is $35, your gross margin is 65%.
- 2.Subtract other variable costs (fulfillment, payment processing, returns) — say 10%. Net margin available: 55%.
- 3.Decide what percentage goes to marketing vs. operating expenses. At 20% target net margin: 35% for marketing.
- 4.Maximum ad spend as % of revenue = 35%. Minimum ROAS = 1 ÷ 0.35 = 2.86x.
Setting thresholds by campaign type
| Campaign type | Typical threshold | Why |
|---|---|---|
| Retargeting (ATC, VC) | 5x+ ROAS | Low cost, high intent — should be very efficient |
| Prospecting (LAL) | 2.5–3.5x ROAS | Higher cost to acquire, lower intent |
| Brand search (Google) | 8x+ ROAS | Near-pure demand capture — should be extremely efficient |
| Non-brand search | 3.0–4.0x ROAS | Competitive, mid-funnel intent |
| Performance Max | 3.5–5.0x ROAS | Cross-network — set higher because reporting opacity is real |
| YouTube (Google) | 2.0–3.0x ROAS (last-click); 3.5x+ (incrementality-tested) | Upper-funnel attribution undercounts heavily |
The Meta vs Google attribution gap (and why it matters for your threshold)
If you run Meta and Google in parallel — which most DTC and B2B operators do — you'll see overlap in the attribution windows. Meta's default 7-day click + 1-day view attribution and Google's data-driven attribution both count credit for the same conversion. The result: if you naively sum Meta-reported revenue + Google-reported revenue, you'll get a number bigger than your actual revenue from those channels combined.
In our experience working with growth teams, the cross-platform double-count is typically 15-35% of reported revenue. That means a Google Ads campaign showing a 4.0x ROAS in the Google Ads UI might be a 3.1x ROAS once you reconcile against the platform that's also taking credit for the same conversion, and a 2.4x ROAS once you reconcile against your Stripe-actual revenue net of refunds and chargebacks.
Your real Google Ads ROAS threshold depends on which revenue number you anchor it to. The threshold that protects your budget is the one calculated against Stripe-actual revenue, not Google-reported revenue.
Reconciling Google-reported, Meta-reported, and Stripe-actual revenue
> THE MAVRICK BRIEF
Want this kind of thing in your inbox once a week?
// Written personally by Brian
The reconciliation discipline that closes this gap:
- 1.Pull Google Ads-reported revenue for the period from the Google Ads API (or your saved report). This is the 'optimistic' number Google's algorithm is optimizing against.
- 2.Pull Meta-reported revenue for the same period from the Meta Ads API. Note the attribution window setting — 7-day click / 1-day view is the most common default but check your account.
- 3.Pull Stripe-actual revenue for the period, filtered to first-time customers (or your relevant customer cohort). This is the 'pessimistic but real' number.
- 4.Calculate: Stripe revenue ÷ (Google spend + Meta spend) = blended actual ROAS. Compare against each platform's individually-reported ROAS.
- 5.The gap between platform-reported and Stripe-reconciled is your attribution-overcounting rate. Track it weekly — if it's stable, you can apply a haircut multiplier. If it's volatile, you've got a measurement-quality problem that needs investigation.
This work is what most marketing teams skip because it takes 90 minutes a week and lives in a Google Sheet that nobody updates. The Mavrick pattern: have the AI coworker do the reconciliation automatically and post the haircut-adjusted ROAS for each campaign to your Slack.
Custom alert configuration for ROAS threshold breaches
A ROAS threshold without an alert is a polite suggestion. The alert configuration that actually protects budget:
- →Threshold tier — minimum acceptable ROAS for each campaign type (per the table above)
- →Breach window — how long the campaign has been below threshold (3-day sliding window is a reasonable default; 1-day catches noise, 7-day waits too long)
- →Spend gate — only alert if the underperforming campaign has spent >$X in the breach window (skip the noisy alerts for $50/day test campaigns)
- →Channel routing — post to a specific Slack channel (#paid-media-alerts) with the operator @-mentioned for the campaign owner
- →Suppression — don't re-alert on the same campaign more than once per 24 hours unless the breach severity changes
Mavrick handles the underlying reconciliation, threshold comparison, breach detection, spend filtering, channel routing, owner @-mention, and suppression logic — all from one Slack command that you set up once and forget.
What a ROAS threshold is not
A ROAS threshold is not a target to optimize toward. It's a floor. Campaigns running well above threshold should still be scaled until they show signs of saturation. The threshold protects against waste — it doesn't tell you what good looks like.
A ROAS threshold also isn't a substitute for incrementality testing. The campaigns showing the highest ROAS are often the ones reaching customers who would have purchased anyway (brand search, retargeting). The campaigns showing lower ROAS are sometimes the ones genuinely creating incremental demand (prospecting, upper-funnel). Use thresholds to catch waste — use geo holdouts or conversion lift tests to find true incrementality.
How to set your thresholds today
- 1.Calculate your minimum ROAS from the margin formula above. This is your floor for blended performance.
- 2.Adjust per campaign type using the table — brand and retargeting carry higher thresholds because their attribution is least incremental.
- 3.Pull your last 90 days of Stripe revenue, Google spend, and Meta spend. Calculate your actual cross-platform reconciliation gap (the haircut multiplier).
- 4.Set the alert thresholds at the reconciled (post-haircut) level, not the platform-reported level. Your alerts should fire on the real number.
- 5.Wire the alert to Slack with the breach window + spend gate + suppression rules described above.
- 6.Review monthly — your margin structure changes, your cross-platform gap drifts, your thresholds need refreshing.
Related reading
If reconciling reported-vs-actual revenue is a recurring pain, the post on Meta-vs-Stripe specifically goes deeper on the attribution-window mechanics: /blog/why-your-roas-is-lying-to-you. For the broader cross-platform attribution problem, see /blog/meta-ads-reconciliation-guide. For the operator workflow that automates these alerts: /for/media-buyers.
Stop pulling data. Start commanding Mavrick.
10 free missions. Connects to your accounts in minutes.
> THE MAVRICK BRIEF
What operators are actually installing this week.
One short email a week. Tool stack changes. Workflows operators just installed. Patterns from inside Mavrick's customer base. No theory, no hype, nothing you have to “implement later.”
// Written personally by Brian · One click to unsubscribe

Brian MacDonald
Brian MacDonald is the founder of Mavrick, the AI coworker for marketing teams. Previously ran SetupClaw.tech, an AI deployment service for SMBs. Read more about Brian and the mission.