Kill, keep or scale: decision rules for every ad set
Most ad sets are left running because nobody decided. Here are explicit thresholds for turning one off, leaving it alone, or giving it more money.
The expensive thing about a mediocre ad set is not the money it wastes. It is the decision you keep postponing.
An ad set that is neither clearly working nor clearly failing will sit there for weeks, absorbing budget and attention, because every time you look at it the honest answer is “not sure yet”. The fix is to decide the thresholds in advance, when you are not looking at the numbers, and then apply them mechanically.
Here is a set that works for a Shopify store.
First, the gate: is this evidence yet?
Before any verdict, one question:
conversions in the window >= 50 → the numbers mean something
conversions in the window < 50 → the numbers do not
Below roughly 50 optimisation events, the variance swamps the signal. Ten purchases at a $22 CPA and ten at a $38 CPA are the same result statistically; you simply cannot tell them apart yet.
If you cannot reach 50 events in a reasonable window, that is a budget and structure problem, not a performance problem, and no amount of staring at the report will fix it.
Two exceptions where you may act early:
- Spend without any clicks. If an ad set has spent 2× your target CPA and produced almost no link clicks, the creative is not connecting and you do not need 50 conversions to know it.
- Policy or delivery failure. An ad set not delivering at all is a configuration issue, not a result.
The four verdicts
Once past the gate, every ad set falls into one of four buckets. Work out your break-even ROAS first — it is 1 / gross margin, and the whole table depends on it.
| Condition | Verdict | What to do |
|---|---|---|
| ROAS ≥ 1.25 × break-even, stable across days, out of learning | Scale | +20% every 3–4 days |
| ROAS between 0.9 and 1.25 × break-even | Keep | Change nothing. Improve creative, not budget |
| ROAS < 0.9 × break-even, but healthy CTR and add-to-cart | Fix | Problem is downstream — price, page, checkout |
| ROAS < 0.9 × break-even, weak CTR, 2× CPA spent | Kill | Turn off. Bank the learning |
The 1.25 multiplier is the part people skip. Scaling at exactly break-even is scaling into a loss, because the CPM you pay rises as you spend more — the ROAS you are scaling from is not the ROAS you will get.
What “stable across days” means, concretely
Aggregate ROAS hides the variance that hurts you.
An ad set that produced 4.1, 0.6, 3.8, 0.4 and 3.9 has the same seven-day average as one that produced 2.5 every day. The second is a scaling candidate. The first is a lottery ticket that happened to pay out.
A usable test: take the daily ROAS figures, and check that the worst day is at least half the best day. If it is not, you have volatility rather than performance, and more budget will amplify it.
The kill rules, stated plainly
Turn an ad set off when any of these is true:
- Spend has reached 2× your target CPA with zero purchases. At that point you are paying to confirm something you already know.
- CTR (link) is below 0.5% after 2,000 impressions. The creative is the problem, and a new budget will not change it.
- ROAS has been under break-even for two consecutive weeks with more than 50 conversions in each. This is a real result, not a bad patch.
- CPA has risen for four consecutive days after a budget increase and stepping the budget back did not recover it. The audience is exhausted.
Killing an ad set is not a failure and it is not wasted money — you bought an answer. The failure is paying for the answer and then not using it.
The rule that saves the most money
Do not change two things at once.
When an ad set is underperforming, the temptation is to change the creative, widen the audience and cut the budget in the same session. If it recovers, you have learned nothing, because you cannot tell which change did it. And you have also restarted the learning phase, so the next few days of data are not comparable to anything.
One change, three days, then read. It feels slow. It is the fastest way to accumulate knowledge that transfers to your next campaign.
Where fatigue fits
A previously good ad set that is drifting down is a different case from one that never worked. Check frequency and CPM before you kill it: rising frequency with falling CTR means the audience is tired, and the answer is new creative rather than a different verdict. Kill the ad, not the ad set.
AdPilot’s optimizer applies exactly this table to your own export, with your own margin as the break-even input — so every ad set comes back with a verdict and the specific numbers that produced it, instead of a dashboard you have to interpret.