Your ads say "Active." Your spend says zero. And you've been staring at Ads Manager for two days wondering what's actually broken.
The typical move is to delete everything and rebuild — which almost never works, because the underlying cause is still there. There are 7 things that kill Meta ad delivery. They all look the same from the outside (no spend) but need completely different fixes. Check them in order before touching anything.
Start here: read the Delivery column
Open Ads Manager → find the "Delivery" column at the Ad Set or Ad level. If it's not there, go to Columns → Customise Columns → search for Delivery → add it.
The statuses you'll see:
- Active — running, but might be spending almost nothing
- Learning — in Learning Phase, completely normal
- Learning Limited — Learning Phase with insufficient signal
- In Review — Meta's policy check is in progress
- Rejected — failed review; click View Details for the reason
That status tells you which of the 7 causes you're actually dealing with.
1. Budget too low to compete in the auction
Meta is a real-time auction. Every impression is a live bid against every advertiser targeting the same person. If your budget's too thin, you can't compete — and Meta simply doesn't spend.
If you're working with a tight budget and can't hit that floor, switch your objective to Traffic or Engagement first. The auction entry cost is significantly lower, and you can build Pixel data before moving to Purchase optimization.
2. Audience too small
An audience under 100,000 people doesn't give Meta enough room to bid efficiently. Stack too many interest layers — narrow by age, gender, and location — and you can end up with 30,000 people. That either delivers erratically or not at all.
Check the Audience Size indicator inside your Ad Set settings. For cold prospecting, you want 500,000+ people. Retargeting audiences can be smaller because the intent is already there.
3. Ad stuck in review
Most ads clear Meta's review in under 24 hours. If yours is still "In Review" after 48 hours, the system has genuinely stalled — it doesn't mean your ad violated anything.
Two-step fix: duplicate the ad, change one word in the copy, and republish. If the original comes back "Rejected," read the reason in View Details. Vague result guarantees ("lose weight guaranteed") and health before-and-after images are the most common triggers.
4. Ad set in Learning Limited
Learning Limited means your ad set isn't hitting 50 optimization events in 7 days. Meta doesn't have enough signal to know who to show your ad to — so it pulls back on delivery.
5. Audience overlap across ad sets
If two ad sets are going after similar audiences, Meta picks one to deliver to — whichever has historically performed better. The other one gets almost nothing.
Use the Audience Overlap tool in Ads Manager (Tools → Audience Overlap) to check. Overlap above 20–25% across ad sets usually explains why one is spending and the others aren't. Consolidate the overlapping ad sets or separate your targeting clearly enough that they're chasing different people.
6. CBO pulling budget away from weaker ad sets
In a CBO campaign, Meta allocates dynamically — concentrating budget on whatever ad set looks best right now. The "losing" ad set never gets enough exposure to prove itself, even if it would have won with more time.
Fix: set a Minimum Daily Spend on each ad set inside the CBO campaign. This forces Meta to give every audience a fair shot before the algorithm locks in its call.
7. Payment failure or spending limit hit
The simplest cause — and the one founders forget to check. An expired card, a reached Account Spending Limit, or a failed payment freezes every campaign at once. Everything shows as "Active" but nothing spends a cent.
Check: Ads Manager → Billing → Payment Activity. If there's a red flag there, nothing else matters until it's resolved.
Quick reference
| Cause | Signal | Fix |
|---|---|---|
| Budget too low | Active status, near-zero spend | Raise to $5–10/day minimum per ad set |
| Audience too small | Size under 100K | Broaden interests, remove narrow layers |
| Ad in review | "In Review" for 48+ hours | Duplicate + minor copy tweak |
| Learning Limited | Status shows Learning Limited | Increase budget or switch to easier objective |
| Audience overlap | Multiple ad sets, one gets all spend | Consolidate or separate targeting clearly |
| CBO budget pull | Ad set spend = $0 in CBO | Set Minimum Daily Spend per ad set |
| Payment failure | All campaigns frozen at once | Check Billing → fix payment method |
What to do next
Checked all 7 and still can't pinpoint it? Run your account through AdBlueprint's Campaign Health check. It surfaces delivery issues in order of likelihood — so you're not chasing audience overlap for an hour when the real problem is an expired card from last month.