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

TransitionPrimary signalThresholdApproval
1 → 2 (Manual to Volume)Clicks or conversions100+ clicks OR 30+ conv/30dYours, on every plan
2 → 3a (Volume to Value)Paid invoices via Jobber30+ paid invoices/30d + 50+ total conversionsYours (needs Max + Jobber for the invoices)
3a → 3b (Value to Target ROAS)Stable observed ROAS50+ 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:

  1. Flip REVENUE to primary, demote all other actions to secondary.
  2. Update campaign.biddingStrategyType from 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_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).

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.