Home › Meta ads not delivering
Why your Meta ads silently fail — and how to catch it before Submit
You clicked Publish. Ads Manager said “Active.” Two days later you find out the campaign never actually spent — and Meta never told you why. Here's the media buyer's triage for all 15 ways that happens.
✓ No credit card · ✓ 5 free campaigns/month · ✓ Dashboard, Google Sheets & your AI assistant
Short answer
Meta ads usually fail to deliver for one of six visible reasons — budget or bid too low, audience too narrow, learning phase not exited, creative rejected in review, weak signal, or objective mismatched to your goal — plus a seventh almost nobody talks about: silent construction errors the API accepts but never actually runs. This guide diagnoses all of them, in order.
| Cause | What it looks like | Fix at |
|---|---|---|
| Budget / bid too low | Active but $0 or under-spending | Ad set |
| Audience too narrow | Zero or throttled delivery | Ad set |
| Learning phase | “Learning Limited”, unstable | Ad set |
| Stuck in review | Never leaves “In review” | Ad |
| Objective mismatch | Spends but never converts | Campaign |
| Silent construction error | Publishes “successfully”, never runs | Pre-flight |
Work through it top to bottom — it's a triage. Most problems resolve in the first five.
Start here · Delivery problems
Your ad is live but nothing's happening
The five most common “why won't this run” problems, in the order you should check them.
Why is my Meta ad not spending?
If your ad is active but spending $0, it's almost never a mystery — it's one of four things, in order of likelihood. Your daily budget is too low to win the auction for your optimization event; your bid cap is set below what the auction currently costs; your audience is too small for Meta to serve; or the ad is still pending review.
Check ad-set status first, then bid, then audience size. The fix is usually raising the budget or loosening the bid before you touch anything else.
Why is my Facebook ad not delivering after it was approved?
Approval only clears policy — it doesn't guarantee delivery. An approved ad still won't serve if the ad set sits in Learning Limited, if it overlaps a duplicate ad set competing in the same auction, if the schedule hasn't started yet, or if the objective can't find enough optimization events to spend on.
“Approved” and “delivering” are two different states, and the block is almost always at the ad-set level — not the ad.
Why did my ad set publish but show zero impressions from the start?
Zero impressions from launch — as opposed to a mid-flight drop — points to a setup fault, not a performance one. The usual culprits: an audience below Meta's serving threshold, a schedule start-date set in the future, a disapproved ad sitting inside an otherwise-active ad set, or a budget beneath the minimum for your optimization event.
If it never served at all, look at how it was built, not how it's performing.
Why is my ad stuck “in review” and never leaves it?
Most ads clear review within 24 hours. A longer stall usually means one of three things: the ad was edited while still under review (which restarts the clock), it contains an element flagged for manual check, or the whole account is under review.
The fix is counterintuitive — stop touching it. Every save while it reads “In review” sends it back to the end of the queue.
Why won't my ad set spend its full daily budget?
Under-delivery against budget is the auction telling you it can't find enough impressions worth your bid. Three causes: the audience is too narrow, the bid cap is too tight, or the optimization event is too rare for Meta to pace spend against.
Widen the audience or ease the bid. Chasing budget with more budget won't help if supply at your price simply isn't there.
Learning phase
Stuck in learning — or told you reset it
Why is my campaign stuck in “Learning Limited”?
Learning Limited means the ad set can't gather the roughly 50 optimization events per 7 days Meta needs to stabilize delivery. It's usually caused by a budget too low for the event's cost, too many small ad sets splitting your conversion volume, or repeated edits that keep re-triggering learning.
The fix is consolidation: fewer ad sets, more budget each, aimed at roughly 50× your target cost per result per week.
Does verifying my domain reset the learning phase?
No — verifying a domain does not by itself reset the learning phase. The reset comes from significant edits: changing your optimization event, audience, or budget by a large margin sends an ad set back into learning. Verifying your domain and configuring Aggregated Event Measurement doesn't.
The myth persists because people often verify their domain and change their conversion event in the same sitting, then blame the verification.
Everything above is a setting you can check by hand. Below is where it gets ugly.
The next six failures don't show an error at all. Meta's API accepts the setup, reports success, then quietly refuses to deliver. Adbloop validates all of them before you publish — one launch or 150 at once.
See how the pre-flight check works →Free plan · no card · every campaign lands paused until you approve it.
The ones Meta never warns you about
Silent construction failures
The API takes your setup, says “success,” then doesn't run it. No banner, no email. These are the ones that quietly drain budget.
Why does my campaign publish successfully but never actually run? Silent
This is the failure Meta is worst at telling you about. The API returns “success” when you publish, then silently refuses to deliver because a downstream setting is invalid for the objective you chose — a combination the composer accepted but the delivery system rejects.
There's no error banner and no notification; the campaign just sits at zero spend while you assume it's live. Catching it means validating the full objective-to-destination chain before you publish, not after.
A documented case: a lead campaign with no lead form attached
Build a Leads campaign with Dynamic Creative switched on and the conversion location set to Instant Forms — but without actually attaching a form. Everything saves. The campaign goes Active. Ads Manager shows no warning anywhere.
The ad has no form to open, so it is structurally incapable of producing a single lead. The only symptom is spend climbing while results sit at zero. Anyone building campaigns one at a time in the interface will usually catch this by eye; anyone duplicating campaigns, importing a sheet, or launching in volume will not.
Adbloop blocks this combination before it ever reaches Meta.
Adbloop FIX #104 · reproduced against live ad accounts on Meta Marketing API v25.0Why is Meta silently killing part of my delivery with no error? Silent
When only part of a launch fails — say 8–12% of your ad sets never spend while the rest run fine — it's because that subset carries a config the delivery system quietly rejects. The batch reports as live, so nothing looks wrong until you notice the spend is short.
On a $500/day campaign, a silently-dead ad set is real money gone every day before anyone catches it. The only reliable defense is validating every ad set at build time.
The category we see most: settings carried across campaigns that don't share an objective
This is the classic duplication failure. You build a Sales campaign, get it right, then duplicate it to spin up a Leads campaign — or you import a sheet where the campaign types differ row to row. The conversion event carries across unchanged.
A Purchase event is perfectly valid on the Sales campaign and meaningless on the Leads one. The Sales campaigns run. The Leads campaigns don't. Nothing announces which is which, and because most of the batch worked, the spend report looks broadly normal until you check results per campaign.
It's worth knowing the reverse trap too: Engagement campaigns genuinely do accept Purchase, Lead and Add-to-cart events. Tools that "helpfully" correct those are breaking working campaigns. Adbloop matches the conversion event to each campaign's own objective and leaves Engagement alone.
Adbloop FIX #83, #85, #108 · validated across a 131-campaign launch, 131 of 131 createdWhy does the wrong objective break delivery — and how do I catch it before launch? Silent
Objective is the one choice you can't undo after launch without rebuilding the campaign, which is exactly why getting it wrong is so costly. Pick Traffic when you actually want Sales and Meta optimizes for cheap clicks, not buyers — the campaign “works” and still never converts.
And some objectives silently disallow the conversion location you selected, so the mismatch doesn't surface until delivery quietly stalls. Match the objective to the real business goal first, every time.
You don't see any of this in Ads Manager. You pick an objective, pick a conversion location, and the interface lets you continue. The incompatibility only shows up later as a campaign that won't spend.
Here are the mismatches that catch people most often, in the language you'll actually see on screen:
| What you set up in Ads Manager | What happens | What works instead |
|---|---|---|
| Sales campaign optimising for Reach or Impressions | Optimises for the wrong thing | Sales doesn't support reach or impression goals — pick a conversions, value or traffic goal instead |
| Video views goal on an image or carousel ad | Dies on publish | Video-view goals need video creative. Switch the goal to link clicks, or switch the creative |
| Leads campaign using the “Conversations” goal | No longer available | Meta retired this pairing in late 2025 — use Lead generation |
These are the ones we see most. There are considerably more — we've tested 37 objective-and-destination combinations against live ad accounts, and documented the exact behaviour of each, including the ones Meta's interface never hints at.
You shouldn't have to memorise any of this
The honest problem with a list like the one above is that it's never finished. Meta changed the rules in October 2025 and again in January 2026. A combination that worked last quarter can quietly stop working, and nothing tells you except a campaign that doesn't spend.
That's the reason we stopped keeping this in a document and put it in the product instead. Adbloop carries all 108 documented fixes and checks every campaign against them before it reaches Meta — so an invalid objective-and-destination pairing gets caught and corrected at build time rather than discovered a week later in your spend report.
You don't need to know which combinations are broken. You just need them not to launch broken.
Launch with the checks built in — free → 108 documented fixes · 374 validated tests · Meta Marketing API v25.0 · re-tested Feb 2026Why is my conversion location wrong, and why doesn't Meta warn me? Silent
Each objective supports only certain conversion locations — the Sales objective, for instance, serves to a website via the Pixel or to messaging apps, not everywhere. Pick a destination your objective doesn't genuinely support and Ads Manager will usually still let you save it, then fail to deliver without ever telling you why.
This is the trap: valid-looking on screen, dead on arrival. If you ever see an error mentioning destination_type, this is what it means — Meta is telling you the objective and the conversion location don't go together.
| Conversion location you picked | Why it quietly fails |
|---|---|
| Messaging apps, with no Page connected | Messenger, Instagram and WhatsApp destinations all need a Page linked to the campaign. Without one the conversation destination can't be built, and the ad set won't deliver |
| Instant forms, with no form attached | Publishes perfectly and can never collect a lead, because there's no form to open |
| Calls, on a campaign with a bid cap set | Call-optimised goals only run on automatic bidding. A manual bid cap stops delivery |
The pattern behind these: Ads Manager lets you save a combination its delivery system won't honour. The dropdown being available is not the same as the pairing being valid.
Adbloop enforces the complete set of 108 documented fixes automatically at build time — start free.
Why do I get API errors when creating campaigns in bulk? Silent
Launching in bulk surfaces errors that single campaigns hide. Rate-limit throttling kicks in mid-batch and drops later campaigns; one malformed row fails while the rest succeed, leaving a partial launch; and objective-destination mismatches multiply across dozens of campaigns at once.
The defense is a pre-flight validation pass on every row plus a rate-limit capacity check before the batch touches your account — so you catch the bad ones before Meta does.
The failures that only appear at volume
Launching one campaign hides these. Launching thirty exposes all of them.
- Meta throttles you partway through. There's a ceiling on how fast an account can create campaigns. Hit it and the later ones simply never get made — no error surfaces, they're just absent. Retrying makes it worse, because the retries count against the same ceiling.
- Campaign type labels that don't match. Writing "Sales" in a sheet where Meta expects its own exact naming means the row launches as whatever the default is, not what you asked for. The campaign exists, runs, and optimises for the wrong thing.
- One bad row, thirty good ones. A single malformed campaign fails while the rest succeed, so the batch looks like it worked. Partial launches are the hardest failure to notice because nothing is obviously broken.
- Video goals on image ads. If any campaign in the batch uses a video-view goal against a static image, that one dies on publish while its neighbours run fine.
- The launch itself hanging. Long batches can stall with no completion signal at all, leaving you watching a progress indicator that will never finish — with no way to tell whether campaigns are still being created or nothing has happened for twenty minutes.
Every one of these is preventable by checking the batch before it's submitted rather than reacting after. That's the entire design principle behind how Adbloop launches: validate all of it, check the account's remaining capacity, then create — and land everything paused so nothing spends before you've looked at it.
Adbloop FIX #83, #85, #90–#94, #107, #108 · validated on a 131-campaign launch, 131 of 131 createdWhy won't my Dynamic Creative or carousel deliver the way I set it up? Silent
Dynamic Creative and carousel have format rules the composer doesn't always enforce up front — incompatible asset counts, an objective that doesn't support Dynamic Creative, or a card missing a required field. So it publishes, then under-delivers or silently strips the variations you set up.
If your DC test isn't rotating assets the way you built it, the problem is usually a format-rule violation that never threw a visible error.
| Combination | What happens | Rule |
|---|---|---|
| Dynamic Creative + Calls, Messenger or WhatsApp | Incompatible | Dynamic Creative can't be used with these conversion locations at all |
| Dynamic Creative + Post Engagement, Event Responses, Reminders Set | Incompatible goals | Block Dynamic Creative for these three goals |
| Awareness + Dynamic Creative + most CTAs | Rejected | Only LEARN_MORE, SIGN_UP and SUBSCRIBE survive. Standard Awareness ads accept all CTAs — the restriction is Dynamic-Creative-only |
| Leads + Dynamic Creative + CALL_NOW | Not compatible | 13 commerce and app CTAs are also blocked under Leads DC |
| Sales Flexible Ads + BOOK_NOW | Not compatible | Use a different CTA for Sales flexible formats |
| Conversations goal + BOOK_NOW or ORDER_NOW | Not compatible | Block both whenever the goal is Conversations |
| Multi-language (DLO) + Carousel | Conflict | Dynamic Language Optimization is incompatible with carousel — pick one |
| Dynamic Creative + Instant Forms, no form ID | Silent failure | Publishes clean and can never produce a lead. See case 08 above |
The pattern across all of these: turning Dynamic Creative on quietly narrows what else you're allowed to choose. Ads Manager blocks some of those combinations when you build campaigns by hand — but not when you duplicate an existing campaign, import a sheet, or hand the job to an AI assistant. That's where they slip through.
Derived from a 200-scenario audit of call-to-action and format compatibility (25 CTAs across 8 campaign setups), reproduced on live ad accounts. Adbloop checks all of these automatically — start free.
Benchmarks
“Is my CPM / CTR any good?”
Two of the most-asked numbers in Meta advertising — with the honest answer, and how to judge your own.
What's a good CPM for Meta ads?
There's no universal “good” CPM — it swings with your country, audience, industry, and season, so a number that's cheap for one advertiser is expensive for another. Broadly, many Meta advertisers see CPMs anywhere from a few dollars to the mid-teens, with competitive e-commerce audiences and year-end periods pushing higher.
The useful question isn't the absolute number — it's whether yours is stable and trending the right way against your own baseline.
For orientation against published 2026 aggregates: reported CPMs cluster roughly between $7 and $13 depending on industry, with Beauty and Health at the expensive end near $12.50 and Hardware and Automotive cheapest around $7. Facebook placements average lower CPMs than Instagram Feed, and objective matters more than most people expect — conversion-optimised campaigns run close to $15 CPM against roughly $7 for reach and video-view campaigns.
Two caveats worth more than the numbers. CPM inflation has been running around 20% year over year, so any benchmark older than a few months is describing a cheaper auction than the one you're bidding in. And a "high" CPM against a well-matched audience frequently beats a cheap one against a broad, disinterested one — CPM is an input, not a result.
Ranges compiled from published 2026 industry benchmark aggregates — see Digital Applied, Lebesgue and Triple Whale. These are third-party aggregates across many advertisers, not Adbloop account data.
What's a good CTR for Meta ads?
CTR depends heavily on placement, creative, and how warm the audience is, so treat any single benchmark with caution. As a rough orientation, link click-through rates around 1% are common for cold prospecting, with strong creative and warm retargeting running higher.
What matters more than the benchmark is the direction of your own CTR over time and how it tracks against CPM — falling CTR with rising CPM is the early signal of creative fatigue.
Published 2026 aggregates put average Facebook CTR near 1.7% for traffic campaigns and 2.6% for lead generation, while median link CTR — the stricter measure, and the one worth tracking — sits closer to 1.0%. Read any benchmark carefully: "CTR (all)" counts reactions, comments and page-name clicks, so it runs roughly double link CTR for the same ad.
Industry spread is wide enough that a global average is close to meaningless. Shopping, collectibles and gifts average above 4%; automotive repair sits near 0.8%. Below 1% is genuinely underperforming in most categories — but is simply normal in finance, insurance and auto repair.
Ranges compiled from published 2026 benchmark aggregates including WordStream and Databox datasets — see TheeDigital and Focus Digital. Third-party aggregates, not Adbloop account data.
Catch all of this before you click Submit
Every failure on this page shares one root cause: Meta's API accepts invalid setups and tells you nothing. You can memorize all 108 edge cases and hand-check them on every launch — or run a system that validates them before you hit Submit. That's what Adbloop does: the same 108 documented fixes, enforced pre-flight, across a 150-campaign bulk launch — from a dashboard, Google Sheets, or Claude and ChatGPT. Every campaign lands paused, so nothing spends until you approve it.