Enhanced Conversions Setup Issues
What This Means
Enhanced Conversions is a Google Ads feature that supplements conversion tags by sending hashed first-party customer data (email, phone, address) from your website to Google. This data helps Google match conversions more accurately, especially in a cookie-less world with iOS 14.5+ tracking limitations, browser privacy features, and ad blockers. Without enhanced conversions, you lose 20-40% of conversion data, can't optimize campaigns properly, and waste ad spend on untracked conversions.
How Enhanced Conversions Work
Standard Conversion Tracking (Limited):
// Basic conversion tag
gtag('event', 'conversion', {
'send_to': 'AW-123456789/AbC-D_efG-h12_34-567',
'value': 99.99,
'currency': 'USD',
'transaction_id': '12345'
});
// Problem: Relies only on cookies
// Lost if user:
// - Blocks cookies
// - Uses Safari (ITP)
// - Uses iOS 14.5+ (ATT)
// - Clears cookies
Enhanced Conversions (Better):
// Send hashed user data with conversion
gtag('event', 'conversion', {
'send_to': 'AW-123456789/AbC-D_efG-h12_34-567',
'value': 99.99,
'currency': 'USD',
'transaction_id': '12345',
// Enhanced conversion data
'email': 'user@example.com',
'phone_number': '+1234567890',
'address': {
'first_name': 'John',
'last_name': 'Smith',
'street': '123 Main St',
'city': 'New York',
'region': 'NY',
'postal_code': '10001',
'country': 'US'
}
});
// Google hashes this data and matches to signed-in Google users
// Much higher match rate = better tracking
Impact on Your Business
Conversion Tracking Accuracy:
- 20-40% more conversions tracked - Recovers cookie-blocked conversions
- Better attribution - Know which ads actually drive sales
- Reduced data loss - iOS 14.5+ and Safari ITP protection
- Cross-device tracking - Match users across devices
Ad Campaign Performance:
- Better ROAS - Optimize based on accurate data
- Smarter bidding - Automated bidding has more signals
- Campaign optimization - Google can optimize better with more data
- Budget efficiency - Stop wasting spend on ineffective ads
Without Enhanced Conversions:
100 actual conversions
↓
60-80 tracked in Google Ads (20-40% lost)
↓
Google optimizes campaigns based on incomplete data
↓
Wasted ad spend + missed opportunities
With Enhanced Conversions:
100 actual conversions
↓
85-95 tracked in Google Ads (5-15% lost)
↓
Google optimizes with accurate data
↓
Better ROI + campaign performance
How to Diagnose
Method 1: Google Ads Enhanced Conversions Status
- Open Google Ads
- Go to Goals → Conversions
- Click on conversion action
- Check Enhanced conversions section
Status Indicators:
✅ Enabled and working:
Enhanced conversions: Enabled
Status: Recording enhanced conversions
Match rate: 75% (Good)
⚠️ Enabled but not working:
Enhanced conversions: Enabled
Status: No enhanced data detected in last 7 days
Match rate: 0%
❌ Not enabled:
Enhanced conversions: Not set up
Method 2: Google Tag Assistant
- Install Tag Assistant
- Visit conversion page (checkout confirmation, thank you page)
- Complete test conversion
- Check Tag Assistant
Look For:
✅ Working:
Conversion Event Fired
Enhanced Conversion Data Detected:
- email: ✓ (hashed)
- phone: ✓ (hashed)
- address: ✓ (hashed)
❌ Not working:
Conversion Event Fired
Enhanced Conversion Data: None detected
Method 3: Browser DevTools Network Tab
- Open DevTools (
F12) - Go to Network tab
- Filter by
googleadservices.com - Complete test conversion
- Examine conversion request
Check Request Payload:
✅ Enhanced data present:
Request URL: /pagead/conversion/...
Payload:
em: "482c811da5d5b4bc6d497ffa98491e38..." (hashed email)
ph: "c6c7418748c87c98e73d5f7f93a1e..." (hashed phone)
fn: "96d9632f363564cc3032521409cf22a14a... (hashed first name)
❌ No enhanced data:
Request URL: /pagead/conversion/...
Payload:
value: 99.99
currency: USD
(no em, ph, fn fields)
Method 4: Check Implementation Method
Manual code review:
// ❌ BAD: No enhanced conversion data
gtag('event', 'conversion', {
'send_to': 'AW-123456789/AbC-D_efG-h12_34-567',
'value': 99.99,
'currency': 'USD'
});
// ✅ GOOD: Enhanced conversion data included
gtag('event', 'conversion', {
'send_to': 'AW-123456789/AbC-D_efG-h12_34-567',
'value': 99.99,
'currency': 'USD',
'email': userEmail, // From form
'phone_number': userPhone
});
Method 5: Google Ads Diagnostics
- Tools & Settings → Conversions
- Select conversion action
- Check Diagnostics tab
- Review issues
Common Warnings:
⚠️ Enhanced conversions not detected
⚠️ Low match rate (below 50%)
⚠️ Inconsistent data format
⚠️ Missing required fields
General Fixes
Fix 1: Basic Enhanced Conversions Setup
Add customer data to conversion event:
// On conversion page (checkout success, thank you page)
gtag('event', 'conversion', {
'send_to': 'AW-123456789/AbC-D_efG-h12_34-567',
'value': 99.99,
'currency': 'USD',
'transaction_id': '12345',
// Enhanced conversion data (Google hashes automatically)
'email': 'customer@example.com',
'phone_number': '+12345678900', // E.164 format: +[country code][number]
'address': {
'first_name': 'John',
'last_name': 'Smith',
'street': '123 Main St',
'city': 'New York',
'region': 'NY', // State/province
'postal_code': '10001',
'country': 'US' // ISO 3166-1 alpha-2
}
});
Fix 2: Pull Data from Form Fields
Capture user data from checkout form:
// On form submission or order confirmation page
function sendEnhancedConversion() {
// Get data from form fields or page variables
const email = document.getElementById('email').value;
const phone = document.getElementById('phone').value;
const firstName = document.getElementById('first_name').value;
const lastName = document.getElementById('last_name').value;
const street = document.getElementById('street').value;
const city = document.getElementById('city').value;
const state = document.getElementById('state').value;
const zip = document.getElementById('zip').value;
// Send enhanced conversion
gtag('event', 'conversion', {
'send_to': 'AW-123456789/AbC-D_efG-h12_34-567',
'value': parseFloat(document.getElementById('order_total').value),
'currency': 'USD',
'transaction_id': document.getElementById('order_id').value,
'email': email,
'phone_number': phone,
'address': {
'first_name': firstName,
'last_name': lastName,
'street': street,
'city': city,
'region': state,
'postal_code': zip,
'country': 'US'
}
});
}
// Trigger on page load (order confirmation)
window.addEventListener('load', sendEnhancedConversion);
Fix 3: E-commerce Platform Integration
WooCommerce example:
// functions.php or custom plugin
add_action('woocommerce_thankyou', 'enhanced_conversion_tracking');
function enhanced_conversion_tracking($order_id) {
$order = wc_get_order($order_id);
// Get customer data
$email = $order->get_billing_email();
$phone = $order->get_billing_phone();
$first_name = $order->get_billing_first_name();
$last_name = $order->get_billing_last_name();
$address = $order->get_billing_address_1();
$city = $order->get_billing_city();
$state = $order->get_billing_state();
$postcode = $order->get_billing_postcode();
$country = $order->get_billing_country();
$total = $order->get_total();
?>
<script>
gtag('event', 'conversion', {
'send_to': 'AW-123456789/AbC-D_efG-h12_34-567',
'value': <?php echo $total; ?>,
'currency': '<?php echo $order->get_currency(); ?>',
'transaction_id': '<?php echo $order_id; ?>',
'email': '<?php echo $email; ?>',
'phone_number': '<?php echo $phone; ?>',
'address': {
'first_name': '<?php echo $first_name; ?>',
'last_name': '<?php echo $last_name; ?>',
'street': '<?php echo $address; ?>',
'city': '<?php echo $city; ?>',
'region': '<?php echo $state; ?>',
'postal_code': '<?php echo $postcode; ?>',
'country': '<?php echo $country; ?>'
}
});
</script>
<?php
}
Fix 4: Shopify Enhanced Conversions
Shopify theme (thank you page):
<!-- In Settings → Checkout → Additional scripts -->
{% if first_time_accessed %}
<script>
gtag('event', 'conversion', {
'send_to': 'AW-123456789/AbC-D_efG-h12_34-567',
'value': {{ checkout.total_price | money_without_currency }},
'currency': '{{ checkout.currency }}',
'transaction_id': '{{ checkout.order_id }}',
'email': '{{ checkout.email }}',
'phone_number': '{{ checkout.shipping_address.phone }}',
'address': {
'first_name': '{{ checkout.shipping_address.first_name }}',
'last_name': '{{ checkout.shipping_address.last_name }}',
'street': '{{ checkout.shipping_address.address1 }}',
'city': '{{ checkout.shipping_address.city }}',
'region': '{{ checkout.shipping_address.province_code }}',
'postal_code': '{{ checkout.shipping_address.zip }}',
'country': '{{ checkout.shipping_address.country_code }}'
}
});
</script>
{% endif %}
Fix 5: Google Tag Manager Implementation
GTM enhanced conversions setup:
1. Enable Enhanced Conversions in Tag:
- Edit Google Ads Conversion Tag
- Check "Include user-provided data from your website"
- Select "Code" or "Event Parameters"
2. Create Data Layer Variables:
// Push to dataLayer on conversion page
window.dataLayer = window.dataLayer || [];
dataLayer.push({
'event': 'purchase',
'transactionId': '12345',
'transactionTotal': 99.99,
'userEmail': 'customer@example.com',
'userPhone': '+12345678900',
'userFirstName': 'John',
'userLastName': 'Smith',
'userStreet': '123 Main St',
'userCity': 'New York',
'userRegion': 'NY',
'userPostalCode': '10001',
'userCountry': 'US'
});
3. Map Variables in GTM:
- Create User-Defined Variables for each field
- Variable Type: Data Layer Variable
- Data Layer Variable Name:
userEmail,userPhone, etc.
4. Configure in Conversion Tag:
- Email:
\{\{userEmail\}\} - Phone:
\{\{userPhone\}\} - First Name:
\{\{userFirstName\}\} - etc.
Fix 6: Fix Phone Number Format
Use E.164 international format:
// ❌ WRONG: Various formats
'555-1234' // Missing country code
'(555) 123-4567' // Wrong format
'1234567890' // Missing +
// ✅ CORRECT: E.164 format
'+12345678900' // +[country code][number], no spaces/dashes
// Function to format phone number
function formatPhoneE164(phone, countryCode = '1') {
// Remove all non-digits
phone = phone.replace(/\D/g, '');
// Add country code if missing
if (!phone.startsWith(countryCode)) {
phone = countryCode + phone;
}
// Add + prefix
return '+' + phone;
}
// Usage:
const formattedPhone = formatPhoneE164('(555) 123-4567', '1');
// Returns: '+15551234567'
Fix 7: Normalize Email Addresses
Clean email data before sending:
function normalizeEmail(email) {
// Convert to lowercase
email = email.toLowerCase().trim();
// Remove Gmail dots and plus addressing
if (email.includes('@gmail.com')) {
const [local, domain] = email.split('@');
const cleanLocal = local.split('+')[0].replace(/\./g, '');
email = cleanLocal + '@' + domain;
}
return email;
}
// Usage:
const email = normalizeEmail('John.Doe+newsletter@Gmail.com');
// Returns: 'johndoe@gmail.com'
gtag('event', 'conversion', {
'send_to': 'AW-123456789/AbC-D_efG-h12_34-567',
'email': email
});
Fix 8: Test Enhanced Conversions
Create test conversion:
// Test enhanced conversions in development
function testEnhancedConversion() {
gtag('event', 'conversion', {
'send_to': 'AW-123456789/AbC-D_efG-h12_34-567',
'value': 10.00,
'currency': 'USD',
'transaction_id': 'TEST-' + Date.now(),
'email': 'test@example.com',
'phone_number': '+11234567890',
'address': {
'first_name': 'Test',
'last_name': 'User',
'street': '123 Test St',
'city': 'Test City',
'region': 'TS',
'postal_code': '12345',
'country': 'US'
}
});
console.log('Test enhanced conversion fired');
}
// Run test
testEnhancedConversion();
Platform-Specific Guides
Detailed implementation instructions for your specific platform:
Verification
After implementing enhanced conversions:
Test 1: Tag Assistant
- Open Tag Assistant
- Complete test purchase
- Check conversion event
- Verify enhanced data detected
Test 2: Google Ads Conversion Report
- Wait 24-48 hours
- Check Conversions report
- Look for "Enhanced conversions" column
- Match rate should be 50%+ (ideally 70%+)
Test 3: Network Request
- DevTools Network tab
- Complete conversion
- Find googleadservices request
- Check for
em=,ph=,fn=parameters (hashed)
Test 4: Diagnostics
- Google Ads → Conversions
- Click conversion action
- Check diagnostics
- Should show "Recording enhanced conversions"
Common Mistakes
- Wrong phone format - Must be E.164 (+12345678900)
- Not normalizing emails - Case-sensitive, extra spaces
- Missing data - Not all conversions have user data
- Wrong timing - Send on confirmation page, not form submit
- Invalid country codes - Use ISO 3166-1 alpha-2 (US, GB, CA)
- Including PII in GTM container - Security risk
- Not testing - Always test before deploying
- Sending unhashed data - Google hashes automatically, don't pre-hash