# Budget protection

> Spend ceilings, budget ceilings and step-down rules that bound how much a Meta campaign can spend before a person looks at it again.

Source: https://adops.id/use-cases/budget-protection/
Last updated: 2026-08-20
Publisher: AdOps (https://adops.id) — an independent product, not affiliated with Meta Platforms, Inc.

---

## Key facts

- **Shortest check interval:** 15 minutes (Up to 96 evaluations per rule per day)
- **Dispatcher sweep:** Every 10 seconds (Overlap prevention means a slow sweep is never re-entered by the next tick)
- **Budget metrics available:** 3, Daily Budget, Lifetime budget and Remaining budget (All three are point-in-time and take no reporting period)
- **Budget actions:** 3, Increase budget, Decrease budget and Set budget (All three re-read the live Daily Budget from Meta before writing)
- **Action cooldowns:** 11 values, 15 minutes to once in a lifetime
- **Shipped template for this pattern:** Budget Cap Protection

**Who it is for:** Anyone who has opened Ads Manager in the morning and found a campaign had spent a week of budget overnight.

**The problem:** A budget typed with one extra zero, a rule from another tool, or a campaign that suddenly starts delivering can spend several days of budget between one login and the next.

**The outcome:** Spend and Daily Budget are checked as often as every 15 minutes, a campaign past its ceiling is paused and tagged, and an over-large budget is written back down to the agreed figure.

## Playbook

### Hard daily spend ceiling

- **When:** Spend today is greater than Rp 5,000,000
- **Then:** Pause campaign, and Add to name in Append mode with the text `[DAILY-CAP {date}]`
- **Why:** On a 15-minute check interval the campaign is evaluated up to 96 times a day, so the overshoot past the ceiling is bounded by one interval rather than by one night.

### Pull an edited budget back to its ceiling

- **When:** Daily Budget is greater than Rp 1,500,000
- **Then:** Set budget to Rp 1,500,000 as a fixed amount
- **Why:** This catches the extra zero and any change made outside AdOps, because the engine re-reads the live Daily Budget from Meta immediately before it writes.

### Step down before stopping

- **When:** Spend today is greater than Rp 3,000,000 AND Purchase ROAS today is less than 1.0
- **Then:** Decrease budget by 30 percent, with an action frequency of once every 2 hours
- **Why:** A 2-hour cooldown allows at most 12 reductions in 24 hours, which slows a losing campaign down in stages instead of ending the day in one move.

### Stop before a lifetime budget is exhausted

- **When:** Remaining budget is less than Rp 500,000
- **Then:** Pause campaign, and Add to name in Append mode with the text `[BUDGET-LOW]`
- **Why:** Remaining budget is read directly from Meta for the campaign, so a lifetime-budget campaign stops on a number you set rather than on Meta running out.

### Month-to-date ceiling

- **When:** Spend this month is greater than Rp 100,000,000
- **Then:** Pause campaign, and Add to name in Append mode with the text `[MTD-CAP {date}]`
- **Why:** The This month reporting period is one of 11 available on a condition, so a monthly commitment can be enforced by the same engine that enforces the daily one.

AdOps bounds Meta ad spend with two kinds of rule: one that watches Spend and pauses a campaign past a ceiling, and one that watches Daily Budget and writes an over-large budget back down. Both are evaluated as often as every 15 minutes, and every change is written to a per-campaign log with the value before and after.

## What actually causes a runaway campaign?

Rarely a mystery. It is a budget typed with an extra zero, a lifetime budget that was meant to be a daily one, a campaign that finally exits a slow start and begins delivering at full pace, or a second tool with its own opinion about budgets. In every case the account is fine at 22:00 and wrong by 07:00.

The cost is not only the money. It is that the next morning is spent reconstructing what happened instead of working, which is the part a log fixes.

## How does a spend ceiling work in AdOps?

Spend is one of 45 metrics available in a condition, and it accepts all 11 reporting periods. Spend today greater than Rp 5,000,000 paired with Pause campaign is the whole rule. Adding Add to name in Append mode with `[DAILY-CAP {date}]` leaves the reason on the campaign so the morning review does not start from zero.

Be honest with yourself about precision. AdOps checks the condition on the rule's interval, not continuously, and the shortest interval is 15 minutes. Spend that happens between two evaluations is not prevented, so set the ceiling below the figure you genuinely cannot exceed rather than exactly at it.

## Why cap the budget as well as the spend?

Because they fail differently. A spend rule reacts after the money is gone; a budget rule stops the money being available in the first place.

Daily Budget, Lifetime budget and Remaining budget are all metrics in the rule builder, and all three are point-in-time values that take no reporting period. A rule that reads Daily Budget greater than Rp 1,500,000 and responds with Set budget to Rp 1,500,000 as a fixed amount will pull back a manual edit, a change made by another tool, or an over-eager scaling rule of your own.

Set budget takes a fixed amount or a value resolved from a custom metric. It does not take a percentage, which suits a ceiling: the number should not drift with whatever the budget reached yesterday.

## What order should these rules run in?

| Rule | Metric | Check interval | Action |
| --- | --- | --- | --- |
| Pull an edited budget back | Daily Budget | 15 minutes | Set budget to the ceiling |
| Step down before stopping | Spend today, Purchase ROAS today | 30 minutes | Decrease budget by 30 percent |
| Hard daily spend ceiling | Spend today | 15 minutes | Pause campaign and tag |
| Month-to-date ceiling | Spend this month | 1 hour | Pause campaign and tag |
| Stop before a lifetime budget runs out | Remaining budget | 30 minutes | Pause campaign and tag |

Put the budget ceiling on the shortest interval, because it prevents rather than reacts. Give the step-down rule a cooldown so it reduces in stages: an action frequency of once every 2 hours allows at most 12 reductions in 24 hours.

## What proof is there that a rule fired?

Every pass writes a batch record plus one result per campaign per task. The Rule Log Detail screen shows, for each campaign and each task, an Executed, Not Executed or Skipped badge, every condition marked Pass or Fail beside the value it read, the parameters the action used, the execution time in seconds, and the next scheduled execution. Budget and name changes also record the value before and after.

Skipped is the badge worth understanding. It appears when an action's cooldown blocked execution, which is how you confirm that a step-down rule is pacing itself rather than failing.

## What a budget rule cannot promise

AdOps cannot guarantee a spend figure is never exceeded. It evaluates on an interval, it depends on the numbers Meta's Insights API reports at that moment, and Meta continues delivering between evaluations. Treat a rule as a bound on how long a mistake can run, not as a hard limit on the platform.

A rule also only covers ad accounts you have activated in AdOps, since every account discovered from Meta starts inactive. Actions are campaign-shaped, so budget protection is enforced at campaign level. AdOps connects to Meta Ads today, with TikTok Ads, Google Ads and Snapchat Ads listed as coming soon.
