The ad set is active, funded, approved, and has served nothing in twenty hours. Every screen you can find says everything is fine. This is one of the most frustrating states in advertising because the platform gives you almost no signal, so people start changing things — which, as it turns out, is usually the worst available move. Here are the eight real causes in the order they turn out to be the problem.
First: two things that look broken and mean nothing
Check these before diagnosing anything, because chasing them wastes days.
Four to five hours of nothing
A new click or conversion ad set typically takes four to five hours before its first impression. A reach objective starts in minutes, which is exactly why comparing the two makes the first look dead. This is normal.
A flat zero delivery curve
The estimated daily results graph showing zeros, and an estimated audience of zero, on a brand-new ad set means nothing at all. Healthy campaigns show the identical signature. We used this twice as evidence of a problem and were wrong both times.
1. You keep editing it
The most common cause, and the one nobody suspects because it feels like diligence.
Every edit to a live ad set restarts the platform's evaluation of it. Change the budget, swap an interest, adjust the audience — each one sends the ad set back to the beginning. Do it four times in a morning and you have an ad set that never gets far enough into evaluation to deliver.
💡 We watched exactly this: an ad set edited four times in quick succession served zero impressions for fourteen hours while the same account delivered thousands on another campaign. Everything read healthy — active, funded, no issues flagged, previews fine, and Meta itself had validated the payload. A fresh ad set, created once and left alone, started delivering in about an hour. Before assuming anything else, ask how many times it has been touched today.
The rule that follows: build the ad set once, then leave it. If you must change something substantial, duplicate it and start fresh rather than editing in place.
2. The budget is below the platform minimum
Meta enforces a minimum daily budget per ad set, tiered by objective. An impression objective sits at a base rate; a conversion objective sits at roughly three times it. On an AED account, for concrete numbers, that is about AED 3.69 versus AED 11.07 a day, per ad set.
Below the floor the campaign is usually refused outright — but the error rarely mentions the rule. Just above it, delivery is throttled and erratic, which looks like a targeting problem and is not.
3. The audience is too narrow
Layering too many conditions with AND rather than OR collapses reach. The classic version is a lookalike audience narrowed further by interests — we have seen this take a campaign from 1.4 million potential reach down to 23,500, at which point it cannot deliver regardless of budget.
A related version: a lookalike built from too small a seed. A custom audience of twenty people does not produce a usable lookalike, and the platform will not tell you that.
4. Dayparting you did not know was on
A schedule restricting when ads can run will keep an ad set dark most of the week, and it is easy to set once and forget. We found dayparting imposed on every campaign in a product — ads dark 86% of the week — with no indication in the normal interface. If delivery is sporadic rather than absent, check the schedule first.
5. Your ad sets are competing with each other
Two ad sets in the same account targeting overlapping audiences bid against each other, and the platform will often suppress one rather than let you compete with yourself. Symptom: one ad set delivers well, a near-identical one delivers nothing.
Worth testing properly rather than assuming, though. We suspected auction competition on a stalled campaign, paused the competing campaign for thirty minutes, and delivery stayed at exactly zero — so it was not the cause that time. Pause and observe before restructuring.
6. The creative was rejected and you were not told clearly
A rejected ad inside an otherwise active ad set produces an ad set that looks live and serves nothing. Check at the ad level, not the campaign level — the status that matters is the one furthest down.
Three patterns get rejected constantly and AI-written copy produces all three: implied personal attributes ("Are you struggling with debt?"), before-and-after imagery in health categories, and unrealistic outcome claims.
7. The payload is subtly invalid
Rarer, but real, and invisible without checking. Some combinations of objective, optimisation goal and promoted object are rejected by the platform in ways that produce an ad set which exists and never runs properly.
A concrete one we found: a sales objective with link-click optimisation and a page promoted object is rejected outright, while the identical combination under a traffic objective is accepted. It only breaks for someone who picks sales, has a website and no working pixel.
💡 Meta accepts a validate-only flag on ad set creation — it checks a payload against the live API and returns the real errors without creating anything or spending anything. Running every combination through it found a launch-breaking bug that code review and over a hundred real-data comparisons had both missed. If you build campaigns programmatically, this is the single most useful tool available.
8. Billing, and the boring things
Last because it is obvious, but it does happen: a declined card, a hit spending limit, an account in review, or a Page restriction. Check the account-level notifications, not just the campaign.
A diagnostic order that saves time
Hour 0–5
Do nothing. It is almost certainly normal. Resist every instinct to adjust.
Hour 6
Check ad-level status for rejection, then account-level billing and limits.
Hour 12
Check the budget against the platform floor for that objective, and check the schedule for dayparting.
Day 2
Check audience size and overlap. If narrow, widen rather than rebuilding.
Day 2, last resort
Duplicate the ad set fresh and leave the new one completely alone. Do not edit it.
And throughout: count how many times you have changed it. If the answer is more than once, that is your answer.
Built once, validated, then left alone
Adyft validates every ad set against the platform before launch, checks your budget against the real minimum, and does not rewrite live campaigns. 14-day free trial, no card.
Start free — no card needed