---
name: set-minimum-viable-budget
description: >-
  Sizes the daily or lifetime budget an ad set needs to plausibly exit learning, using the floor heuristic
  daily budget ~ target cost-per-result x 50 / 7 - enough headroom to bank roughly 50 optimization events
  within a week. Covers daily vs lifetime budgets and CBO vs ABO minimums: under Advantage Campaign Budget
  every ad set still needs its own share of ~50 events, since campaign-level spend is distributed by
  opportunity, not split evenly. Money is in the currency's minor unit - a $50.00 daily budget is
  daily_budget=5000. When the floor is unaffordable at the deepest optimization event, the fix is a
  shallower or cheaper event, or consolidating ad sets, never underfunding it. Reach for it at every new
  build, when an ad set is Learning Limited and budget is suspect, and before activating spend. It ends at a
  defensible daily number checked against funding - the target cost-per-result and event come from
  select-campaign-objective, and scaling up is scale-budget-vertically.
---
# Set the Minimum Viable Budget

## Purpose
A budget below the learning floor guarantees Learning Limited before the first real optimization signal
even lands; a budget with no relationship to the target cost-per-result either wastes headroom or slides
into a slow-motion under-delivery problem. This skill turns a target cost-per-result into a daily (or
lifetime) number the ad set can actually spend and learn on, placed at the right level for CBO or ABO.

## When to run
- Sizing the daily or lifetime budget for a new campaign or ad set.
- An ad set is Learning Limited and budget is a suspect.
- Moving between ABO and CBO and budgets need re-deriving per ad set's share.
- The target cost-per-result changed (new event, new market) and the old budget number no longer
  reflects it.

## When NOT to run
- The target cost-per-result or optimization event itself isn't decided yet → `select-campaign-objective`.
- The floor is already right-sized and the question is growing a winner → `scale-budget-vertically`.
- The ad set is Learning Limited for structural reasons other than budget → `consolidate-fragmented-account`,
  `exit-learning-limited`.
- The bid strategy hasn't been chosen → `select-bid-strategy` (pick the strategy alongside sizing the
  budget, not after).

## Prerequisites
- Target cost-per-result for the chosen optimization event (`select-campaign-objective` or recent
  performance history).
- Know whether the campaign runs CBO (campaign-level budget) or ABO (ad set-level budgets), and how many
  ad sets share the campaign under CBO.
- Current account funding status via `mads_get_funding_source`.

## Procedure
1. **Get the target cost-per-result.** Pull it from the objective decision (`select-campaign-objective`),
   or from recent `mads_run_insights` history if calibrating an existing campaign's average.
2. **Apply the floor heuristic.** `daily_budget ≈ target cost-per-result × 50 ÷ 7`, enough to plausibly
   deliver ~50 optimization events in a week. Example: a $40 target cost-per-result gives
   40 × 50 ÷ 7 ≈ $286/day.
3. **Convert to minor units.** Meta budgets and bids are in the currency's minor unit, a $286.00 daily
   budget is `daily_budget=28600`; a $50.00 floor is `daily_budget=5000`. State both the human number and
   the minor-unit value before calling `mads_create_campaign` / `mads_create_adset` or their `_update`
   equivalents.
4. **Place it at the right level.** CBO: the campaign-level `daily_budget` must cover the floor for every
   ad set it funds, not just one, Advantage Campaign Budget distributes spend by opportunity, it does
   not guarantee each ad set its own ~50 events. With N ad sets sharing a scarce event, budget nearer
   N × floor, or reduce N. ABO: set `daily_budget` per ad set directly against its own floor.
5. **Choose daily vs lifetime.** Default `daily_budget` for ongoing always-on delivery, it smooths
   pacing and is easiest to reason about against the ~50/week floor. Use `lifetime_budget` only for a
   fixed-window flight, sized as floor × campaign length in days, and let Meta's own pacing manage the
   daily rate.
6. **If the floor is unaffordable, change what it's measuring, not the floor itself.** An unaffordable
   floor at the deepest event (e.g., Purchase) means: optimize a shallower or cheaper event instead
   (AddToCart, LandingPageView, see `select-campaign-objective`), or consolidate ad sets so the event
   pools across fewer, better-funded ad sets (`consolidate-fragmented-account`), never just underfund the
   deep event and hope.
7. **Leave auction headroom.** Don't treat the heuristic number as a hard ceiling with zero slack, the
   auction needs room to bid competitively for the best opportunities; treat it as a floor to meet or
   exceed.
8. **Check funding before activating.** Call `mads_get_funding_source` to confirm the payment method and
   spend cap can sustain the proposed budget, daily and projected monthly, before flipping anything live.
9. **Preview, diff, approve, commit.** Entity, field (`daily_budget` or `lifetime_budget`), from → to,
   expected impact, including that a budget change of roughly more than 20% resets learning on a live ad
   set. **HUMAN STEP.** Get explicit approval before committing. Commit via `mads_create_campaign` /
   `_update` or `mads_create_adset` / `_update`, with `status=PAUSED` on new builds until reviewed.
10. **Hand off.** Budget in place and stable → `scale-budget-vertically` when it's time to grow a winner.

## Decision rules
- IF `daily_budget` is under target cost-per-result × 50 ÷ 7 THEN the ad set is under-floor, expect
  Learning Limited regardless of everything else being correct.
- IF a CBO campaign funds N ad sets sharing one scarce event THEN size campaign `daily_budget` nearer
  N × the per-ad-set floor, or cut N, a budget sized for one ad set starves the rest under
  opportunity-based CBO distribution.
- IF the floor at the deepest optimization event is unaffordable THEN move to a shallower or cheaper
  event, or consolidate ad sets, do not launch underfunded.
- IF the flight has a fixed end date THEN use `lifetime_budget = floor × flight days`; otherwise default
  to `daily_budget`.
- IF an existing live ad set's budget needs to move by roughly more than 20% to reach the floor THEN
  treat the change as a learning-reset event and time/batch it (`manage-the-learning-phase`).
- IF `mads_get_funding_source` shows an insufficient spend cap or a payment issue THEN resolve funding
  before activating, never launch a budget the account can't actually spend.
- **Done means:** a daily or lifetime budget in minor currency units, placed at the correct level
  (campaign for CBO, ad set for ABO), that can plausibly deliver ~50 optimization events per ad set per 7
  days, checked against funding.

## Common failure modes
- **Budget below the floor from day one.** Guarantees Learning Limited before the first meaningful data
  point.
- **A CBO campaign funded for one ad set, split across five.** Every ad set individually starves even
  though the campaign total "looks" adequate on paper.
- **Shrinking the floor to fit the budget** instead of choosing a shallower event or consolidating, a
  deep event that can't be fed is worse than a shallow one that can.
- **Confusing `lifetime_budget` with `daily_budget`**, sizing a lifetime number as if it were a daily
  one (or the reverse), wildly over- or under-pacing the flight.
- **Skipping the funding check** and activating a budget the payment method can't sustain, stopping
  delivery mid-flight.

## Related skills
- Before: `select-campaign-objective` (target cost-per-result and event), `select-bid-strategy` (strategy
  chosen alongside budget).
- After: `scale-budget-vertically` (grow the budget once delivery is stable).
- Related: `manage-the-learning-phase` (what a budget change here does to the learning clock),
  `consolidate-fragmented-account` (structural alternative to underfunding).
