Promotion criteria
Each rung of the bidding ladder has a strict promotion threshold. The agent waits until thresholds are met before recommending a promotion. On every plan, Max included, a promotion waits for your approval.
Thresholds at a glance
| Transition | Primary signal | Threshold | Approval |
|---|---|---|---|
| 1 → 2 (Manual to Volume) | Clicks or conversions | 100+ clicks OR 30+ conv/30d | Yours, on every plan |
| 2 → 3a (Volume to Value) | Paid invoices via Jobber | 30+ paid invoices/30d + 50+ total conversions | Yours (needs Max + Jobber for the invoices) |
| 3a → 3b (Value to Target ROAS) | Stable observed ROAS | 50+ paid invoices/30d + 2-week ROAS variance <20% | Yours, on every plan |
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.
Never applied by itself, Max included: you approve it on the Optimize tab. Pre-execution state captures the prior strategy for rollback. Outcome measured at T+7d and T+14d (a bidding strategy change is not judged at T+24h).
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 connected on the Max plan (the source of 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.
Waits for your approval on every plan. Outcome measured at T+7d and T+14d (not judged at T+24h). Auto-rollback if a 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).
This waits for your approval on every plan, Max included. Outcome measured at T+7d and T+14d. Auto-rollback if, for example, 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.