# Upload Click Conversion — Google Ads

> Uploads an offline conversion attributed to an ad click. See the documentation

- Key: `google_ads-upload-click-conversion`
- Type: Action (Write)
- Version: 0.0.1
- App: Google Ads (`google_ads`) — https://pipedream.com/apps/google-ads.md
- This page (HTML): https://pipedream.com/apps/google-ads/actions/upload-click-conversion
- Hints: open-world
- Source: https://github.com/PipedreamHQ/pipedream/blob/master/components/google_ads/actions/upload-click-conversion/upload-click-conversion.mjs

## Description

Uploads an offline conversion attributed to an ad click. [See the documentation](https://developers.google.com/google-ads/api/reference/rpc/v25/ConversionUploadService/UploadClickConversions?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. |
| `conversionActionId` | `string` | Yes | The conversion action to record this conversion against, as a resource name (e.g. customers/1234567890/conversionActions/987654321). Use a value returned by this selector. Must be an upload-type action (Upload Clicks for click conversions, Upload Calls for call conversions) - create one with the Send Offline Conversion action. Options are loaded from the connected account. |
| `conversionDateTime` | `string` | Yes | When the conversion occurred. Must be after the click or call. Format YYYY-MM-DD HH:MM:SS+\|-HH:MM, including the UTC offset (e.g. 2026-08-13 12:32:45-08:00). |
| `conversionValue` | `string` | No | The value of the conversion to the advertiser (e.g. 25.50). |
| `currencyCode` | `string` | No | ISO 4217 three-character currency code for the conversion value (e.g. USD). |
| `validateOnly` | `boolean` | No | If true, the upload is validated but not recorded. Useful for checking a payload before sending real data. |
| `additionalFields` | `object` | No | Additional fields and values to be created. See the documentation for available fields. Values will be parsed as JSON where applicable. |
| `gclid` | `string` | No | The Google click ID from the ad click that led to this conversion. Provide this, GBRAID, or WBRAID. |
| `gbraid` | `string` | No | The click identifier for iOS app-to-web conversions. Provide this, GCLID, or WBRAID. |
| `wbraid` | `string` | No | The click identifier for iOS web-to-web conversions. Provide this, GCLID, or GBRAID. |
| `orderId` | `string` | No | Transaction ID for this conversion. An order ID can only be used once per conversion action. |
| `conversionEnvironment` | `string` | No | Where the conversion was recorded. |

## 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-upload-click-conversion",
  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-upload-click-conversion",
  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-upload-click-conversion",
    "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
