Scale
Move money toward what is working and away from what is not.
Scaling is two decisions that look like one: is this entity actually a winner, and how much more can it take without breaking. Get the first wrong and the second does damage.
Prerequisite: the marketing-os foundation skill. You cannot decide either
question without breakEvenRoas and get_guardrails.
The gate — all four must hold before scaling up
All thresholds from marketing-os/references/thresholds.md.
- Profitable. ROAS ≥ 1.3 × break-even — in both the 7d and 30d windows. One good week is not a winner.
- Out of learning. The ad set has 50 or more conversions in the trailing
7 days. Below that, a budget change resets learning and destroys the
evidence. The correct action is
maintain, however good the ROAS looks. - Not fatigued. 3-day CTR is at or above 70% of the 30-day CTR. Scaling a fatiguing creative buys more of a declining response.
- Room under the ceiling. The new daily budget fits
dailySpendCapCents, and the month's projection fitsmonthlySpendCapCents.
Fail any one and the answer is not "scale smaller" — it is the specific other action: hold through learning, refresh the creative, or raise the cap (which only a human can do).
How much
new daily budget = min(
current × 2, # the platform's hard step limit, both directions
current × (1 + maxBudgetIncreasePct / 100), # this business's step guardrail
dailySpendCapCents # this business's absolute ceiling
)- 2 × is the ceiling on a single step, in either direction: never more than doubled, never more than halved at once.
maxBudgetIncreasePctdefaults to 100 — a doubling needs explicit confirmation viaconfirmLargeChange. That flag clears the step rule only; the spend caps and the ROAS floor cannot be confirmed away.- Budget lives on a CBO campaign or an ad set, never on an ad. Aiming a budget change at an ad is refused.
- Meta's practical floor is 100 cents/day.
- After a raise, the ad set re-enters learning if the change is large. Say so, and set expectations at 7 days.
How to scale down
Check the owner's rules first. rules_list shows the automated rules that
already pause, re-enable or move budgets every morning. Never scale or pause
against an enabled rule; if you think one is wrong, say so instead.
The same clamp applies from below: never cut more than 50% in one step. An 80% cut is clamped to 50% — and it should be, because an over-aggressive cut starves an entity that was merely marginal.
| Situation | Action |
|---|---|
| ROAS below 0.8 × break-even in both windows, with real spend | meta_pause_entity (low — it runs immediately) |
| 7d spend > 3 × target CPA/CPL with zero conversions and zero leads | pause — the lead-gen kill signal, valid with no break-even ROAS at all |
| Between 0.8 × and 1.0 × break-even, sustained, out of learning | scale down, clamped to 0.5 × |
| Bad in one window only | leave it. Come back in a week |
meta_pause_entity is low tier — it happens immediately. It is the one
write here that does not wait for approval, because stopping a loss is
reversible and delay is the expensive option. Everything that starts or
increases spend — meta_activate_entity, meta_set_budget — is high and
files an approval.
A bid strategy is the last lever, not the first. meta_set_bid_strategy
(high) sets a cost cap, bid cap or minimum ROAS, and every change resets
Meta's learning phase. Reach for it only after a budget change and a creative
change have been tried; a cap under a quarter of the recent cost per result is
refused because it would stop delivery.
Let the engine argue first
meta_get_recommendationsThe recommendation batch already carries prioritized actions with the reasoning chain, the exact metrics cited and the precise change — including exact cents for budget moves. Read it before forming your own view; when you disagree, say what you are seeing that it did not.
meta_implement_recommendation (high) applies one, but only
autoImplementable ones. For the rest, do the equivalent change yourself with
meta_set_budget or meta_pause_entity.
meta_generate_recommendations (low) asks for a fresh batch: returns
immediately in generating, has a 24-hour cooldown, needs synced Meta data,
and costs AI credits. Poll meta_get_recommendations for the result rather than
promising one.
Scaling is not only a budget
This is the part a Meta-only tool cannot do. When something works, the cheapest scale is usually not more spend:
- Repeat the winning angle organically. Take the winning ad's message into a
social_create_postacross the connected platforms — same claim, native format. Zero marginal cost. - Write it down.
add_knowledgewith kindpast_campaignso every future run cites the real result instead of re-deriving it. - Turn it into content.
create_marketing_asset_draft— a winning hook is a blog post's angle and an email's subject line. - Widen the geography. Check
allowedCountries/excludedCountriesfirst; a new country is a new campaign plan, not a budget edit. - Take the local/AI-search win. If the paid message is winning, the same
language belongs in the content that
ai-search-visibilitymeasures.
Report it like this
**Scaling up**: <entity> — ROAS <x> vs. break-even <y> (both windows),
<n> conversions in 7d, no fatigue. $<a>/day → $<b>/day (clamped by <which rule>).
→ Filed for approval. Nothing has changed on Meta yet.
**Paused**: <entity> — ROAS <x> vs. break-even <y>, sustained. Done now (pausing
is reversible and immediate).
**Holding**: <entity> — profitable at <x>, but <n> conversions in 7d, still in
learning. A budget change would reset it. Revisit <date>.Name the clamp when one applies. "I asked for $300 and Marketing OS capped it at $200 — your daily cap" is the sentence that stops the next question.
Do not
- Scale anything in the learning phase.
- Scale on one window's data.
- Report a filed budget change as applied.
- Retry a guardrail refusal. Re-propose inside the number it named.
- Suggest raising a guardrail as a way to make a change fit — only a human can, in Marketing OS, and it should be their idea.
Something wrong or missing on this page? Tell us and we will fix it.