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.

  1. Profitable. ROAS ≥ 1.3 × break-even — in both the 7d and 30d windows. One good week is not a winner.
  2. 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.
  3. 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.
  4. Room under the ceiling. The new daily budget fits dailySpendCapCents, and the month's projection fits monthlySpendCapCents.

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.
  • maxBudgetIncreasePct defaults to 100 — a doubling needs explicit confirmation via confirmLargeChange. 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.

SituationAction
ROAS below 0.8 × break-even in both windows, with real spendmeta_pause_entity (low — it runs immediately)
7d spend > 3 × target CPA/CPL with zero conversions and zero leadspause — the lead-gen kill signal, valid with no break-even ROAS at all
Between 0.8 × and 1.0 × break-even, sustained, out of learningscale down, clamped to 0.5 ×
Bad in one window onlyleave 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_recommendations

The 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_post across the connected platforms — same claim, native format. Zero marginal cost.
  • Write it down. add_knowledge with kind past_campaign so 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 / excludedCountries first; 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-visibility measures.

Report it like this

markdown
**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.