Google Ads Connector
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:
- A Google Ads account with API access enabled
- A Google Cloud project with the Google Ads API enabled
- OAuth 2.0 credentials (Client ID and Client Secret)
- A Google Ads Developer Token (apply at Google Ads API Center)
- A Brevo account with API access
- 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.
# Required OAuth scopeshttps://www.googleapis.com/auth/adwordsDeveloper Token
A Developer Token is required for all Google Ads API requests and must be approved by Google.
# Set up authentication headerscurl -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
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:
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 removeOffline Conversion Import
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
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
// Connect Google Ads accountawait 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
// Sync a Brevo list to Google Ads Customer Matchawait tajo.connectors.syncAudience('google-ads', { brevoListId: 5, audienceName: 'High Value Customers', matchType: 'CONTACT_INFO', syncMode: 'mirror'});Import Offline Conversions
// Upload offline conversions from Brevo order eventsawait 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)
// Query campaign metrics using Google Ads Query Languageconst 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
- Use a Manager account - Manage multiple Ads accounts through a single Manager (MCC) account
- Hash Customer Match data - Always SHA-256 hash PII before uploading to Customer Match
- Track GCLIDs - Store Google Click IDs in Brevo attributes for offline conversion tracking
- Batch conversion uploads - Group conversions into daily batches rather than real-time uploads
- Use GAQL for reporting - Leverage Google Ads Query Language for flexible campaign reporting
- Monitor match rates - Track Customer Match audience match rates and improve data quality
- 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
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 | 0d15712 | Python (32), Markdown (3), JSON (3), YAML (1), gitignore (1), codeowners (1) | 46 |
Integration Shape
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.