Enhanced Conversions
Implement Google Ads Enhanced Conversions to improve conversion measurement accuracy using first-party customer data.
What Are Enhanced Conversions?
Enhanced Conversions supplement your existing conversion tags with hashed first-party customer data, enabling better attribution when:
- Third-party cookies are blocked
- Cross-device journeys are involved
- Click IDs expire before conversion
How It Works
┌─────────────────────────────────────────────────────────┐
│ Conversion Event │
├─────────────────────────────────────────────────────────┤
│ │
│ Standard Conversion Enhanced Conversion │
│ ───────────────────────────────────────────────────── │
│ • Click ID (gclid) • Click ID + User Data │
│ • Cookie-based • Hashed email/phone │
│ • Device-limited • Cross-device capable │
│ │
│ Ad Click ──▶ Cookie ──▶ Conversion │
│ │ │
│ ▼ │
│ Enhanced data │
│ (hashed PII) │
│ │
└─────────────────────────────────────────────────────────┘
Benefits
| Metric | Typical Improvement | |--------|---------------------| | Observed conversions | +5-15% | | Conversion accuracy | +10-20% | | Attribution accuracy | +15-25% | | Cross-device tracking | Significantly improved |
Prerequisites
Before implementing:
- [ ] Google Ads account with conversion tracking
- [ ] Google Tag Manager (recommended)
- [ ] Access to website backend/data layer
- [ ] Privacy policy updated to cover data sharing
- [ ] User consent mechanism in place
Implementation Methods
Method 1: GTM with Data Layer (Recommended)
Best for dynamic websites with existing data layer.
Step 1: Data Layer Push
Add user data to your data layer on conversion:
// On purchase/lead form submission
dataLayer.push({
event: 'purchase',
transaction_id: 'T_12345',
value: 99.99,
currency: 'USD',
// Enhanced conversion data
enhanced_conversion_data: {
email: '[email protected]'
}
});
Step 2: Create Data Layer Variable
In GTM:
- Variables → New → Data Layer Variable
- Name:
DLV - Enhanced Conversion Email - Data Layer Variable Name:
enhanced_conversion_data.email
Step 3: Configure Conversion Tag
- Open your Google Ads Conversion Tracking tag
- Enable Include user-provided data from your website
- Select New Variable under User-provided data
- Map the email variable
Method 2: Automatic Collection
For sites with standard form fields.
- In Google Ads tag, enable Automatically detect
- Google will scan for fields: email, phone, name, address
- Data is hashed automatically
Limitations:
- Less reliable than manual implementation
- May not capture all conversions
- Depends on form field naming
Method 3: CSS Selector
Specify CSS selectors for user data fields:
// In GTM User-Provided Data variable
{
"email": {
"cssSelector": "#checkout-email, .customer-email input"
},
"phone_number": {
"cssSelector": "#checkout-phone, input[type='tel']"
}
}
Complete Data Layer Implementation
Full User Data Object
// Complete enhanced conversion data
dataLayer.push({
event: 'purchase',
transaction_id: 'T_12345',
value: 149.99,
currency: 'USD',
enhanced_conversion_data: {
// Required: At least one identifier
email: '[email protected]',
// Recommended: Additional identifiers
phone_number: '+15551234567',
// Optional: Address data for higher match rates
first_name: 'John',
last_name: 'Doe',
street: '123 Main Street',
city: 'San Francisco',
region: 'CA',
postal_code: '94105',
country: 'US'
}
});
Data Normalization
Google recommends normalizing data before pushing:
function normalizeEmail(email) {
return email.toLowerCase().trim();
}
function normalizePhone(phone) {
// Remove non-numeric, keep country code
return phone.replace(/[^0-9+]/g, '');
}
function normalizeName(name) {
return name.toLowerCase().trim();
}
// Usage
dataLayer.push({
event: 'purchase',
enhanced_conversion_data: {
email: normalizeEmail(userData.email),
phone_number: normalizePhone(userData.phone),
first_name: normalizeName(userData.firstName),
last_name: normalizeName(userData.lastName)
}
});
GTM Variable Configuration
User-Provided Data Variable
- Variables → New
- Choose User-Provided Data
- Configure data sources:
| Field | Source Type | Value |
|-------|-------------|-------|
| Email | Data Layer | {{DLV - Enhanced Email}} |
| Phone | Data Layer | {{DLV - Enhanced Phone}} |
| First Name | Data Layer | {{DLV - Enhanced First Name}} |
| Last Name | Data Layer | {{DLV - Enhanced Last Name}} |
| Street | Data Layer | {{DLV - Enhanced Street}} |
| City | Data Layer | {{DLV - Enhanced City}} |
| Region | Data Layer | {{DLV - Enhanced Region}} |
| Postal Code | Data Layer | {{DLV - Enhanced Postal Code}} |
| Country | Data Layer | {{DLV - Enhanced Country}} |
Tag Configuration
- Edit your Google Ads Conversion Tracking tag
- Enable Include user-provided data from your website
- Select your User-Provided Data variable
- Save and publish
Server-Side Implementation
For maximum data recovery, implement server-side:
// Server-side GTM tag configuration
// In Google Ads Conversion Tracking tag
// Event data from client
const eventData = getAllEventData();
// Add enhanced conversion data
const enhancedConversionData = {
sha256_email_address: hashSHA256(eventData.user_data.email),
sha256_phone_number: hashSHA256(eventData.user_data.phone)
};
Benefits of Server-Side
| Aspect | Client-Side | Server-Side | |--------|-------------|-------------| | Ad blocker bypass | No | Yes | | Data enrichment | Limited | Full | | PII handling | Browser exposure | Server-only | | Match rate | Good | Better |
Verification & Testing
GTM Preview Mode
- Start Preview mode
- Complete a test conversion
- Check the conversion tag fired
- Verify
user_dataparameters present
Google Ads Diagnostics
- Go to Google Ads → Tools → Conversions
- Select your conversion action
- Check Diagnostics tab
- Look for "Enhanced conversions" section
Verification Checklist
- [ ] Tag fires on conversions
- [ ] User data parameters populated
- [ ] Data appears hashed (not plain text)
- [ ] Google Ads shows "Active" status
- [ ] Match rate visible in diagnostics
Privacy Compliance
Required Disclosures
Update your privacy policy to include:
- Data shared with Google for advertising
- How user data is protected (hashing)
- Purpose: conversion measurement
- User rights to opt out
Consent Requirements
// Only send enhanced data with marketing consent
if (hasMarketingConsent()) {
dataLayer.push({
event: 'purchase',
enhanced_conversion_data: {
email: customerEmail
}
});
} else {
// Send basic conversion without user data
dataLayer.push({
event: 'purchase'
});
}
Troubleshooting
No Match Rate Showing
| Cause | Solution | |-------|----------| | Too few conversions | Wait for 20+ conversions | | Data not hashed | Check SHA-256 hashing | | Missing email | Verify data layer population | | Tag misconfigured | Review variable mapping |
Low Match Rate
| Cause | Solution | |-------|----------| | Bad data quality | Normalize email/phone | | Single identifier | Add phone + name + address | | Hash format wrong | Use lowercase before hashing |
Enhanced Conversions Not Active
- Verify acceptance of Enhanced Conversions T&Cs
- Check conversion action settings
- Verify tag is firing correctly
- Allow 72 hours for activation
Related: Conversion Tracking Next: Attribution Modeling