Plan and execute Google Ads changes using the Draft-Confirm workflow
mainAll Google Ads write tools follow a strict safety workflow to prevent accidental changes.
The Workflow
- Draft: Call a
draft_*tool (e.g.,draft_campaign,draft_ad_group,draft_responsive_search_ad). This returns a preview with aplan_idbut makes no changes. - Review: Show the full preview to the user and wait for explicit approval.
- Dry Run: Call
confirm_and_apply(plan_id=..., dry_run=true)to test the execution against the API. - Apply: Only call
confirm_and_apply(plan_id=..., dry_run=false)after explicit user confirmation.
Safety Behaviors
- Paused by Default: New campaigns, Reddit entities, and RSAs are created in a
PAUSEDstate. They must be explicitly enabled. - Targeting Requirements:
draft_campaignrequiresgeo_target_idsandlanguage_ids. It will reject drafts missing these. - Budget Caps:
draft_campaignenforces amax_daily_budgetsafety cap and warns if the budget is below 5x the target CPA. - Irreversible Actions:
remove_entityis irreversible. Always preferpause_entityunless permanent removal is requested.remove_entityrequires double confirmation. - Replacement vs. Appending:
update_campaignreplaces positive geo/language targets entirely. It does not append. However, negative geo exclusions are preserved during the swap.
Configuration Overrides
require_dry_run: true: If set in config, the system will refusedry_run=falseuntil the user manually changes the config.two_phase_apply: true: (Default on AdLoop Cloud) Refusesdry_run=falseuntil the specificplan_idhas successfully completed at least onedry_run=truepass.
# Example workflow
plan = draft_campaign(campaign_name='New Promo', daily_budget=50, ...)
# ... user reviews plan ...
confirm_and_apply(plan_id=plan.id, dry_run=True)
# ... user confirms ...
confirm_and_apply(plan_id=plan.id, dry_run=False)