Promotion criteria

Each rung of the bidding ladder has a strict promotion threshold. The agent waits until thresholds are met before promoting and gates auto-execution on fleet-wide rule success rates.

Thresholds at a glance

TransitionPrimary signalThresholdAuto-execute
1 → 2 (Manual to Volume)Clicks or conversions100+ clicks OR 30+ conv/30dMax with hands-free + ≥80% rule success rate
2 → 3a (Volume to Value)Paid invoices via Jobber30+ paid invoices/30d + 50+ total conversionsMax with hands-free + Jobber connected
3a → 3b (Value to Target ROAS)Stable observed ROAS50+ paid invoices/30d + 2-week ROAS variance <20%Max with hands-free

Stage 1 → Stage 2

Triggered by the bidding_strategy_upgrade diagnostic. Two paths:

  • Click-volume path. 100+ clicks on MANUAL_CPC, before 30 conversions. Suggests MAXIMIZE_CLICKS so Google's algorithm can optimize click volume automatically.
  • Conversion-volume path. 30+ conversions in 30 days. Suggests MAXIMIZE_CONVERSIONS. If conversion CPA variance is low (predictable cost per lead), suggests TARGET_CPA with target = recent average CPA × 1.1.

Auto-executes on Max when fleet-wide success rate forswitch_bidding_strategy in your category is ≥80% across 10+ samples. Pre-execution state captures the prior strategy for rollback. Outcome measured at T+24h and T+7d.

Stage 2 → Stage 3a

Triggered by promote_to_revenue_bidding. Gates:

  • Campaign has all 4 conversion actions from the Phase 36 split
  • REVENUE action is currently secondary (primary_for_goal=false)
  • 30+ paid invoices uploaded in the last 30 days
  • 50+ total conversions in the last 30 days
  • Jobber connection active (signal source for paid invoices)

Executor runs a two-phase mutate:

  1. Flip REVENUE to primary, demote all other actions to secondary.
  2. Update campaign.biddingStrategyType from MAXIMIZE_CONVERSIONS to MAXIMIZE_CONVERSION_VALUE.

Outcome measured at T+24h, T+7d, T+14d. Auto-rollback if any window shows worsened metrics by the meaningful-class thresholds.

Stage 3a → Stage 3b

Triggered by ready_for_target_roas. Gates:

  • REVENUE action is primary AND campaign is on MAXIMIZE_CONVERSION_VALUE
  • 50+ paid invoices in the last 30 days
  • At least 2 weeks since the promotion to Stage 3a (or campaign.start_date if imported)
  • Observed ROAS calculated from jobber_paid_invoices.conversion_value_cents / cost_micros over 28-day window
  • Week-over-week ROAS variance under 20% (stability test)

Executor sets biddingStrategyType=TARGET_ROAS with targetRoas = observed × 0.9 (90% of observed ROAS, leaving 10% headroom for growth without choking spend).

On Max with hands-free, this is meaningful blast radius. Outcome measured at T+14d. Auto-rollback if conversions drop more than 20% or cost increases more than 25%.

Target ROAS recalibration

Every 30 days, the agent checks if observed ROAS has drifted more than 15% from the locked target. Drift triggers a newready_for_target_roas recommendation with an updated target:

  • If observed has risen: new target = observed × 0.9 (capture the headroom)
  • If observed has fallen: new target = observed × 0.9 (avoid choking spend)

Each recalibration is its own session with its own pre-execution snapshot + rollback path.