# Apply a Google Ads plan

Preview, validate and atomically apply a Google Ads v25 build/change plan: campaigns, budgets, ad groups, RSA/Display/Demand Gen ads, image/text/YouTube. Works on your own Google Ads account, connected through Get MCP Ads. The preview is free; the change costs $0.05 when you confirm it. Needs customer id, currency and operations.

Preview, validate and atomically apply a Google Ads v25 build/change plan: campaigns, budgets, ad groups, RSA/Display/Demand Gen ads, image/text/YouTube assets, PMax asset groups and links, keywords, geographic/language targeting listing groups and conversion action configuration (no conversion event uploads). Native REST camelCase fields; amounts are integer micros of the explicitly stated currency. Supports temporary negative resource IDs for ordered creation in one transaction. No VIDEO campaign creation (Google API restriction), billing, account access changes, customer lists or conversion uploads. New campaigns/groups/ads are always PAUSED. Call first without confirm to inspect the plan and get planHash; validateOnly asks Google without applying; execution requires confirm and the matching expectedPlanHash. Read back results with google_ads_run_gaql. Never retry a creation after an uncertain network result before checking its name/IDs. Agentik price: free to preview; $0.05 when the change is applied (confirm: true without validateOnly).

- Tool ID: `google-ads/apply-plan`
- Name in the catalog: Google Ads: Apply plan
- Provider: [Google Ads](/providers/google-ads.md)
- Capability: [Google Ads campaign management](/tools/google-ads/campaign-management.md)
- Price: free preview, $0.05 per applied change
- Workspace access is automatic. Connect a platform using the link and notice returned to your AI assistant; an owner or admin completes platform consent and returns to the conversation; see the [guide](/docs/getmcpads.md).
- Authentication: an authorised Agentik workspace is required for execution, including zero-price tools.

## Pricing contract

The provider’s price, with no markup. Billed for measured usage.


```json
{
  "model": "per_call",
  "amountUsd": 0,
  "multipliers": [
    {
      "all": [
        {
          "field": "confirm",
          "equals": true
        },
        {
          "field": "validateOnly",
          "truthy": false
        }
      ],
      "setUsd": 0.05
    }
  ]
}
```

## Complete input schema


```json
{
  "type": "object",
  "properties": {
    "customerId": {
      "type": "string",
      "pattern": "^[\\d-]+$",
      "description": "Selected Google Ads customer ID, not the manager account."
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Z]{3}$",
      "description": "Actual account currency, mandatory even when only linking assets."
    },
    "operations": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "conversionActionOperation",
              "campaignBudgetOperation",
              "campaignOperation",
              "adGroupOperation",
              "adGroupAdOperation",
              "adOperation",
              "assetOperation",
              "assetGroupOperation",
              "assetGroupAssetOperation",
              "campaignAssetOperation",
              "campaignCriterionOperation",
              "adGroupCriterionOperation",
              "assetGroupListingGroupFilterOperation"
            ]
          },
          "create": {
            "type": "object",
            "additionalProperties": {}
          },
          "update": {
            "type": "object",
            "additionalProperties": {}
          },
          "remove": {
            "type": "string"
          },
          "updateMask": {
            "type": "string",
            "minLength": 1
          }
        },
        "required": [
          "kind"
        ],
        "additionalProperties": false
      },
      "minItems": 1,
      "maxItems": 100,
      "description": "Ordered operations. kind is a native MutateOperation field; create/update contains native REST fields; remove is the full owned resource name. Images use imageAsset.data base64 bytes; videos use youtubeVideoAsset.youtubeVideoId (already uploaded on YouTube)."
    },
    "loginCustomerId": {
      "type": "string",
      "pattern": "^[\\d-]+$",
      "description": "Optional MCC ID; defaults to the selected account's inferred manager."
    },
    "testAccountOnly": {
      "type": "boolean",
      "description": "Require Google's customer.test_account=true before any mutation. Use true for acceptance tests."
    },
    "validateOnly": {
      "type": "boolean",
      "description": "Ask Google to validate without applying. Takes priority over confirm."
    },
    "confirm": {
      "type": "boolean",
      "description": "Apply only when true and expectedPlanHash matches the exact preview."
    },
    "expectedPlanHash": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$",
      "description": "SHA-256 planHash from the preview of this exact payload, required for application."
    },
    "workspace_id": {
      "type": "string",
      "description": "Authorized workspace ID from list_accounts/list_workspaces. Use the user's chosen workspace; never guess between clients. Optional when a unique account identifies it."
    },
    "reason": {
      "type": "string",
      "maxLength": 500,
      "description": "Why, in the person's words or from the evidence (e.g. CPA twice the target for 7 days). Saved with the change in the shared client journal."
    }
  },
  "required": [
    "customerId",
    "currency",
    "operations"
  ]
}
```

## Published example

No example input is published for this tool. Ask for the inputs required by its schema.

## Execute and retrieve

Inspect again before execution, explain the price and obtain the required authority. Use MCP run_tool or POST /v1/run with this tool ID, valid input and an idempotency key. Save the returned run ID and follow the actual state. If Agentik answers that the tool is temporarily unavailable, do not retry it blindly; use discovery to propose an alternative.

A partial or uncertain result can still have consumed provider resources. Consult [billing](/docs/billing.md), [idempotency](/docs/idempotency.md) and [asynchronous results](/docs/async.md).

[REST inspection](https://api.agentik.cc/v1/tools/google-ads/apply-plan) · [OpenAPI](/openapi.json) · [Connection guide](/connect.md)

---

[HTML page](/providers/google-ads/apply-plan) · [Agent index](/llms.txt)
