Home › Meta ads not delivering

Meta Ads Diagnostic · 2026

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.

CauseWhat it looks likeFix at
Budget / bid too lowActive but $0 or under-spendingAd set
Audience too narrowZero or throttled deliveryAd set
Learning phase“Learning Limited”, unstableAd set
Stuck in reviewNever leaves “In review”Ad
Objective mismatchSpends but never convertsCampaign
Silent construction errorPublishes “successfully”, never runsPre-flight

Work through it top to bottom — it's a triage. Most problems resolve in the first five.

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.

01

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.

02

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.

03

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.

04

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.

05

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.

Stuck in learning — or told you reset it

06

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.

07

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.

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.

08

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.0
09

Why 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 created
10

Why 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:

Five common Meta Ads Manager objective and conversion location mismatches
What you set up in Ads ManagerWhat happensWhat works instead
Sales campaign optimising for Reach or ImpressionsOptimises for the wrong thingSales doesn't support reach or impression goals — pick a conversions, value or traffic goal instead
Video views goal on an image or carousel adDies on publishVideo-view goals need video creative. Switch the goal to link clicks, or switch the creative
Leads campaign using the “Conversations” goalNo longer availableMeta 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 2026
11

Why 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 pickedWhy it quietly fails
Messaging apps, with no Page connectedMessenger, 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 attachedPublishes perfectly and can never collect a lead, because there's no form to open
Calls, on a campaign with a bid cap setCall-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.

12

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 created
13

Why 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.

CombinationWhat happensRule
Dynamic Creative + Calls, Messenger or WhatsAppIncompatibleDynamic Creative can't be used with these conversion locations at all
Dynamic Creative + Post Engagement, Event Responses, Reminders SetIncompatible goalsBlock Dynamic Creative for these three goals
Awareness + Dynamic Creative + most CTAsRejectedOnly LEARN_MORE, SIGN_UP and SUBSCRIBE survive. Standard Awareness ads accept all CTAs — the restriction is Dynamic-Creative-only
Leads + Dynamic Creative + CALL_NOWNot compatible13 commerce and app CTAs are also blocked under Leads DC
Sales Flexible Ads + BOOK_NOWNot compatibleUse a different CTA for Sales flexible formats
Conversations goal + BOOK_NOW or ORDER_NOWNot compatibleBlock both whenever the goal is Conversations
Multi-language (DLO) + CarouselConflictDynamic Language Optimization is incompatible with carousel — pick one
Dynamic Creative + Instant Forms, no form IDSilent failurePublishes 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.

“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.

14

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.

15

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.