Enhanced conversions in Google Ads improve conversion tracking accuracy by sending hashed customer data (like email addresses) alongside your existing conversion tags. This lets Google match conversions to ad clicks even when cookies are blocked or limited. You can set it up through Google Tag Manager, the Google tag (gtag.js), or the Google Ads API, and the whole process takes 30 minutes to an hour depending on your method and site complexity.
What Enhanced Conversions Actually Do
Standard conversion tracking relies on cookies to connect an ad click to a later conversion. When a user blocks third-party cookies, uses a different device, or has browser privacy settings enabled, that connection breaks and your conversion data underreports results. Enhanced conversions fill that gap by capturing first-party customer data from your conversion page (an email address from a purchase confirmation, for example), hashing it with the SHA256 algorithm, and sending it to Google. Google then matches that hashed data against its own signed-in user data to attribute the conversion back to the correct ad click.
You never send raw customer data to Google’s servers. The data is either hashed before transmission or Google normalizes and hashes it before it reaches their servers. All conversion events must be sent over HTTPS.
Before You Start
You need a few things in place before configuring anything:
- An existing conversion action: Enhanced conversions layer on top of a conversion action you’ve already created in Google Ads. You can’t enable them without one.
- Accepted terms of service: Google requires you to accept the enhanced conversions terms within your Google Ads account. If you haven’t accepted, the Google tag will not collect user-provided data even if your code is set up correctly.
- Customer data on your conversion page: Your confirmation or thank-you page needs to display or store at least one qualifying data field. At minimum, you need an email address (preferred), a phone number paired with email or full name and address, or an address that includes first name, last name, postal code, and country.
To accept the terms, go to your Google Ads account, navigate to Goals, then Conversions, and click Settings. You’ll find the enhanced conversions toggle and terms agreement there. Turn it on and select your implementation method.
Setting Up With the Google Tag (gtag.js)
If you use the Google tag directly on your site without a tag manager, this is the most straightforward path. You’ll add a small code snippet to your conversion page, right where your existing Google Ads event snippet lives.
Place this script on your conversion page before the event snippet fires:
<script>
gtag('set', 'user_data', {
"email": yourEmailVariable,
"phone_number": yourPhoneVariable,
"address": {
"first_name": yourFirstNameVariable,
"last_name": yourLastNameVariable,
"street": yourStreetAddressVariable,
"city": yourCityVariable,
"region": yourRegionVariable,
"postal_code": yourPostalCodeVariable,
"country": yourCountryVariable
}
});
</script>
Replace each placeholder (like yourEmailVariable) with the actual JavaScript variable name that holds that customer data on your page. If your site doesn’t collect a particular field, remove that line entirely rather than leaving it blank. All values should be passed as strings.
Formatting Rules
Phone numbers must use E.164 format: 11 to 15 digits with a plus sign prefix and country code, no dashes, parentheses, or spaces. So a US number looks like +14155551234. Country codes should use two-letter ISO codes like “US” or “GB.” You can send up to three email addresses and three phone numbers by passing an array instead of a single string, plus up to two addresses.
You have the option to normalize and hash data yourself before sending it. Normalization means removing leading and trailing whitespace, converting text to lowercase, formatting phone numbers to E.164, and removing periods before the domain in Gmail and Google Mail addresses. Then hash with hex-encoded SHA256. If you’d rather skip this step, send the data unhashed and Google handles normalization and hashing automatically before it reaches their servers.
Setting Up With Google Tag Manager
Google Tag Manager gives you two approaches for passing customer data: CSS selectors (no coding required) and custom JavaScript variables (more flexible).
Using CSS Selectors
This method works well when customer data is visible on the conversion page, like an email address displayed on an order confirmation. Here’s how to grab the CSS selector:
- Go to your conversion page in Chrome.
- Right-click the element containing the data (the email address, for example) and click Inspect.
- In DevTools, right-click the highlighted HTML element, hover over Copy, and select Copy selector.
Now configure it in GTM:
- Open your Google Tag Manager container and select the Google tag you want to edit.
- Expand Event Parameters and click Add parameter.
- Enter
user_dataas the event parameter name. - For the value, create a new User-Provided Data variable.
- Choose Manual configuration in that variable.
- For each data field (email, phone, etc.), click the dropdown and create a new variable.
- Set the variable type to DOM Element, change the selection method to CSS Selector, and paste in the selector you copied.
- Save everything and repeat for each data field you want to capture.
Using Custom JavaScript
If customer data is stored in JavaScript variables on your page rather than displayed in the DOM, use this method instead. In your User-Provided Data variable, select Code as the configuration type. Create a new Custom JavaScript variable and use this structure:
function () {
return {
"email": yourEmailVariable,
"phone_number": yourPhoneVariable,
"address": {
"first_name": yourFirstNameVariable,
"last_name": yourLastNameVariable,
"street": yourStreetAddressVariable,
"city": yourCityVariable,
"region": yourRegionVariable,
"postal_code": yourPostalCodeVariable,
"country": yourCountryVariable
}
}
}
Replace each placeholder with the global JavaScript variable that holds the corresponding data on your conversion page. Remove any fields your site doesn’t collect. Save, then publish your GTM container.
Enhanced Conversions for Leads
If you’re tracking leads rather than e-commerce purchases, there’s a separate flavor called enhanced conversions for leads. This is designed for businesses where the real conversion (a signed contract, a qualified lead, a closed deal) happens offline, long after the initial form submission.
The setup has two parts. First, you configure your Google tag or GTM to capture hashed user data from your website lead form, using the same CSS selector, JavaScript, or automatic detection methods described above. This captures the email or phone number at the moment someone fills out your form.
Second, you import your offline conversion data back into Google Ads using Google Ads Data Manager or the Google Ads API. Each upload record needs to include the conversion name, conversion time, and at least one piece of user-provided data (email, phone, or address) that matches what was captured on the form. Including the Google Click ID (GCLID) with your uploads maximizes accuracy. If you’re using the tag to collect user-provided data, GCLIDs are captured automatically, but you should still include them in your uploads when available to ensure proper attribution.
Verifying Your Setup
After implementation, Google needs time to process data before you’ll see results. Check your diagnostics by going to Goals, then Conversions in your Google Ads account. Click on the specific conversion action and look for the enhanced conversions diagnostic report.
You’ll see one of a few statuses. “Recording enhanced conversions” means everything is working and no major issues are detected. “Needs attention” means the setup is active but has errors, like missing data fields, that you need to fix. If you see a message about no recent conversion data to process, it means no conversions have been recorded in the last seven days. Check that your campaigns are running and that your ads are directing people to the page with the conversion tag.
It typically takes a few days after your first conversion for diagnostics to populate. Don’t panic if you see nothing immediately after publishing your changes.
What Data to Hash and What to Leave Plain
This trips people up: only hash personally identifiable data like email addresses, phone numbers, first name, last name, and street address. Do not hash city, state/region, country, or postal code. Those geographic fields should be sent in plain text. If you’re letting Google handle hashing automatically (which is the simpler option), this distinction doesn’t matter because Google normalizes and hashes the right fields on its end. But if you’re pre-hashing data yourself, getting this wrong will prevent matches.

