How to find out why Meta Ads ROAS dropped
ROAS is revenue divided by spend, so a drop is always one of two things: spend went up, or revenue went down. Work out which half moved before you touch anything, then decompose that half into CPM, CTR, CVR and AOV until you can name the campaign, ad set or creative responsible. A surprising share of ROAS drops are not performance at all — they are a tracking or attribution change, which is why that check belongs in the process rather than at the end of it.
To diagnose a ROAS drop, check these in order:
- Whether the drop survives a longer window, or is one bad day
- Spend and revenue separately — which side actually moved
- CPM, CTR, CPC, CVR, CPA and AOV, to locate the broken link
- Campaign, ad set and ad level, to find where it concentrated
- Creative — frequency and CTR together, not frequency alone
- Pixel and CAPI health, purchase event volume, attribution settings
- Recent changes: budget, targeting, bid strategy, landing page, offer
Start here: match the symptom to the thing to check
This is the fastest way in. Find the row that matches what actually moved, and start at that check rather than reading the whole account top to bottom.
| If ROAS dropped and… | Check this first |
|---|---|
| Spend increased | Budget changes, new campaigns, and whether CBO shifted allocation between ad sets |
| Revenue decreased | Purchase volume first, then CVR, then AOV — they fail for different reasons |
| CPM increased | Audience size, auction pressure, placement mix, and whether a cost cap is squeezing delivery |
| CTR decreased | Creative fatigue, audience saturation, or a new creative that is dragging the average |
| CVR decreased | Landing page, offer, checkout, product availability — usually not the ad |
| One campaign deteriorated | Drill to ad set then ad; quantify the contribution before concluding |
| Nothing obvious moved | Tracking. Pixel/CAPI health, purchase event volume, attribution window changes |
The diagnostic path
Step 1
Confirm the drop is real
Do not diagnose from a single day. Compare the last 7 days against the previous 7, and against the trailing 28-day average, pulling spend, revenue, purchases and ROAS together. A one-day dip on a conversion-optimised account is usually noise or attribution lag, not a problem.
- Pull daily data rather than one aggregate, so you can see when it turned — the inflection date is the single most useful fact in the whole investigation.
- Judge an ad set on at least 3–5 conversions per week. Below that you are reading noise, and the honest answer is that there is not enough signal yet.
- Do not make optimisation decisions on an ad set still in learning. The gate we use is spend of at least 2× AOV or 4× CPA, whichever is higher.
The trap: rate metrics are not additive. You cannot average daily ROAS, CTR, CPM or frequency to get a weekly number — you have to query at the grain you intend to report. Averaging row-level rates is one of the most common ways a drop gets invented that was never there.
Step 2
Split spend from revenue
ROAS = revenue ÷ spend. Only one of those needs to move. If revenue held flat and spend rose, you have an allocation question. If spend held and revenue fell, you have a conversion or tracking question. Write down which one it is before going further — it halves the search space immediately.
- Spend rose, revenue flat → look at budget changes, newly launched campaigns, and CBO reallocating toward an ad set that converts worse.
- Spend flat, revenue fell → split revenue into purchases × AOV. A purchase-count drop and an AOV drop have completely different causes.
- Both moved → take the larger percentage change first.
Check this before you trust the revenue number: Meta returns several overlapping purchase actions — omni_purchase, purchase, offsite_conversion.fb_pixel_purchase, onsite_web_purchase and more. Use exactly one. We check omni_purchase first and fall back to purchase. Summing them double-counts revenue and inflates ROAS, which means the drop you are chasing may be last month's number having been wrong rather than this month's being bad.
Step 3
Decompose into the rate metrics
Now walk the funnel and find the broken link. Each metric fails for a different reason, so the one that moved tells you which team owns the fix.
- CPM up — you are paying more for the same reach. Auction pressure, a narrower audience, a placement shift, or a cost cap the algorithm cannot fill at.
- CTR down — the ad is landing worse. Creative or audience.
- CPC up without CPM or CTR moving — usually a mix shift between placements rather than a real change.
- CVR down — traffic arrived and did not convert. Landing page, offer, checkout, stock. Rarely the ad itself.
- AOV down — discounting, product mix, or a promotion that shifted the basket.
A cost cap combined with rising CPM has two different causes that need separating before you act: either the algorithm cannot find conversions at your cap price, or the original audience is saturating and delivery is leaking into worse segments. Frequency, reach trend and audience size tell you which.
Step 4
Find where it actually happened
Account-level numbers hide the answer. Drill down one level at a time — campaign, then ad set, then ad — and quantify each child's contribution to the parent. The goal is to move from "ROAS dropped 20%" to "three campaigns account for the entire decline."
- Sort ads by spend descending and keep the ones making up the first 90% of spend. Those are the ads that matter; the long tail cannot move an account-level number.
- Always filter to active entities. The insights API returns anything that spent in the window, including things you have since paused — which quietly pollutes every aggregate.
- Check at least two breakdowns — placement, device, or age and gender. Out-of-target delivery eating budget is common when Advantage+ audience expansion is on.
- Hold segment conclusions to at least 100 impressions and 3 conversions. Below that, say so rather than recommending on it.
A pattern that looks like a problem but isn't: under CBO, one ad set holding 80%+ of the budget is usually the algorithm working correctly — it found the best converter. Do not pause the dominant ad set because smaller siblings look better on small samples; they generally fail at scale.
Step 5
Investigate the creative properly
Creative fatigue is real but over-diagnosed. It has a specific signature, and a single metric is not it.
- Fatigue is frequency rising AND CTR falling, sustained over 14+ days. Both, together, over time.
- High frequency on its own is not fatigue. A small retargeting pool runs at high frequency permanently and converts fine.
- For video, split the funnel: hook rate is 3-second views ÷ video plays, hold rate is thruplays ÷ 3-second views. A hook problem and a hold problem need different fixes.
- Check whether one new creative is dragging the average, rather than the whole set decaying.
The thresholds we work to: hook rate at or above 40% is good and under 25% is poor; CTR at or above 1.25% is good and under 0.65% is poor. These are our working numbers from the accounts we run, not an industry standard — calibrate against your own account's trailing 90 days before treating them as targets.
Step 6
Rule out tracking and attribution
Not every ROAS drop is a performance drop. If the funnel metrics look broadly normal but revenue fell, suspect measurement before you touch budgets. This check saves more wasted optimisation than any other step here.
- Pixel and CAPI firing — compare purchase event volume against its own daily baseline.
- Attribution window changes. Moving from 7-day click to 1-day click will drop reported ROAS without a single thing changing in the account.
- View-through share. A campaign whose ROAS is mostly view-through is over-credited, and the true incremental number is lower.
- Two campaigns targeting the same audience can double-count conversions between them.
- Advantage+ Shopping aimed at existing customers takes credit for purchases that would have happened anyway.
If the account optimises for a non-purchase event — COMPLETE_REGISTRATION, LEAD, ADD_TO_CART — do not convert that count into revenue. One common configuration routes real purchases through the registration event because a third-party profit tracker sends them that way, which means the event means the opposite of what the name suggests. Confirm what the event represents in this account before reading anything into it.
Step 7
Check what changed in the account
Finally, look at the change log over the window. Most ROAS drops have a human cause sitting in plain sight, and finding it takes a minute.
- Budget changes and newly launched campaigns
- New creatives entering rotation
- Audience, targeting or exclusion edits
- Bid strategy or cost cap changes
- Landing page, offer, pricing or stock changes
- Anything that reset learning
A worked example
Illustrative example. The numbers below are made up to show the method. They are not a client account and not a benchmark.
ROAS fell from 2.8 to 2.1 across a fortnight. Here is what the decomposition looks like and how to read it.
| Metric | Previous | Current | Change |
|---|---|---|---|
| Spend | $20,000 | $25,000 | +25% |
| Revenue | $56,000 | $52,500 | −6% |
| CPM | $18 | $21 | +17% |
| CTR | 1.4% | 1.1% | −21% |
| CVR | 3.2% | 3.0% | −6% |
| CPA | $40 | $52 | +30% |
Both sides moved, but spend moved more. Spend is up 25% while revenue is down 6%, so the larger change is on the spend side — start there.
The rate metrics point at the top of the funnel. CPM is up 17% and CTR is down 21%, while CVR barely moved at 6%. Traffic is costing more and engaging less, but the people who do arrive convert at roughly the same rate — so the landing page and offer are probably fine. This is an ad-side problem, not a site-side one.
CPM up and CTR down together is the fatigue signature — but only if frequency is also climbing and it has held for two weeks or more. Check that before concluding. If frequency is flat, the likelier story is that the extra $5,000 of budget pushed delivery into a worse-performing audience segment.
Where next. Pull the ads making up the first 90% of spend and compare the current window against the previous one per ad. If the CTR decline is concentrated in a few older creatives, it is fatigue. If it is spread evenly across every ad including new ones, it is delivery — and the fix is the budget, not the creative.
What not to conclude too quickly
A ROAS drop invites a fast answer, and the fast answer is usually "creative fatigue" because it is the most available explanation. Rule these out before you accept it:
- Seasonality. Compare against the same period last year as well as last week, where you have the history.
- Attribution delay. Recent days under-report. A drop at the edge of the window often fills in.
- Your own budget change. Scaling spend 25% and holding ROAS is not a failure — more budget usually means worse marginal efficiency.
- Tracking. Pixel or CAPI breakage looks exactly like a performance collapse and is far more common than it should be.
- Landing page or stock. An out-of-stock bestseller shows up as a CVR drop with no ad-side cause.
- Auction conditions. Competitors entering the auction raise CPMs regardless of what you do.
- Small numbers. Below 3–5 conversions per ad set per week, the week-to-week swing is mostly noise.
How to automate this investigation
Done by hand, this process means pulling data at four levels of the account, comparing two windows at each level, de-duplicating purchase actions correctly, and checking tracking health — before you have formed a single hypothesis. It is an hour of work to answer one question, and most of that hour is data assembly rather than thinking.
An AI analytics layer can do the assembly. GoMarble connects to the account, monitors for the kind of movement that matters, and runs the decomposition above — which campaigns, which creatives, which metric — rather than only charting that the number fell.
The shape of it
- Connect the ad account
- Ask the question in chat or Slack, or let scheduled monitoring raise it
- The anomaly gets identified against the account's own baseline, not a generic benchmark
- Root-cause analysis decomposes the change into spend, CPM, CTR, CVR and AOV contributions
- The output carries a recommended action, which GoMarble AI Agents can execute once you approve it
The part worth keeping human is the judgement about whether a flagged change is a problem. The part worth automating is everything before it.
ROAS drop diagnostic checklist
- ☐ Confirm the decline over a meaningful window, not one day
- ☐ Compare spend and revenue separately
- ☐ Verify a single purchase action is being counted, not several summed
- ☐ Check CPM
- ☐ Check CTR
- ☐ Check CPC
- ☐ Check CVR
- ☐ Check CPA and AOV
- ☐ Identify the affected campaigns and quantify their contribution
- ☐ Identify the affected creatives across the top 90% of spend
- ☐ Check frequency alongside CTR, over 14+ days
- ☐ Check pixel and CAPI health and purchase event volume
- ☐ Check attribution window and view-through share
- ☐ Check the account change log
- ☐ Check external factors — seasonality, stock, auction, promotions
Questions people actually ask
How big a ROAS drop is actually worth investigating?
How long should I wait before reacting to a ROAS drop?
Why does my reported ROAS not match Shopify?
Is a sudden ROAS drop usually creative fatigue?
What if nothing in the account looks wrong but ROAS still fell?
Should I pause the worst-performing ad set straight away?
Where this method comes from
The diagnostic path, the thresholds and the traps on this page come from the methodology GoMarble's own agents run when they analyse a Meta account — the same performance-analysis, creative-analysis and depth-of-analysis procedures, including the purchase de-duplication rule, the 90%-of-spend focus, the fatigue signature and the statistical significance floors. The benchmark figures are ours, drawn from the accounts we operate, and are offered as working thresholds rather than industry standards. Worked examples are invented to demonstrate the method.
- GoMarble MCP — connect Claude or ChatGPT to your ad accounts
- Meta Ads reporting and analysis workflows
Related
Let GoMarble run this diagnosis for you.
Connect your Meta account and ask why ROAS moved. You get the decomposition, the entity responsible, and a recommended action you can approve.