wikis / Meta Ads / wiki / syntheses / budget-bid-recipes.md view as markdown
Budget & Bid Recipes
Decision guide for the three money levers in Meta Ads: where the budget lives (campaign vs ad set), how bids are constrained (bid strategy), and how spend is released over time (pacing). Official Marketing API semantics are stated first (high confidence); practitioner heuristics are tiered below them (medium confidence, attributed). Background: budgets bidding, campaign structure.
Comparison
CBO (Advantage campaign budget) vs ABO (ad set budgets) — official semantics
| Dimension | CBO / Advantage campaign budget | ABO (ad set budgets) |
|---|---|---|
| Budget fields | daily_budget / lifetime_budget on the campaign |
daily_budget / lifetime_budget per ad set (amounts in the account currency's minimum denomination, e.g. cents) |
| Allocation | Meta "automatically and continuously finds the best available opportunities for results across your ad sets and distributes your campaign budget in real time" (official) | You fix spend per ad set; disable CBO via adset_budgets=[{"adset_id":..., "daily_budget":...}] |
| Bid strategy | Defined at the campaign level, shared by all ad sets: LOWEST_COST_WITHOUT_CAP, COST_CAP, LOWEST_COST_WITH_BID_CAP, LOWEST_COST_WITH_MIN_ROAS |
Per ad set via bid_strategy / bid_amount |
| Ad-set guardrails under CBO | daily_min_spend_target, daily_spend_cap, lifetime_min_spend_target, lifetime_spend_cap (best effort, not guaranteed; remove by setting 0 or empty) |
n/a (budget itself is the control) |
| Pacing | Budget pacing at the campaign level; pacing_type set at campaign level |
Budget pacing at the ad set level |
| Hard limits | All optimization goals must match across ad sets under auto bid; optimization goals not editable after the campaign runs; LOWEST_COST_WITH_MIN_ROAS cannot be switched to another strategy after creation; campaigns with more than 70 ad sets cannot edit bid strategy or turn CBO off |
— |
Bid strategy by margin-control need — official semantics
| You need | Strategy (verbatim enum) | Mechanics | Pair with |
|---|---|---|---|
| Maximum volume, no cost control | LOWEST_COST_WITHOUT_CAP |
Auto-bid; Meta raises your effective bid as needed to spend the budget. Default. With optimization_goal=VALUE, Ads Manager displays this as Highest Value |
Nothing extra |
| Average CPA held near a target | COST_CAP |
"Get the most results possible while we strive to meet the cost per action you set." Requires bid_amount (the cap). Adherence to cost cap limits is not guaranteed (official) |
bid_amount |
| Hard ceiling on the auction bid itself | LOWEST_COST_WITH_BID_CAP |
Maximum bid across auctions; requires bid_amount (per ad set via adset_bid_amounts under CBO) |
bid_amount |
| ROAS floor (margin protection on value) | LOWEST_COST_WITH_MIN_ROAS |
Requires bid_constraints={"roas_average_floor": N}; valid range of roas_average_floor is [100, 10000000], i.e. minimum ROAS 0.01–1000.0 (so 10000 = 1.0x). optimization_goal must be VALUE; cannot use bid_amount with bid_constraints |
bid_constraints |
Bid setup guidance (official Bidding Overview): "Bid your true value" — bid the maximum you're willing to pay per optimization event; actual cost per result is usually at or below bid_amount. billing_event (what you pay for, e.g. IMPRESSIONS) is independent of optimization_goal (who delivery seeks).
Budget types and pacing — official semantics
daily_budget: average per day; on high-opportunity days up to 25% more than your daily budget may be spent (e.g. $10 → up to $12.50), averaged out over the week.lifetime_budget: total over the run; spend is uneven by design ($250 over 5 days might pace $50/$50/$75/$25/$50).pacing_typeoptions (campaign level under CBO, else ad set):standard(default — bid adjusted through the day for smooth delivery),no_pacing(accelerated delivery — full max bid in every eligible auction; budget can exhaust early; only sensible for flash sales, live events, key seasonal pushes; pointless if you're already under-delivering from low bid/narrow audience),day_parting(ad scheduling viaadset_schedule; lifetime budgets only; schedule applies in the audience's timezone, hours on the hour, ≥1h blocks).- Partial days: an ad set starting at 6 PM tries to deliver only ~25% of its daily budget before midnight.
- Official FAQ on changes: every budget/bid change forces the system to re-learn the optimal bid — "you should not change bid and budget frequently"; if you must, limit to 2–3 times a day, early in the day.
Learning phase — official + community
- Official (Graph API
learning_stage_infoon ad sets):statusisLEARNING,SUCCESS, orFAIL("isn't generating enough results to exit");conversionscounts events since the last significant edit (resets to learning on significant edits);last_sig_edit_tsrecords that edit. Only returned for active ad sets. - Community consensus threshold (medium, Lebesgue + Social Media Examiner): ~50 optimization events per ad set within 7 days to exit; short of that, the delivery column shows Learning Limited.
Analysis
- CBO and ABO answer different questions. CBO maximizes campaign-level results given freedom to move money; ABO buys you per-segment control and clean tests at the cost of liquidity. The official docs are mechanism-only; the when comes from practitioners: CBO for scaling proven structures and saving management time, ABO for testing audiences/creatives/regions and for strict per-market budgets (Cropink, Lebesgue — medium). Lebesgue's dataset even shows ABO out-performing CBO on prospecting ROAS (94% vs 81%, medium, single vendor) — see community field notes.
- Margin control is a ladder, not a binary. No cap → cost cap (average CPA) → bid cap (per-auction ceiling) → min ROAS (value floor). Each rung trades delivery volume for predictability; cost caps are explicitly best-effort. Min ROAS is the only one that operates on value rather than cost, and it locks you in (no strategy switch after creation).
- The learning phase is a budget-math problem. If budget ÷ cost-per-result × 7 < 50, the ad set mathematically cannot exit learning. Every guardrail above (20% budget-change rule-of-thumb, few ad sets, no mid-flight edits) is downstream of that arithmetic (community, medium — the 50/7 numbers do not appear in the ingested official API docs; the API only exposes thresholds via
dynamic_lp_conversions_threshold/dynamic_lp_days_threshold). - Pacing interacts with everything: budget changes trigger bid re-learning; switching
billing_eventre-adjusts pacing; under CBO the pacing and the budget both live at the campaign level, so per-ad-set spend visibility drops (Lebesgue's stated reason to prefer ABO for insight).
Recommendations
Recipe 1 — Testing (audiences/creatives/markets): ABO. 3–5 ad sets, one variable each, equal budgets, broad audiences unless testing the audience itself. Don't touch anything for 3–5 days. (Community, medium.)
Recipe 2 — Scaling a proven structure: CBO (LOWEST_COST_WITHOUT_CAP), 3–5 ad sets, varied creative formats per ad set, daily_min_spend_target floors on cold/niche ad sets so warm audiences don't starve them. Scale +10–20% every 2–3 days; for bigger jumps, duplicate the campaign and re-enter learning deliberately. Judge at campaign level only. (Official mechanics + community cadence.)
Recipe 3 — Margin-protected e-commerce: Sales campaign, optimization_goal=VALUE, bid_strategy=LOWEST_COST_WITH_MIN_ROAS, bid_constraints={"roas_average_floor": <100×your minimum ROAS>}. Remember: locked after creation; only PURCHASE events for value optimization under Advantage+ shopping (objective picker, advantage plus campaigns).
Recipe 4 — Learning-phase-aware budget sizing: daily budget per ad set = cost-per-result × 50 ÷ 7 (e.g. $10 CPA → $72/day; two ad sets under CBO → $144/day campaign budget). If you can't fund that, cut ad sets (consolidate audiences) rather than switching to a cheaper optimization event — optimizing for add-to-cart to exit learning buys you cart-adders, not buyers. Avoid resets: keep budget changes ≤20% per ~72h, never edit audiences in place (duplicate instead), and bulk-create spare ads at launch (paused) so you can rotate without adding new ads. (Community, medium; reset mechanics corroborated by official last_sig_edit_ts semantics.)
Recipe 5 — Time-boxed promos: lifetime budget + day_parting schedule (audience timezone), or no_pacing for genuine flash sales — accepting that budget may exhaust before day's end. (Official.)
Anti-patterns: >70 ad sets under CBO (locks your bid strategy); frequent intra-day bid/budget edits; judging CBO ad sets individually; overlapping audiences competing in the auction; tiny daily budgets on Purchase optimization. See also attribution reporting before concluding a budget change "hurt performance" — measurement changes can masquerade as delivery changes (community field notes).
Pages Compared
- budgets bidding — core concept page
- campaign structure — campaign/ad set/ad hierarchy these levers attach to
- advantage plus campaigns — CBO is mandatory plumbing in Advantage+ setups
- audiences — audience size ↔ budget interaction
- community field notes — the practitioner claims tiered here
- objective picker — objective choice upstream of bid strategy
- marketing api — field-level reference for everything verbatim above
