Google Ads Sync (Decoupled)
What is Google Ads Sync?
The Google Ads sync fires a client-side conversion event via gtag.js. Its purpose is to establish the match table between MetaRouter's anonymous ID and Google's identity graph — not to measure conversions. Reported conversions are delivered server-side, via Google Ads - Conversions or Google Data Manager - Events. Point the sync at a dedicated placeholder conversion action, not one you report on.
Considerations
- Do Not Point the Sync at a Reported Conversion Action - The sync fires on the client independently of whether the user actually converted. If its label points at a conversion action you report on, that action's counts will include sync traffic. Create a dedicated placeholder conversion action and exclude it from your reporting and bidding goals in Google Ads. The placeholder must be a website conversion action; the Import type used for server-side conversions has no label to fire against.
- Cookie Lifetime - GCLID and WBRAID cookie lifetimes are set on this sync (GCLID Cookie Lifetime and WBRAID Cookie Lifetime, default 90 days), not on the parent Google Tag Settings. Align them with your Google Ads conversion window to avoid
EXPIRED_EVENTerrors. DCLID is not captured or managed by this sync. - Leaving the Parent Tag ID Blank - A blank parent tag ID is only valid with Load GTAG library off. In that configuration MetaRouter does not load or configure gtag at all: your configured
AW-IDs are never initialised, and the sync's conversion calls rely on your own site's gtag having those accounts configured. Use this only when you deliberately load gtag yourself. - Processing Delay - Google recommends delaying conversion uploads to ensure identifiers are fully available before delivery:
| Identifier | Recommended Delay |
|---|---|
gclid | ~1 hour after click |
wbraid | ~1 hour after click |
- To enable event delay - Contact your MetaRouter Customer Support Rep to configure delay for Google Ads conversions (recommended: ~1 hour for gclid/dclid).
- Partial Failure Responses - The Google Ads API returns HTTP 200 even when individual conversions fail. Errors such as
EXPIRED_EVENTorUNAUTHORIZED_CUSTOMERappear in the response body and do not trigger automatic retry. Monitor response bodies or GCP logs to catch silent conversion failures. For a full list of error codes and fixes, see the Google Ads - Conversions documentation. - IAB TCF Consent - Enabling IAB TCF Consent requires an IAB TCF v2.0-compliant CMP with the
__tcfapiJavaScript API exposed on the site, and Consent Policy set to "Explicit Consent" in MetaRouter Advanced Settings. Vendor ID is 755. - CMP Compatibility - This sync works with any CMP provided the consent categories are configured correctly in the MetaRouter UI.
- Organizations with Advanced Consent Disabled - If your organization does not have Advanced Consent enabled, the Consent Type field will not appear in the child sync configuration—this is expected. However, ensure that Implied consent (opt-in by default) is selected in your pipeline’s Compliance Settings. If Explicit consent is selected instead, all integrations will default to a permanently denied state regardless of Advanced Consent being disabled. With Implied consent selected, the sync functions correctly and all integrations are treated as granted.
Architecture Overview
- Google Tag Settings serves as the parent and controls gtag.js library loading
- Google Ads is a child sync with its own conversion event configuration
- The sync sends conversion events via
gtag('event', 'conversion', {...}) - The parent gtag must be deployed before Google Ads sync can function
Prerequisites
Before configuring the Google Ads sync:
- Parent Google Tag Settings must be configured — The parent controls gtag.js library loading and must be deployed first
- Google Ads account with a dedicated placeholder conversion action — Create a website conversion action (Goals › Conversions › New conversion action › Website, set up with the Google tag or Google Tag Manager) and use its Conversion ID and Conversion label. Do not use an Import / "Track conversions from clicks" action — those have no conversion label and cannot be targeted by the sync. Create one placeholder per Google Ads account, and don't reuse actions you report on.
Configuration Fields
Parent Fields (Google Tag Settings)
| Field | Description | Required |
|---|---|---|
| GTAG.js Tag ID | Your GA4 Measurement ID (G- or GT- prefix). A Google Ads AW- ID is not valid here and fails validation when the file is built — Google Ads accounts are configured on the Google Ads child sync. If you do not have a GA4 child sync planned and no valid Measurement ID, this can be a placeholder value provided it matches the required format (e.g. G-PLACEHOLDER), since the field only needs to satisfy validation for the library to load. | Yes |
| Load GTAG library | Toggle to load the gtag.js library. Must be ON for Google Ads sync to function. | Yes |
| Load GTAG when zero consent granted | When ON, loads gtag even when no consent categories are granted. | Yes |
| VTC/EVC Support | When ON, keeps gtag.js running on every page load to preserve view-through (VTC) and engaged-view (EVC) attribution. When OFF (default), the tag is suppressed after the initial sync and non-click conversions degrade. Enabling it introduces duplicate-conversion risk that must be configured per destination — review with your CSM first. | No |
| Google Tag Gateway Mode | When ON, each configured tag ID loads gtag.js from a first-party URL on your own domain (CDN reverse-proxied to Google) instead of googletagmanager.com, improving ad-blocker resilience and giving tag cookies a first-party origin. Requires a distinct first-party path per tag ID, configured per destination. Governs script serving only. | No |
| Enhanced Google Consent Signal Mapping | When ON, maps each of Google's four consent signals (ad_storage, ad_user_data, ad_personalization, analytics_storage) to its own consent category or a fixed value (Always granted / Always denied / Not set), instead of inheriting one value for all four. Shapes signals on calls that fire; does not replace the per-sync consent gate. | No |
Google Ads Sync Fields
| Field | Description | Required | Default |
|---|---|---|---|
| Consent Type | Consent category required before sync fires (e.g., C0004 - Targeting Sales). | Yes | — |
| IAB TCF Consent | Enable IAB Transparency & Consent Framework integration. Vendor ID: 755. | No | Disabled |
| Conversions | One entry per Google Ads account, not one per conversion event you measure. adsID is the account-level AW- ID; label is the label of the dedicated placeholder conversion action. Duplicate adsID values are rejected on save. | Yes | — |
| GCLID Cookie Lifetime | Lifetime in days of the stored gclid. Align with your Google Ads conversion window. | No | 90 |
| WBRAID Cookie Lifetime | Lifetime in days of the stored wbraid. Align with your Google Ads conversion window. | No | 90 |
Conversions Array Format
One entry per Google Ads account. adsID is the account-level AW- conversion ID; label is the conversion label of the dedicated placeholder conversion action:
[
{
"adsID": "AW-111111111",
"label": "sync_placeholder_label"
}
]Multiple Google Ads Accounts
A site running several Google Ads accounts configures them as sibling entries in the same array:
[
{
"adsID": "AW-111111111",
"label": "sync_placeholder_account_1"
},
{
"adsID": "AW-222222222",
"label": "sync_placeholder_account_2"
}
]Each account is configured independently and builds its own match table. This does not require Google Tag Gateway Mode — Gateway Mode only changes where each tag ID's library is served from.
adsID must be unique across entries. All conversion actions in an account share one AW-, so one entry per account is enough and a duplicate adsID is rejected on save. Under manager-level (MCC) conversion tracking the AW- is shared across child accounts — check which applies before adding an entry per child. Note the AW- is not your customer ID (123-456-7890).
Server-side delivery scales differently: the Google Ads - Conversions integration takes one CUSTOMER_ID, so each account needs its own integration instance.
Per-Entry Gateway URLs
Each entry in the Google Ads Conversions array accepts an optional gtgScriptSource key holding the first-party URL that serves that tag ID:
[
{
"adsID": "AW-XXXXXXXXXX",
"label": "XXXXXXXXXXXXXXXXXXX",
"gtgScriptSource": "https://www.example.com/metrics-1"
}
]The key is used only when Google Tag Gateway Mode is on. An entry without it falls back to googletagmanager.com with a console warning naming the tag ID.
The CM360 Advertisers array follows the same pattern and uses the same key name. Note that the advertiser ID must include the DC- prefix.
How It Behaves
- All three syncs use the same key name. Google Ads Conversions, CM360 Advertisers and the GA4 destinations array each use
gtgScriptSource, so an entry can be moved between them without renaming the key. - Configured URLs are not removed when Gateway Mode is off. Unlike GA4, Google Ads and CM360 gateway URLs remain in the built configuration and are simply unused. They are visible to anyone inspecting the delivered bundle.
Setup
1. Configure Parent Google Tag Settings
- From the Pipelines page, find the pipeline associated with your web property
- Hover over the three-dot dropdown and select "Build AJS File"
- In the Identity Syncs section, add Google Tag Settings
- Configure the parent fields:
- GTAG.js Tag ID: Enter your GA4 Measurement ID (
G-orGT-) - Load GTAG library: Set to ON
- Load GTAG when zero consent granted: Set based on your consent requirements
- GTAG.js Tag ID: Enter your GA4 Measurement ID (
2. Add Google Ads Sync
- Under the Syncs section within Google Tag Settings, add Google Ads
- Configure the sync fields:
- Consent Type - Select the consent category required before the sync fires (typically
C0004 - Targeting Salesfor advertising). - IAB TCF Consent - Enable if using IAB TCF v2.0-compliant CMP. The Google Ads sync uses vendor ID 755.
- Conversions - Enter one entry per Google Ads account, using the label of your dedicated placeholder conversion action:
[
{
"adsID": "AW-111111111",
"label": "sync_placeholder"
}
]3. Save and Deploy
- Click Save and Build File
- Deploy your AJS file to propagate changes to your web property
Technical Details
Sync Behavior
The sync executes the following steps:
- Checks gtag.js availability (must be loaded by parent Google Tag configuration)
- Fires the placeholder conversion event for each configured entry (one per Google Ads account):
gtag('event', 'conversion', {
send_to: `${adsID}/${label}` // e.g., "AW-111111/sync_placeholder"
});- Stores a marker. The marker suppresses repeat firing only when VTC/EVC Support is enabled on the parent Google Tag Settings, and then for a 45-day window covering all entries together. With VTC/EVC off the marker is written but is not read for suppression.
Storage Markers
| Storage Type | Key | TTL |
|---|---|---|
| Cookie/IndexedDB | [prefix]_googleAds_gtag_called | 365 days (45 days when VTC/EVC is enabled) |
Server-Side Enrichment
Adds to context.providers.googleAds:
{
"googleAds": {
"fired": "Wed Nov 27 2024 13:31:52 GMT+0300 (GMT+03:00)",
"gclid": "...",
"wbraid": "..."
}
}vtcEnabled is added when VTC/EVC Support is on. The payload is not per-account — with several entries configured there is no indication of which account a given sync served.
Verification
- Check Browser Developer Tools:
- Open Network tab and filter for
googleadservices.com - Look for conversion requests with your Ads ID and label
- Verify
send_toparameter contains correctAW-XXXXXX/labelformat
- Open Network tab and filter for
- Check Cookies/Storage:
- Look for
[prefix]_googleAds_gtag_calledmarker - Verify marker is set after sync fires
- Look for
- Check Google Ads Dashboard:
- Navigate to Google Ads > Tools & Settings > Conversions
- Check that conversions are being recorded (may take up to 24 hours)
- Server-side Event Validation:
- Use MetaRouter's event debugger
- Verify
context.providers.googleAds.firedis present
Updated 1 day ago