---
name: scale-budget-vertically
description: >-
  Grows spend on a proven, already-performing campaign or ad set by raising budget in controlled
  10-20% increments every ~2-3 days, so the increase never crosses Meta's significant-edit
  threshold and re-triggers learning the way a big jump reliably does. Applies the increment as a
  campaign-level Advantage Campaign Budget change (Meta redistributes it across ad sets) or as a
  per-ad-set ABO change (applied to each cell individually), always in the currency's minor unit
  (a $120/day budget is daily_budget=12000). Watches frequency, CPM, and CPA at every held step
  and stops the moment CPA breaches target or frequency signals audience saturation. Reach for it
  once an ad set has exited learning and CPA has headroom below target. It ends at a higher stable
  budget, the horizontal alternative, for when vertical stalls, is
  scale-horizontally-with-duplication.
---
# Scale Budget Vertically Without Resetting Learning

## Purpose
Meta's delivery system treats a large budget jump as a significant edit, the same category of change as
swapping the audience or the creative, and resets learning exactly the way those would. Vertical scaling
is the discipline of growing spend on a structure that already works in increments small enough that
learning never re-triggers, while watching the signals (frequency, CPM, CPA) that reveal when the audience
itself is running out of room to absorb more budget.

## When to run
- A campaign or ad set has cleared learning, is hitting target CPA/ROAS, and there is appetite to grow it.
- CPA has meaningful headroom below the target ceiling, room to absorb some efficiency loss as spend
  rises.
- Leadership wants more volume from a channel that is already proven, not a new test.

## When NOT to run
- The ad set hasn't exited learning, or is Learning Limited → `exit-learning-limited` first; scaling an
  unstable base compounds the instability.
- The structure is fragmented across too many ad sets → `consolidate-fragmented-account` first, or the
  increment just pours more money into self-competition.
- Frequency is already elevated and results are flattening at the current budget → the audience is
  saturating; go to `scale-horizontally-with-duplication` instead of forcing more spend through it.
- CPA is already at or above target with no headroom → fix efficiency before adding volume.

## Prerequisites
- Ad set/campaign has exited learning (roughly 50 optimization events delivered) with at least 3-5 days
  of stable post-learning performance to baseline against.
- Current CPA/ROAS vs. target documented, with visible headroom.
- Current frequency and CPM baseline from `mads_run_insights`, to detect saturation as budget
  rises.
- CBO vs. ABO placement already decided (`choose-cbo-vs-abo`), this changes how the increase is applied.

## Procedure
1. **Baseline before touching anything.** Pull current daily/lifetime budget, CPA/ROAS, frequency, and
   CPM via `mads_run_insights` (`mads_get_insights` to retrieve) or
   `mads_get_insights`. Every later step compares back to this number.
2. **Raise budget by 10-20%, not more.** Compute the new `daily_budget` in minor units, a $100.00/day
   budget at `daily_budget=10000` moved up 20% becomes `12000`, and apply via `mads_update_campaign`
   (CBO) or `mads_update_adset` (ABO). HUMAN STEP: preview the new figure and reasoning, get explicit
   approval, then commit, this is a real spend-affecting write.
3. **Hold for at least 2-3 days before the next step.** Delivery needs time to re-stabilize around the
   new budget even within the small-increment band; reacting to day-1 noise recreates the instability
   this procedure exists to avoid.
4. **Re-measure CPA, frequency, and CPM against the baseline.** IF CPA is within tolerance of target and
   frequency/CPM haven't spiked, THEN the increment held, proceed to the next 10-20% step. IF CPA has
   breached target or frequency is climbing fast, THEN stop scaling this node here.
5. **Repeat in 10-20% steps with a 2-3 day hold between each**, climbing until either the growth goal is
   met or a Decision-rules stop condition triggers.
6. **Route to horizontal scaling when vertical stalls.** IF CPA breaches target before the volume goal is
   met, THEN the audience is likely saturating at this spend level, hand off to
   `scale-horizontally-with-duplication` rather than continuing to push the same ad set past what its
   audience supports.
7. **Watch CBO vs. ABO mechanics while scaling.** Under CBO, verify the increase is actually reaching the
   ad sets intended, Meta redistributes toward whichever is cheapest, which can concentrate it on one
   cell. Under ABO, apply the increment per ad set individually so no cell jumps disproportionately.
8. **Document the new stable budget** and the CPA/frequency it settled at. This becomes the next baseline
   and the number reported to the stakeholder.

## Decision rules
- **Increment size:** 10-20% of current budget per step. Below ~10% barely moves spend; above ~20% risks
  crossing Meta's significant-edit threshold and resetting learning.
- **Hold period:** minimum 2-3 days between increments, long enough for delivery to re-stabilize, short
  enough that a stalled scale-up doesn't drag for weeks.
- **Stop condition, CPA:** stop increasing the moment CPA breaches the target ceiling on a held step; do
  not average across a bad step hoping it recovers.
- **Stop condition, saturation:** frequency climbing sharply with CPM rising and results flattening means
  the audience, not the budget, is the constraint, stop vertical scaling and switch to
  `scale-horizontally-with-duplication`.
- **CBO vs. ABO application:** CBO is one campaign-level number Meta redistributes; ABO must be raised per
  ad set, raising one ad set's budget does not scale the others.
- **Lifetime budgets:** avoid mid-flight percentage increments on a lifetime-budget campaign, since Meta
  re-paces the entire remaining schedule off the new total; convert to daily first if frequent scaling is
  expected.
- **Money in minor units, always**, a $120/day budget is `daily_budget=12000`, not `120`.
- **Done means:** budget raised in documented 10-20% steps each held 2-3 days, CPA/frequency/CPM tracked
  at every step, scaling stopped at the first breach rather than pushed through it, and a final stable
  budget plus performance figure recorded.

## Common failure modes
- **Doubling or tripling budget in one move** because the campaign is performing well, reliably resets
  learning and spikes CPA right when confidence was highest.
- **Reacting to single-day noise** by reversing an increment after 24 hours instead of holding the 2-3
  day window, mistakes normal post-increment volatility for failure.
- **Scaling CBO and assuming even distribution**, Meta concentrates the extra budget on the cheapest ad
  set, which can silently starve the others.
- **Continuing to push budget past a CPA breach**, hoping the next increment catches up, it doesn't;
  that is the signal to stop or go horizontal.
- **Percentage-incrementing a lifetime budget mid-flight** and getting an unpredictable re-pacing across
  the remaining schedule instead of the intended daily bump.

## Related skills
- Alternative: `scale-horizontally-with-duplication` (use when vertical stalls or the audience saturates).
- Requires first: `exit-learning-limited` (must have exited learning), `consolidate-fragmented-account`
  (structure must not be fragmented before scaling it).
- Related: `choose-cbo-vs-abo` (determines how the increment is applied), `select-campaign-objective` (the
  CPA target being protected comes from here).
