---
name: select-bid-strategy
description: >-
  Chooses the Meta bid_strategy enum for a campaign or ad set by weighing cost control needed against
  delivery data available to calibrate it. LOWEST_COST_WITHOUT_CAP (Highest volume) is the no-cap default;
  COST_CAP holds average cost-per-result near a target; LOWEST_COST_WITH_BID_CAP sets a hard ceiling on the
  auction bid (expert, daily monitoring); LOWEST_COST_WITH_MIN_ROAS enforces a minimum return for VALUE
  optimization. New campaigns/ad sets start on LOWEST_COST_WITHOUT_CAP to bank the ~50 events/week that make
  any cap meaningful; the other three are graduations once a real target exists, never a day-one pick. Reach
  for it at every new build, when a stakeholder wants cost predictability, or when a cap is starving
  delivery and the fix is a different strategy, not a tighter number. It ends at a chosen strategy and level
  - the cap/goal number is calibrate-cost-cap-and-roas-goals, VALUE setup is set-up-value-optimization,
  learning handling is manage-the-learning-phase.
---
# Select a Meta Bid Strategy

## Purpose
`bid_strategy` decides how aggressively Meta bids into each auction on the ad set's, or, under CBO, the
campaign's, behalf. It can live at the campaign level with Advantage Campaign Budget (CBO) or at the ad
set level (ABO). Choosing it too early, before delivery data exists, calibrates a cap against nothing and
starves the ad set; choosing it too late leaves real budget with no cost control once a target is known.
This skill forces the choice through evidence, control need crossed against banked delivery data, landing on exactly one of the four enums.

## When to run
- Launching a new campaign or ad set and the bid strategy is still open.
- An account has run entirely on `LOWEST_COST_WITHOUT_CAP` and a stakeholder now wants predictable
  cost-per-result or a hard ceiling.
- Delivery is under-pacing and an existing cap or goal is the likely cause.
- Moving toward value optimization and `LOWEST_COST_WITH_MIN_ROAS` is now on the table.

## When NOT to run
- The strategy is already chosen and just needs a number → `calibrate-cost-cap-and-roas-goals`.
- The optimization goal isn't `VALUE` yet but a ROAS goal is wanted → `set-up-value-optimization` first.
- CBO vs ABO placement itself isn't decided yet → resolve that first (`choose-cbo-vs-abo`); this skill
  assumes the level is already known.
- The ad set is mid-learning and the real question is whether to touch it at all →
  `manage-the-learning-phase`.

## Prerequisites
- Campaign objective and `optimization_goal` already chosen (`select-campaign-objective`).
- For an existing entity: recent delivery history (cost-per-result, optimization-event volume).
- Know whether the budget lives at the campaign level (CBO) or the ad set level (ABO).
- `mads_get_funding_source` checked if this build will activate spend.

## Procedure
1. **Confirm the objective and optimization event are locked.** `LOWEST_COST_WITH_MIN_ROAS` specifically
   requires `optimization_goal=VALUE`, don't pick a strategy before that dependency is settled.
2. **Pull delivery history for existing entities.** Run `mads_run_insights` for the trailing 7-14
   days: optimization events per ad set and current average cost-per-result. Under ~50 events per ad set
   per 7 days means there's nothing yet to calibrate a cap against.
3. **Cross control need against data volume** via the Decision rules below to land on exactly one enum.
4. **Pick the level.** CBO: set `bid_strategy` once on the campaign via `mads_create_campaign` /
   `mads_update_campaign`, it governs every ad set inside. ABO: set it per ad set via
   `mads_create_adset` / `mads_update_adset`. Never set a conflicting value at both levels.
5. **Build the change.** New entity: include `bid_strategy`, plus `bid_amount` for `BID_CAP`, or the
   ROAS multiplier for `MIN_ROAS` (get the actual number from `calibrate-cost-cap-and-roas-goals`), in
   the create call with `status=PAUSED` until reviewed. Existing entity: prepare the update payload.
   `bid_amount` is money in the currency's minor unit, a $12.00 bid cap is `bid_amount=1200`.
6. **Preview and write a plain-English diff.** Entity, field (`bid_strategy`, `bid_amount` if set),
   from → to, expected impact, and state explicitly that changing `bid_strategy` on a live ad set
   resets its learning phase.
7. **HUMAN STEP.** Get explicit approval before committing. Name the learning-reset risk out loud if the
   entity is live, delivery will look worse before it stabilizes.
8. **Commit and confirm.** Apply via `mads_update_campaign` / `mads_update_adset` (or the `_create` call
   for new entities), then re-pull the entity to confirm the strategy landed as intended.
9. **Hand off.** `COST_CAP` / `BID_CAP` / `MIN_ROAS` chosen → `calibrate-cost-cap-and-roas-goals` for the
   number. `MIN_ROAS` chosen → also `set-up-value-optimization` if `VALUE` isn't live yet. Any live
   entity touched → `manage-the-learning-phase` to plan the reset.

## Decision rules
- IF the entity has no delivery history, or under ~50 events/week, THEN `LOWEST_COST_WITHOUT_CAP`, there is nothing yet to calibrate a cap against.
- IF delivery has run stable for 2-3+ weeks on `LOWEST_COST_WITHOUT_CAP` AND the stakeholder wants
  predictable spend THEN `COST_CAP`, calibrated off that trailing average (see
  `calibrate-cost-cap-and-roas-goals`).
- IF a specific auction ceiling must never be crossed (e.g., protecting margin on one SKU) AND someone
  will monitor it daily THEN `LOWEST_COST_WITH_BID_CAP`, otherwise default to `COST_CAP`, which reaches
  a similar outcome with far less babysitting.
- IF `optimization_goal=VALUE` AND the ad set clears ~50+ purchases/week with real value variance THEN
  `LOWEST_COST_WITH_MIN_ROAS`, set up alongside `set-up-value-optimization`.
- IF a cap or goal already in place is under-delivering (spend stalled well below the daily budget) THEN
  loosen it, or fall back to `LOWEST_COST_WITHOUT_CAP`, tightening further never fixes under-delivery.
- IF the chosen strategy differs from what's live on the entity THEN treat the change as a learning-reset
  event: time it for a low-traffic window and batch it with other pending edits.
- **Done means:** one `bid_strategy` enum, set at the correct level (campaign for CBO, ad set for ABO),
  on a named entity, with the delivery data that justified the choice written down.

## Common failure modes
- **Capping on day one.** `COST_CAP` or `BID_CAP` set from a guess before any delivery history exists
  calibrates against nothing and starves the ad set.
- **Tightening into under-delivery.** A cap that's too tight doesn't get more efficient, spend just
  stops; the fix is a realistic number (`calibrate-cost-cap-and-roas-goals`), not a smaller one.
- **Treating a strategy change as routine.** Flipping `bid_strategy` on a live, learning ad set resets it
  to Learning Limited if the change isn't flagged and approved as a reset event.
- **`MIN_ROAS` without `VALUE`.** Setting `LOWEST_COST_WITH_MIN_ROAS` while `optimization_goal` is still
  a count-based goal gives the auction no value signal to bid against.
- **A forgotten bid cap.** The auction landscape moves; a static `LOWEST_COST_WITH_BID_CAP` set months
  ago quietly throttles delivery until someone notices spend has dried up.

## Related skills
- Before: `select-campaign-objective` (locks `optimization_goal`, which gates eligible strategies),
  `choose-cbo-vs-abo` (decides the level the strategy is set at).
- After: `calibrate-cost-cap-and-roas-goals` (turns the choice into a number), `set-up-value-optimization`
  (`MIN_ROAS` + `VALUE` pairing), `manage-the-learning-phase` (plan around the reset).
