Google Ads
Upload Customer Match audiences to Google Ads for targeted advertising. Use Zeotap to sync your warehouse segments directly to Google Ads user lists.
Prerequisites
- A Google Ads account with Customer Match eligibility
- A Google Ads API developer token (from your Manager account’s API Center)
- Your Google Ads Customer ID (10-digit number)
Finding Your Customer ID
Your Customer ID is the 10-digit number displayed in the top-right corner of the Google Ads dashboard, formatted as XXX-XXX-XXXX.
- Sign in to Google Ads
- Look at the top-right corner — your Customer ID appears next to your account name (e.g.,
406-685-0321) - When entering it in Zeotap, remove the dashes (e.g.,
4066850321)
Getting a Developer Token
A developer token is required for all Google Ads API access.
- Sign in to your Google Ads Manager account (MCC) — developer tokens are issued at the MCC level, not individual ad accounts
- Navigate to Tools & Settings (wrench icon) > Setup > API Center
- If you don’t have a developer token yet, one will be generated with Test Account access level
- Copy the 22-character alphanumeric token
Developer Token Access Levels
| Level | What It Means | How to Get It |
|---|---|---|
| Test Account | Only works with accounts you explicitly whitelist in the API Center | Default when first issued |
| Basic Access | Works with any Google Ads account the user authorizes | Apply in API Center — requires app review |
| Standard Access | Higher rate limits, same account access as Basic | Apply after Basic approval |
For testing, add your Customer ID as a test account: in the API Center page, find the “Test accounts” section and add the Customer ID you want to sync to.
For production, apply for Basic Access in the API Center. Google reviews your OAuth consent screen, terms of service URL, and privacy policy.
Authentication
Google Ads uses OAuth 2.0.
- Click Connect with OAuth in Zeotap
- Sign in with the Google account that has access to your Google Ads account
- Authorize the requested permissions
The authorizing Google account must have at least Standard access to the target Google Ads account.
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
| Customer ID | Text | Yes | Your Google Ads customer ID (10-digit number, without dashes). Find it in the top-right corner of your Google Ads dashboard. |
| Login Customer ID (MCC) | Text | No | Manager account ID if managing the customer through an MCC. Leave blank for direct access. |
| Developer Token | Password | Yes | Google Ads API developer token from your Manager account’s API Center. |
Target Settings
| Field | Type | Required | Description |
|---|---|---|---|
| Audience Name | Text | Yes | Name for the Customer Match user list |
| Audience ID | Text | No | Existing user list resource name. Leave blank to create a new list. |
Per-row user lists
Audience Name can be taken from a column instead of being fixed for the sync, so one sync fans out across several Customer Match user lists.
To set it up, open the sync’s Destination target overrides, switch the field from Fixed value to From column, and pick the column. The switch adds a row to the sync’s field mapping, so you can also see and edit the binding — including adding a transform — in the Map fields editor. The fixed value you leave behind becomes the fallback applied to rows whose column is empty.
Zeotap groups each batch by the resolved name and uploads once per distinct list, reusing an existing list of that name or creating it on first sight. This works identically whether the destination uploads natively or through the Data Manager API.
Limiting how many user lists a run can create
Because a new Audience Name creates a user list, binding a high-cardinality column by mistake — a user id, say — would create one per profile. Max distinct values per run (default 500) caps this: if a run needs to create more than the limit allows, it fails with an error naming the field and the offending value, and nothing further is created. Set it to 0 for no limit.
Mirror mode cannot express a move. A profile that moves from one user list to another appears in the diff as a changed row carrying only its current value, so it is added to the new one but never removed from the old. Prefer Add and Remove sync modes when Audience Name comes from a column.
Supported Operations
Sync Modes: Upsert, Mirror
Audience Sync Modes: Add, Remove, Mirror, Upsert
Features
- Field Mapping: Yes
- Schema Introspection: No
Required Mapping Fields
| Field | Description |
|---|---|
email | Primary match key for Customer Match. Alternatives: hashed_email (pre-hashed values), phone, or hashed_phone — any one of the four satisfies the requirement. |
Default Destination Fields
| Field | Type | Description |
|---|---|---|
email | string | Email address (raw — auto normalized and SHA-256 hashed) |
hashed_email | string | Email — pre-hashed SHA-256 hex of lowercase trimmed email |
phone | string | Phone number (raw — auto normalized and SHA-256 hashed) |
hashed_phone | string | Phone — pre-hashed SHA-256 hex of E.164 number |
first_name | string | First name (raw — auto lowercased and SHA-256 hashed). Data Manager uploads only. |
hashed_first_name | string | First name — pre-hashed SHA-256 hex of lowercase trimmed name. Data Manager uploads only. |
last_name | string | Last name (raw — auto lowercased and SHA-256 hashed). Data Manager uploads only. |
hashed_last_name | string | Last name — pre-hashed SHA-256 hex of lowercase trimmed name. Data Manager uploads only. |
country_code | string | Country code (plain text, e.g. US). Data Manager uploads only. |
postal_code | string | Postal/ZIP code (plain text). Data Manager uploads only. |
mobile_id | string | Mobile advertising ID (IDFA or GAID). Data Manager uploads only. |
The fields marked Data Manager uploads only are honored when the destination’s Upload via Data Manager toggle is enabled; the native Customer Match path uploads email and phone digests only.
When both a raw field and its pre-hashed counterpart are mapped (e.g. email and hashed_email), the pre-hashed value wins. Values that are not valid 64-character SHA-256 hex digests are never uploaded — they are dropped (falling back to the raw column if mapped) and counted in the sync run logs. See Match Keys & Identifier Hashing for the full normalization contract, precedence, and validation rules.
Troubleshooting
Permission denied (403)
Developer token in test mode: Your developer token only works with whitelisted accounts. Go to Tools & Settings > API Center and add the target Customer ID under “Test accounts”. For production, apply for Basic Access.
User doesn’t have account access: The Google account that authorized OAuth must have at least Standard access to the target Google Ads account. Check under Tools & Settings > Access and security.
Customer Match not available
Customer Match requires your account to meet Google’s eligibility requirements including a good compliance history and sufficient spend.
Low match rate
Ensure email addresses are valid and phone numbers include country codes (E.164). Zeotap normalizes and hashes raw identifiers automatically, so casing and whitespace are not a concern for raw fields. If you map pre-hashed hashed_* columns, verify they follow the normalization contract in Match Keys & Identifier Hashing — a digest of a wrongly normalized value uploads cleanly but matches nothing.