Google Ads CAPI
Technical guide for media buyers: Server Conversions + Enhanced Conversions. sGTM architecture, deduplication, EU consent, troubleshooting.
1Role / Purpose
Google Ads Enhanced Conversions is the server-side destination for Google Ads conversions. It occupies a specific place in the stack:
Shopify Store ↓ GTM Web (DataLayer + Consent Mode v2) ↓ GA4 (technical transport) ↓ sGTM (Server-Side GTM) ↓ ┌─────────────────────────────────────┐ │ GADS – Conv – purchase (sGTM tag) │ ← This guide │ Enhanced Conversions enabled │ │ Automatic SHA-256 hashing │ └─────────────────────────────────────┘ ↓ Google Ads Conversions API
This setup delivers:
- 100% server-side Google Ads tracking
- Strict GDPR compliance (EU consent mandatory)
- Better resilience against adblockers
- Improved attribution through Enhanced Conversions
- Deterministic deduplication
The system rests on a single source of conversions: the GTM Web DataLayer, carried through GA4 to the sGTM, then routed to Google Ads.
2Overall Architecture
Full data flow
Cookiebot (EU CMP)
↓
GTM Web (Consent Mode v2 + DataLayer)
↓
GA4 (technical transport only)
↓
Server-Side GTM (sGTM)
↓
Addingwell Google Ads template
↓
Google Ads Conversions APIsGTM routing
The sGTM container receives the GA4 events and routes them to each destination. Google Ads is one of them:
sGTM (server) → GA4 Client (receives the request) ├── GA4 Server tag → Google Analytics 4 ├── META – CAPI – All Events → Meta (Full CAPI) ├── GADS – Conv – purchase → Google Ads Enhanced Conversions ← This guide └── (coming soon) TikTok Events API, Snap CAPI
Core principles
- No Google Ads tag directly in the theme
- No duplicate client + server conversion
- One purchase source only: the GTM Web dataLayer
- Consent required before anything is sent
- GA4 used as technical transport
- The Remarketing tag stays client-side for audiences
Single source of conversions
Every conversion comes exclusively from:
GTM Web → dataLayer purchase → GA4 event → sGTM
Nothing may be sent directly from:
- A browser-side Google Ads tag
- The Shopify theme
- An external app
3Enhanced Conversions in Detail
Enhanced Conversions architecture
Enhanced Conversions (EC) is enabled by default on the sGTM tag GADS – Conv – purchase. User data is hashed server-side automatically by Addingwell, with no manual step.
Data sent (first-party)
The following is collected after consent and hashed SHA-256 server-side before reaching Google:
- Email (SHA-256 hash)
- Phone (SHA-256 hash)
- Optionally first / last name (SHA-256 hash)
- Address (SHA-256 hash)
How EC improves matching
Google uses this hashed data to match the conversion back to the original Google Ads click, even when the gclid cookie is missing or expired. The match rate rises significantly, which means better attribution and more efficient bidding.
Without EC:
Google Ads click → gclid cookie → purchase → Match (if cookie present)
With EC:
Google Ads click → gclid cookie → purchase → Match via gclid
→ Match via email (hash)
→ Match via phone (hash)
→ Match via address (hash)
= Higher match rate, even without a cookieServer-side hashing
Data security
PII is hashed server-side only (sGTM). No PII travels in clear text through browser requests. Hashing is automatic through the Addingwell template.
Rules that matter
- Data collected only after consent (ad_storage + ad_user_data)
- Hashed SHA-256 before it reaches Google
- Never sent in clear text
- Hashing happens in the sGTM, not on the client
4Events & Parameters
Primary conversion
| User action | GA4 | Google Ads |
|---|---|---|
| Purchase | purchase | Conversion Action |
Parameters forwarded
- transaction_id
- value
- currency
- items (when needed)
- gclid / wbraid / gbraid
- hashed user_data (Enhanced Conversions)
5Deduplication Logic
Global unique identifier
transaction_id = conversion_id
The same identifier is used for:
- GA4 purchase
- Google Ads conversion
- sGTM logs
Rules
- One purchase in the dataLayer, and only one
- No second client-side Google Ads send
- No double mapping in the sGTM
- No conversion imported in parallel
6Google Attribution Identifiers
gclid
- Google Ads URL parameter
- Persisted as a first-party cookie (_gcl_aw)
- Takes priority for attribution
- Addingwell cookie restore rewrites it first-party
wbraid / gbraid
- Used in iOS / privacy environments
- gbraid: cross-device attribution (app→web)
- wbraid: web-to-app attribution, iOS 14.5+
- Forwarded when present
Attribution cookies (first-party)
Attribution cookies are persisted first-party by Addingwell (cookie restore), surviving Safari ITP and browser purges:
| Cookie | Parameter | Usage |
|---|---|---|
| _gcl_aw | gclid | Click ID: Google Ads conversion attribution |
| _gcl_gb | gbraid | Click ID: cross-device attribution (app→web) |
| _gcl_gw | wbraid | Click ID: web-to-app attribution, iOS 14.5+ |
Forwarding to the server
- 1Read in GTM Web
- 2Injected into the GA4 event
- 3Forwarded to the sGTM through the first-party transport
- 4Injected into the Addingwell Google Ads template
7Configuration
Required credentials
| Parameter | Source | Location |
|---|---|---|
| Conversion ID | Google Ads > Conversions > Settings | GTM Server variable |
| Conversion Label | Google Ads > Conversions > Settings | GTM Server variable |
sGTM tag
The GADS – Conv – purchase tag is configured in the sGTM container through the Addingwell template. Enhanced Conversions is on by default.
Enhanced Conversions in Google Ads
- 1Go to Google Ads > Conversions > Settings
- 2Enable "Enhanced Conversions"
- 3Pick "Google Tag Manager" as the method
- 4Check that diagnostics confirm the data is arriving
Remarketing tag
The Remarketing tag stays client-side in GTM Web for Google Ads audiences. Only the purchase conversion goes through the sGTM.
8EU Consent
Consent is handled exclusively through:
Cookiebot + GTM Consent Mode v2
Signals Google Ads requires
| Signal | Required | Cookiebot category |
|---|---|---|
| ad_storage | Yes | Marketing |
| ad_user_data | Yes | Marketing |
Without analytics / marketing consent
- No conversion sent
- No gclid forwarded
- No user data sent
- Enhanced Conversions do not work without consent
9Verification
Where to check
- 1Google Ads > Conversions > Diagnostics: check that Enhanced Conversions are being received
- 2Google Ads Tag Assistant: validate the conversion tag and EC
- 3sGTM Preview — confirm the GADS – Conv – purchase tag fires
- 4DevTools > Application > Cookies: check that the gclid, wbraid and gbraid cookies are present
Phase 3: Google Ads checklist
Google Ads-specific verification, lifted from the full QA process:
10Reading the Google Ads Metrics
Why conversions sometimes differ from clicks
Expected causes:
- Consent declined
- Multi-device users
- Cookie blocking
- Attribution delays
- Modelled conversions
Why GA4 ≠ Google Ads
GA4
Based on analytics sessions
Google Ads
Based on ad clicks
The two use different logic. A gap between them is normal.
11Metrics You Can Optimise On
The KPIs worth watching:
- Cost per Conversion
- ROAS
- Conversion Value
- Post-consent conversion rate
- Server-side conversion volume
12Responsibilities Matrix
- dataLayer purchase
- gclid / wbraid persistence
- Consent enforcement
- Deduplication
- sGTM integrity
- Conversion Action setup
- Bidding strategy
- Performance analysis
- Reading attribution
- Investigating cross-platform gaps
- Validating volumes
- Cross-system debugging
13Troubleshooting
Check:
- 1Consent active (ad_storage + ad_user_data)
- 2GA4 purchase present in sGTM Preview
- 3sGTM reception — GADS – Conv – purchase tag fired
- 4Forwarded to Google Ads: conversion visible in Diagnostics
Check:
- gclid present in the landing URL
- First-party _gcl_aw cookie active (check DevTools > Cookies)
- Conversion window configured in Google Ads
- Enhanced Conversions active and data received
- Addingwell cookie restore working
Possible causes:
- Duplicate purchase in the dataLayer
- Conversion imported in parallel (offline import)
- No stable transaction_id
- Browser-side Google Ads tag still active alongside the server one
Check:
- 1Check EC is enabled under Google Ads > Conversions > Settings
- 2Check user data is present in the DataLayer (email, phone)
- 3Check in sGTM Preview that the hashed data is forwarded
- 4Wait 48-72h — EC diagnostics can take time to update
Check:
- Cookie restore disabled in Addingwell
- sGTM custom domain not configured (the cookies are written by the first-party sGTM domain)
- Check in DevTools > Application > Cookies that _gcl_aw, _gcl_gb and _gcl_gw are present
- Enable Cookie Restore under Addingwell > Settings
14Checklist
Weekly media-buyer checklist
Every week, check:
Check the layer you just set up
Scan the store: 41 checks read what it now sends to GA4, Meta and Google Ads.