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
| Transition | Primary signal | Threshold | Auto-execute |
|---|---|---|---|
| 1 → 2 (Manual to Volume) | Clicks or conversions | 100+ clicks OR 30+ conv/30d | Max with hands-free + ≥80% rule success rate |
| 2 → 3a (Volume to Value) | Paid invoices via Jobber | 30+ paid invoices/30d + 50+ total conversions | Max with hands-free + Jobber connected |
| 3a → 3b (Value to Target ROAS) | Stable observed ROAS | 50+ 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:
- Flip REVENUE to primary, demote all other actions to secondary.
- Update
campaign.biddingStrategyTypefrom 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_microsover 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.