# Create or Update Ad Group — Google Ads

> Creates or updates an ad group. See the documentation

- Key: `google_ads-create-or-update-ad-group`
- Type: Action (Write)
- Version: 0.1.0
- App: Google Ads (`google_ads`) — https://pipedream.com/apps/google-ads.md
- This page (HTML): https://pipedream.com/apps/google-ads/actions/create-or-update-ad-group
- Hints: destructive · open-world
- Source: https://github.com/PipedreamHQ/pipedream/blob/master/components/google_ads/actions/create-or-update-ad-group/create-or-update-ad-group.mjs

## Description

Creates or updates an ad group. [See the documentation](https://developers.google.com/google-ads/api/reference/rpc/v25/AdGroupService/MutateAdGroups?transport=rest)

## Props

| Prop | Type | Required | Description |
|---|---|---|---|
| `accountId` | `string` | Yes | The ID of an account of a customer directly accessible by the authenticated user. This is usually a Manager Account, used as login-customer-id (e.g., 1234567890). Use the List Account ID Options action to get the list of accessible accounts. Options are loaded from the connected account. |
| `customerClientId` | `string` | No | The ID of a customer client from the list of customers linked to the selected account (e.g., 1234567890). Use the List Customer Clients action to get the list of customer clients. Options are loaded from the connected account. |
| `operationType` | `string` | Yes | Whether to create, update, or remove an ad group. |
| `adGroupId` | `string` | No | The ad group to update or remove. Required for Update and Remove operations. Options are loaded from the connected account. |
| `campaignId` | `string` | No | The campaign this ad group belongs to. Required for Create operations. Options are loaded from the connected account. |
| `updateMask` | `string` | No | Comma-separated list of fields to update (e.g., name,status). Required for Update operations. |
| `name` | `string` | No | The name of the ad group. Required for Create operations. |
| `type` | `string` | No | The type of the ad group. Immutable after creation — only used for Create operations. |
| `status` | `string` | No | The status of the ad group. |
| `cpcBidMicros` | `integer` | No | The maximum CPC (cost-per-click) bid in micros (e.g., 1000000 = $1.00). |
| `cpmBidMicros` | `integer` | No | The maximum CPM (cost-per-thousand impressions) bid in micros. |
| `cpvBidMicros` | `integer` | No | The maximum CPV (cost-per-view) bid in micros. |
| `targetCpaMicros` | `integer` | No | The target CPA (cost-per-acquisition) in micros. |
| `targetCpmMicros` | `integer` | No | The target CPM (cost-per-thousand impressions) in micros. |
| `targetRoas` | `string` | No | The target ROAS (return on ad spend) as a decimal (e.g., 3.5 for 350%). |
| `trackingUrlTemplate` | `string` | No | The URL template for constructing a tracking URL. |
| `finalUrlSuffix` | `string` | No | The suffix used to append query parameters to landing page URLs. |
| `adRotationMode` | `string` | No | How ads within the ad group are served relative to one another. |
| `additionalFields` | `object` | No | Additional fields and values to be created. See the documentation for available fields. Values will be parsed as JSON where applicable. |

## Run it

**MCP**

```ts
import { Client } from "@modelcontextprotocol/sdk/client/index.js"
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"
import { PipedreamClient } from "@pipedream/sdk"

const pd = new PipedreamClient({
  projectId: process.env.PIPEDREAM_PROJECT_ID!,
  clientId: process.env.PIPEDREAM_CLIENT_ID!,
  clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
  projectEnvironment: "production",
})

const accessToken = await pd.rawAccessToken

const transport = new StreamableHTTPClientTransport(
  new URL("https://remote.mcp.pipedream.net/v3"),
  {
    requestInit: {
      headers: {
        Authorization: `Bearer ${accessToken}`,
        "x-pd-project-id": process.env.PIPEDREAM_PROJECT_ID!,
        "x-pd-environment": "production",
        "x-pd-external-user-id": "{external_user_id}", // any stable ID for this user in your system
        "x-pd-app-slug": "google_ads",
      },
    },
  },
)

const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)

const { tools } = await mcp.listTools()

// listTools() hands your model this tool's input schema, so it can
// fill the arguments itself:
const result = await mcp.callTool({
  name: "google_ads-create-or-update-ad-group",
  arguments: {
    accountId: "Use Google Ads As",
    customerClientId: "Managed Account",
  },
})
```

**TypeScript**

```ts
import { PipedreamClient } from "@pipedream/sdk"

const pd = new PipedreamClient({
  projectId: process.env.PIPEDREAM_PROJECT_ID!,
  clientId: process.env.PIPEDREAM_CLIENT_ID!,
  clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
  projectEnvironment: "production",
})

const result = await pd.actions.run({
  id: "google_ads-create-or-update-ad-group",
  externalUserId: "{external_user_id}", // any stable ID for this user in your system
  configuredProps: {
    google_ads: { authProvisionId: "apn_xxxxxxx" },
    accountId: "Use Google Ads As",
    customerClientId: "Managed Account",
  },
})

console.log(result)
```

**cURL**

```bash
curl -X POST https://api.pipedream.com/v1/connect/{project_id}/actions/run \
  -H "Content-Type: application/json" \
  -H "X-PD-Environment: production" \
  -H "Authorization: Bearer {access_token}" \
  -d '{
    "external_user_id": "{external_user_id}",
    "id": "google_ads-create-or-update-ad-group",
    "configured_props": {
      "google_ads": { "authProvisionId": "apn_xxxxxxx" },
      "accountId": "Use Google Ads As",
      "customerClientId": "Managed Account"
    }
  }'
```

---

- App: https://pipedream.com/apps/google-ads.md · All apps: https://pipedream.com/apps
