---
title: "Google Ads Connector"
description: "Complete Google Ads integration guide for syncing campaign data, audience lists, and conversion tracking with Brevo through Tajo."
url: https://tajo.io/docs/connectors/marketing/google-ads/
markdown: https://tajo.io/docs/connectors/marketing/google-ads.md
lang: en-US
robots: noindex
---

# Google Ads Connector

Connector status: Planned Not built yet. Tajo does not run this connector today.

| Source field | Destination field | Sample value |
| --- | --- | --- |
| `record.id` | `source_id` | `record_1042` |
| `record.updated_at` | `updated_at` | `2026-10-18T08:00:00Z` |
| `record.value` | `value` | `sample_value` |

Connect Google Ads to Brevo through Tajo to synchronize advertising audiences, import conversion data, and create unified customer profiles that bridge paid acquisition with lifecycle marketing.

## Overview

| Property | Value |
| --- | --- |
| **Platform** | Google Ads |
| **Category** | Marketing |
| **Setup Complexity** | Advanced |
| **Official Integration** | No |
| **Data Synced** | Campaigns, Audiences, Conversions, Customers |
| **Available Skills** | 7 |

## Features

- **Customer Match sync** - Upload Brevo contact lists to Google Ads as Customer Match audiences
- **Conversion tracking** - Import offline conversions from Brevo events into Google Ads
- **Audience sync** - Bidirectional sync between Brevo lists and Google Ads audiences
- **Campaign reporting** - Pull campaign performance data into Tajo dashboards
- **GCLID tracking** - Capture Google Click IDs for offline conversion attribution
- **Smart bidding data** - Feed conversion value data back to Google for bid optimization
- **Lead form sync** - Import Google Ads lead form submissions into Brevo contacts

## Prerequisites

Before you begin, ensure you have:

1. A Google Ads account with API access enabled
2. A Google Cloud project with the Google Ads API enabled
3. OAuth 2.0 credentials (Client ID and Client Secret)
4. A Google Ads Developer Token (apply at [Google Ads API Center](https://ads.google.com/aw/apicenter))
5. A Brevo account with API access
6. A Tajo account with API credentials

## Authentication

### OAuth 2.0

Google Ads API uses OAuth 2.0 for authentication. You need to obtain a refresh token through the OAuth consent flow.

```bash
# Required OAuth scopes
https://www.googleapis.com/auth/adwords
```

### Developer Token

A Developer Token is required for all Google Ads API requests and must be approved by Google.

```bash
# Set up authentication headers
curl -X POST https://googleads.googleapis.com/v18/customers/1234567890/googleAds:search \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "developer-token: DEVELOPER_TOKEN" \
  -H "login-customer-id: MANAGER_ACCOUNT_ID"
```

## Configuration

### Basic Setup

```yaml
connectors:
  google_ads:
    enabled: true
    developer_token: "your-developer-token"
    oauth:
      client_id: "your-client-id"
      client_secret: "your-client-secret"
      refresh_token: "your-refresh-token"
    customer_id: "123-456-7890"
    login_customer_id: "111-222-3333"  # Manager account (optional)

    # Data sync options
    sync:
      customer_match: true
      conversions: true
      campaigns: true
      lead_forms: true

    # Conversion tracking
    conversions:
      action_id: "123456789"
      default_currency: "USD"
```

### Customer Match Configuration

Upload Brevo contacts as Google Ads audiences:

```yaml
customer_match:
  enabled: true
  lists:
    - brevo_list_id: 5
      audience_name: "All Customers"
      match_type: "CONTACT_INFO"
    - brevo_list_id: 7
      audience_name: "High Value Customers"
      match_type: "CONTACT_INFO"

  # Data fields to match
  match_fields:
    - email
    - phone
    - first_name
    - last_name
    - country_code
    - zip_code

  # Sync schedule
  schedule: "daily"
  sync_mode: "mirror"  # mirror, append, or remove
```

### Offline Conversion Import

```yaml
conversion_import:
  enabled: true
  conversion_action: "purchase"
  gclid_attribute: "GCLID"  # Brevo attribute storing GCLID
  conversion_events:
    - brevo_event: "order_completed"
      conversion_name: "Purchase"
      value_field: "revenue"
    - brevo_event: "subscription_created"
      conversion_name: "Subscription"
      value_field: "plan_value"
```

## API Endpoints

| Method | Endpoint | Description |
| --- | --- | --- |
| `POST` | `/v18/customers/{id}/googleAds:search` | Search campaigns and resources (GAQL) |
| `POST` | `/v18/customers/{id}/googleAds:searchStream` | Stream search results |
| `POST` | `/v18/customers/{id}/offlineUserDataJobs:create` | Create Customer Match upload job |
| `POST` | `/v18/customers/{id}/conversionUploads:uploadClickConversions` | Upload offline conversions |
| `POST` | `/v18/customers/{id}/conversionUploads:uploadCallConversions` | Upload call conversions |
| `GET` | `/v18/customers/{id}/campaignBudgets` | Get campaign budgets |
| `POST` | `/v18/customers/{id}/customerLists:mutate` | Manage customer lists |

## Code Examples

### Initialize Google Ads Connector

```javascript
import { TajoClient } from '@tajo/sdk';

const tajo = new TajoClient({
  apiKey: process.env.TAJO_API_KEY,
  brevoApiKey: process.env.BREVO_API_KEY
});

// Connect Google Ads account
await tajo.connectors.connect('google-ads', {
  developerToken: process.env.GOOGLE_ADS_DEV_TOKEN,
  clientId: process.env.GOOGLE_OAUTH_CLIENT_ID,
  clientSecret: process.env.GOOGLE_OAUTH_CLIENT_SECRET,
  refreshToken: process.env.GOOGLE_OAUTH_REFRESH_TOKEN,
  customerId: '123-456-7890'
});
```

### Upload Customer Match Audience

```javascript
// Sync a Brevo list to Google Ads Customer Match
await tajo.connectors.syncAudience('google-ads', {
  brevoListId: 5,
  audienceName: 'High Value Customers',
  matchType: 'CONTACT_INFO',
  syncMode: 'mirror'
});
```

### Import Offline Conversions

```javascript
// Upload offline conversions from Brevo order events
await tajo.connectors.uploadConversions('google-ads', {
  conversionAction: 'customers/123456/conversionActions/789',
  conversions: [
    {
      gclid: 'CjwKCAiA...',
      conversionDateTime: '2024-01-15 10:30:00-05:00',
      conversionValue: 89.99,
      currencyCode: 'USD'
    }
  ]
});
```

### Query Campaign Performance (GAQL)

```javascript
// Query campaign metrics using Google Ads Query Language
const query = `
  SELECT
    campaign.name,
    campaign.status,
    metrics.impressions,
    metrics.clicks,
    metrics.cost_micros,
    metrics.conversions
  FROM campaign
  WHERE segments.date DURING LAST_30_DAYS
  ORDER BY metrics.impressions DESC
  LIMIT 20
`;

const results = await tajo.connectors.query('google-ads', { gaql: query });
```

## Rate Limits

| Resource | Limit | Details |
| --- | --- | --- |
| **API requests** | 15,000/day | Per developer token |
| **Mutate operations** | 10,000/day | Per customer account |
| **GAQL queries** | 1,500/day | Per customer account |
| **Customer Match uploads** | 10 jobs/day | Per customer list |
| **Conversion uploads** | 2,000/request | Per upload batch |
| **Page size** | 10,000 rows | Max per search response |

Developer Token Approval

Google Ads API requires an approved Developer Token. Apply through the Google Ads API Center in your Manager account. Test accounts have reduced rate limits.

## Troubleshooting

| Issue | Cause | Solution |
| --- | --- | --- |
| `DEVELOPER_TOKEN_NOT_APPROVED` | Token pending review | Wait for Google approval or use test account |
| `CUSTOMER_NOT_FOUND` | Wrong customer ID | Remove hyphens from customer ID or check manager account |
| Customer Match low match rate | Insufficient data | Include multiple identifiers (email, phone, name, zip) |
| Conversions not appearing | Attribution window | Conversions may take up to 24 hours to process |
| `OAUTH_TOKEN_EXPIRED` | Refresh token invalid | Re-authenticate and obtain a new refresh token |
| `PERMISSION_DENIED` | Insufficient access | Check API access level and account linking |

## Best Practices

1. **Use a Manager account** - Manage multiple Ads accounts through a single Manager (MCC) account
2. **Hash Customer Match data** - Always SHA-256 hash PII before uploading to Customer Match
3. **Track GCLIDs** - Store Google Click IDs in Brevo attributes for offline conversion tracking
4. **Batch conversion uploads** - Group conversions into daily batches rather than real-time uploads
5. **Use GAQL for reporting** - Leverage Google Ads Query Language for flexible campaign reporting
6. **Monitor match rates** - Track Customer Match audience match rates and improve data quality
7. **Set up Enhanced Conversions** - Use Enhanced Conversions for more accurate conversion measurement

## Security

- **OAuth 2.0** - Secure token-based authentication with refresh tokens
- **SHA-256 hashing** - Customer Match data is hashed before upload
- **Data minimization** - Only required fields are transmitted to Google
- **Google Cloud compliance** - SOC 2, ISO 27001, and GDPR compliant
- **Scoped access** - API permissions scoped to specific customer accounts
- **Audit logging** - All API requests logged in Google Ads change history

## Related Resources

- [Meta Ads Connector](https://tajo.io/docs/connectors/marketing/meta-ads)
- [Klaviyo Connector](https://tajo.io/docs/connectors/marketing/klaviyo)
- [Brevo Connector](https://tajo.io/docs/connectors/marketing/brevo)
- [Customer Sync Skill](https://tajo.io/docs/skills/data-sync/customer-sync)

## Open-Source Implementation Map

This section is derived from official or public repository material discovered for the Google Ads connector. Use it as the engineering companion to the setup guide above: it shows where the API surface lives, what implementation assets exist, and how Tajo should translate them into reliable Brevo sync behavior.

### Repository Snapshot

| Repository | Commit | Languages / formats | Files |
| --- | --- | --- | --- |
| [googleads/google-ads-mcp](https://github.com/googleads/google-ads-mcp) | 0d15712 | Python (32), Markdown (3), JSON (3), YAML (1), gitignore (1), codeowners (1) | 46 |

### Integration Shape

```mermaid
graph LR
  Source["Google Ads API / repository"] --> Auth["Auth and scopes"]
  Source --> Objects["Objects, events, and schemas"]
  Auth --> Tajo["Tajo connector runtime"]
  Objects --> Tajo
  Tajo --> Brevo["Brevo contacts, attributes, lists, campaigns"]
  Tajo --> Ops["Backfill, cursor, retries, logs"]
```

### What To Reuse

- Google Ads MCP Server
- This repo contains the source code for running an
- MCP server that interacts with the
- Google Ads API.
- Tools

### Tajo Revamp Checklist

- Keep authentication setup aligned with the vendor docs and the public repository’s current API shape.
- Map primary resources into explicit Tajo sync objects with stable external IDs.
- Prefer cursor-based or updated-at incremental sync where the API exposes it; otherwise document the fallback.
- Treat webhook handlers as idempotent and replay-safe, especially for order, contact, ticket, and campaign events.
- Capture pagination, rate limits, retry headers, and partial-failure behavior in connector smoke tests.
- Keep examples small and runnable against sandbox or test-mode accounts.

### Sources

- [googleads/google-ads-mcp](https://github.com/googleads/google-ads-mcp)
- [Vendor documentation](https://developers.google.com/google-ads/api/docs/developer-toolkit/mcp-server)
