For Google Ads conversion tags to accurately count relevant events (clicks, form submissions, product or service purchases, etc.) and for bids to be validated through verified data, it is essential that campaign performance is properly measured and advertising budgets are used efficiently.
Google Ads offers many features to enrich conversion data. This guide comprehensively covers the enhanced conversions feature, setup methods, data format requirements, common errors, and data matching strategies for multi-stage conversions.
What Are Enhanced Conversions?
In conjunction with Google Ads conversion tags, enhanced conversions enable optimization of conversion measurement accuracy and more effective bidding. This feature is based on supplementing the associated conversion tag with first-party customer data hashed using SHA-2561. One or more of the following data fields must be available:
- Email (recommended)
- Name and shipping/billing address (street, city, state/region, postal code)
A phone number may also be included in addition to either of the two fields above.
When a customer completes a defined conversion action (e.g., a product purchase), first-party customer data can be associated with that conversion event alongside the conversion tag. If the website provides the customer’s email address, shipping address, phone number, and other first-party data (with the customer’s consent) during the conversion process, this information can be sent to Google together with the conversion tag signal (in hashed form) and used to improve conversion measurement2.
Hashing Algorithm
The hashing function maps variable-length data sets into fixed-length data sets using an algorithm (e.g., SHA-256). This ensures the privacy and security of hashed data3.
{% assign secretString = "secret string" %}
SHA-1: {{ secret String | sha1 }} -> da39a3ee5e6b4b0d3255bfef95601890afd80709
SHA-256: {{ secret String | sha256 }} -> e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Google tags similarly apply one-way hashing to first-party customer data using the SHA-256 algorithm.
This feature does not support pre-hashing. Hashing is performed by Google tags.
Enhanced Conversions for Web vs. Leads
Depending on the type of enhanced conversions used, hashed data can be utilized in different ways:
| Enhanced conversions for web | Enhanced conversions for leads |
|---|---|
| On-site conversion events (sales, form submissions, etc.) | Purchases made outside the website (via phone, email, etc.) |
When a conversion is recorded, hashed first-party customer data is linked to the customer’s Google account to improve conversion measurement. This enables:
- Recovery of conversions that would otherwise be unmeasurable
- Improved bidding through enhanced data quality
Setup Methods
Enhanced conversions for web can be set up in four different ways.
Google Ads Panel
Google Ads provides the ability to link customer data to relevant fields using CSS and JavaScript variables under the conversion tag. While practical, this method will fail if CSS definitions or JS variables change or become inaccessible.
Ensure that relevant fields are assigned to fixed and unique values.
GTAG
To send customer data to Google via the Global Site Tag, the allow_enhanced_conversions parameter must be set to true:
gtag("config", "AW-CONVERSION_ID", { allow_enhanced_conversions: true });
Then pass customer data via user_data. Example Liquid template for Shopify stores:
{% if customer.accepts_marketing == true %}
gtag('set', 'user_data', {
'email': '{{ customer.email }}',
'phone_number': '{{ customer.phone }}',
'address': [{
'first_name': '{{ customer.first_name }}',
'last_name': '{{ customer.last_name }}',
'street': '{{ customer.addresses[0].street }}',
'city': '{{ customer.addresses[0].city }}',
'region': '{{ customer.addresses[0].province }}',
'postal_code': '{{ customer.addresses[0].zip }}'
}]
});
{% endif %}
GTM
In addition to the Global Site Tag, data can be processed through data layer variables or by selecting HTML elements on the page via Google Tag Manager.
Under the conversion tag’s enhanced conversions settings, select Global site tag or Google Tag Manager, define the page URL where the conversion occurs, and initiate a scan.
Create a Google Ads conversion tag for GTM using data layer variables:
Select Include user-provided data from website to link user data to the corresponding fields. GTM offers two variable formats: Manual configuration and Code.
With Manual configuration, each field can be individually selected as User-provided Data. With Code, a Custom JavaScript must be used:
function () {
return {
"email": '{{dL - getClientInfo _ clientEmail}}',
"phone_number": '{{dL - getClientInfo _ clientPhone}}',
"address": {
"first_name": '{{dL - getClientInfo _ clientFirstName}}',
"last_name": '{{dL - getClientInfo _ clientLastName}}',
"street": '{{dL - getClientInfo _ clientAddressStreet}}',
"city": '{{dL - getClientInfo _ clientAddressCity}}',
"region": '{{dL - getClientInfo _ clientAddressRegion}}',
"postal_code": '{{dL - getClientInfo _ clientAddressZip}}',
"country": '{{dL - getClientInfo _ clientAddressCountry}}'
}
}
}
The _tag_mode value varies depending on the Manual configuration or Code selection.
Google Ads API
Data can also be sent to Google via the Google Ads API4. For importing CRM data into conversion tags and leveraging offline activities for bid optimization, the API provides a more effective solution. When using first-party customer data from lead forms to send conversions to Google, there is no need to modify lead forms or CRM systems to capture GCLID data5. Instead, previously obtained data (e.g., email) is used for conversion measurement.
Data Fields and Format Requirements
First-party customer data must be accessible on the same page/screen as the associated conversion tag. If this data is part of a flow, it can be stored in the browser cache in hashed form and used as needed.
All transmitted data must be treated as string-type variables.
Matching Keys
| Data field | Parameter | Description |
|---|---|---|
| Customer email address (in hashed form) | ||
| Phone number | phone_number | Customer phone number. Remove symbols and hyphens, include country code (in hashed form) |
| First name | address.first_name | Customer first name |
| Last name | address.last_name | Customer last name |
| Street | address.street | Street, avenue, building name and number |
| City | address.city | City |
| Region | address.region | State, province, or region name |
| Postal code | address.postal_code | Postal code |
| Country | address.country | Two-letter country code per ISO 3166-1 alpha-2 standard |
At least one of email or address fields must be provided. Phone number should also be included when available. If a field cannot be collected, remove it entirely rather than sending it blank.
Phone Number Format
When different masking formats are used for phone numbers (in both transactional and form fields), each format produces a different hash value:
| Phone Number | SHA-256 Hash |
|---|---|
| +905554443322 | 93d891ecb6e82af6a73fced2463b292ffa5c9b2004299ff2e912904a012fb3e7 |
| 05554443322 | da934756bfef14f0f75afea2028e7d0b2408634e2efa4ef0bad49002dc2e90b7 |
| 5554443322 | fd10f40cc24f4b160584182a59b174c870330b4a8d1516c1a71dfcddb4b55509 |
| 555 444 33 22 | 8b01cf10c64884ab6106cbe1aa2ae06552671a3f45343b26a04a164056146531 |
E.164 format is recommended for phone numbers6.
Email Format
While email is a less problematic input field compared to phone numbers, case consistency still matters:
| Email Address | SHA-256 Hash |
|---|---|
| hello@google.com | 8045c2e6fb47ce67ee758a504062cb809796be36aaf8abb868ad8156a2306061 |
| Hello@google.com | 54a38abc0aef5c44fcef760d90f2513760290d2ca244150d6a21a02f1da3dda6 |
| HELLO@GOOGLE.COM | af59669972cbb90d01aa6330545288f2aeaa5a1d839f62526ea6b1f0269cde39 |
Address fields are generally managed through dropdown lists and rarely cause issues. However, region definitions can vary across countries, so customer data should be reviewed broadly7.
Data Matching in Multi-Stage Conversions
When both macro and micro conversions are defined:
- A visitor from a lead form later becomes a customer
- A customer who placed a pre-order later completes the transaction
- A user who submitted a rental request later completes the process
In these or similar scenarios, the conversion tag may need to fire at multiple stages. Therefore, having at least one field (preferably email) in conversion tags with consistent data is critical for user activity tracking, conversions, and campaign success8 9. If a phone number was previously obtained, including additional user information in the macro conversion at the next stage will further enhance conversion effectiveness.
Google maintains a list of email addresses and corresponding hashed strings for matching purposes. After your hashed email data is uploaded, Google Ads compares each hashed string in your data against the hashed strings of Google accounts. If a match is found, the relevant conversion records are marked as matched10.
To resolve warnings and ensure data consistency, multiple conversion tags can be created for the same stage and objective, with the appropriate tag capturing the conversion signal. Additionally, offline conversion data from lead forms can be uploaded to Google Ads or transferred via API.
The enhanced conversions feature does not require modifying lead forms or CRM systems to capture GCLID data5.
Diagnostic Report and Common Errors
After enabling the feature, a validation and learning period of approximately 72 hours begins based on daily conversion volume. This process is tracked through the conversion’s diagnostic report11.
Status Descriptions
Enhanced conversions recorded : No issues detected and data flow is active
Enhanced conversions unavailable : Customer data requirements for enhanced conversions have not been accepted12
Enhanced conversion data pending : Sufficient data flow has not yet been established. It may take up to 48 hours after enabling enhanced conversions for data flow to begin.
Setup issues detected : There is an issue with the enhanced conversion setup13
No new conversion data to process : No conversion has been recorded in the last 7 days, so associated first-party customer data has not been sent.
”Not enough matches for your conversions” Error
When using GTM or GTAG, discrepancies may occur in dynamic data. For example, the likelihood of receiving empty phone numbers is quite high. In such cases, this error occurs because empty data prevents proper matching between conversions and customer data.
”Setup is missing required address fields” Error
This error occurs when previously sent data fields are not consistently passed in subsequent conversions, disrupting the learning process. Each null value in required fields results in an average 24-hour error notification and degraded feature performance11.
Fixing Empty Fields: Shopify Liquid Example
The following code snippet is prepared for use in the Shopify Order Status Page field, transforming customer information into data layer format for enhanced conversion tracking. In addition to customer, you can also access customer data via checkout or order objects14:
{% if first_time_accessed %}
{% unless post_purchase_page_accessed %}
post_purchase_page_accessed
{% endunless %}
<script>
window.dataLayer = window.dataLayer || [];
dataLayer.push({
event: 'get_more_info',
getCustomerInfo: {
{% unless customer.email == blank %}"email": "{{ customer.email }}",{% endunless %}
{% unless customer.phone == blank %}"phone_number": "{{ customer.phone }}",{% endunless %}
{% unless customer.first_name == blank %}"first_name": "{{ customer.first_name }}",{% endunless %}
{% unless customer.last_name == blank %}"last_name": "{{ customer.last_name }}",{% endunless %}
"address": [{
{% unless customer.addresses[0].street == blank %}"street": "{{ customer.addresses[0].street }}",{% endunless %}
{% unless customer.addresses[0].city == blank %}"city": "{{ customer.addresses[0].city }}",{% endunless %}
{% unless customer.addresses[0].province_code == blank %}"region": "{{ customer.addresses[0].province_code }}",{% endunless %}
{% unless customer.addresses[0].zip == blank %}"postal_code": "{{ customer.addresses[0].zip }}",{% endunless %}
{% unless customer.addresses[0].country_code == blank %}"country": "{{ customer.addresses[0].country_code }}"{% endunless %}
}],
}
});
</script>
{% endif %}
Fixing Empty Fields: GTM Custom JavaScript Example
The data layer may be empty or undefined. Implement checks with these factors in mind:
function(){
var obj_customer = {}
var obj_address = {}
if (window.hasOwnProperty('Shopify')){
if(Shopify.checkout.email) obj_customer['email'] = Shopify.checkout.email;
if(Shopify.checkout.billing_address.phone) obj_customer['phone'] = Shopify.checkout.billing_address.phone;
if(Shopify.checkout.billing_address.first_name) obj_address['first_name'] = Shopify.checkout.billing_address.first_name;
if(Shopify.checkout.billing_address.last_name) obj_address['last_name'] = Shopify.checkout.billing_address.last_name;
if(Shopify.checkout.billing_address.address1) obj_address['street'] = Shopify.checkout.billing_address.address1;
if(Shopify.checkout.billing_address.city) obj_address['city'] = Shopify.checkout.billing_address.city;
if(Shopify.checkout.billing_address.province_code) obj_address['country'] = Shopify.checkout.billing_address.province_code;
if(Shopify.checkout.billing_address.zip) obj_address['postal_code'] = Shopify.checkout.billing_address.zip;
obj_customer['address'] = obj_address;
}
return obj_customer;
}
Tag Verification
During the verification phase, network activity can be monitored. Enter googleadservices.com/pagead/conversion/ in the search field to view query parameter details related to the conversion signal in the Payload section.
If customer data has been successfully captured, it will be listed alongside the em parameter. ec_mode indicates how customer data was processed: m for Manual configuration, c for Code. Parameters are separated by ~ within the request.
tv.1~
em.1nZ4hb8syB4LWVNtF-yqGoQZo3kFWcyvdio_A2gJvNw~
fn0.ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo~
ln0.eZ75KhGvkY4_t0HfQpNPO1aO0tk6wd908bjUGieTKm8~
sa0.dskjC8o14QJxgk4s9I4Ly85pzj_VLf6KDX9foLGKYzY~
ct0.los%20angeles~
pc0.90017~
rg0.california~
co0.US
The example values above correspond to the following fields:
- em: email
- fn0: first name
- ln0: last name
- sa0: street address
- ct0: city
- pc0: postal code
- rg0: region
- co0: country
If multiple data points are defined for a customer, they can be sent to Google as an array. The absence of the em parameter in the request indicates that customer data was not associated with the conversion tag.
Advanced Topics
For user_data scope and precedence behavior, event-level override mechanisms, null handling, consent mode v2 integration, and scenario-based outcomes, see the Google Ads gtag.js: Conversion, Remarketing, and Cart Data Guide.
*[GCLID]: Google Click Identifier
Footnotes
- About enhanced conversions. Google Ads Help ↩
- Manually set up enhanced conversions for web with the global site tag. Google Ads Help ↩
- Hashed data: Definition. Google Ads Help ↩
- Enhanced Conversions. Google Ads API ↩
- Set up enhanced conversions for leads with the global site tag. Google Ads Help ↩ ↩2
- E.164. Wikipedia ↩
- Fix Customer Match issues. Google Ads Help ↩
- About modeled online conversions. Google Ads Help ↩
- The future of attribution is data-driven. Ads & Commerce Blog ↩
- How Google uses enhanced conversion data. Google Ads Ad Policy Help ↩
- About the enhanced conversion tag diagnostic report for web. Google Ads Help ↩ ↩2
- Customer data policies. Google Ads Help ↩
- Manually set up enhanced conversions for web with Google Tag Manager. Google Ads Help ↩
- Objects. Shopify.dev ↩
- 01 Enhanced conversions hash first-party customer data with SHA-256 to improve conversion measurement accuracy
- 02 Setup can be done via Google Ads panel, GTAG, GTM, or Google Ads API
- 03 At least one of email or address fields must be provided; remove empty parameters instead of sending blank values
- 04 Phone numbers must use E.164 format; different formats produce different SHA-256 hashes
- 05 Empty customer data fields cause 'Not enough matches' errors; use Liquid unless checks in Shopify stores
- 06 Check for the em parameter in Network requests to verify tag operation; ec_mode indicates setup method
+ What data fields do enhanced conversions support?
Email, phone number, first name, last name, street address, city, region, postal code, and country code. At least email or address must be provided.
+ How do you enable enhanced conversions with GTAG?
Set allow_enhanced_conversions to true in the gtag config call. Then pass customer data via gtag('set', 'user_data', ...).
+ How do you verify the enhanced conversion tag is working?
Check the browser Network tab for googleadservices.com/pagead/conversion/ requests and confirm the em parameter is present.
+ What is the difference between enhanced conversions for web and for leads?
Enhanced conversions for web cover on-site events like sales and form submissions. Enhanced conversions for leads measure purchases from off-site channels like phone or email.
+ Why does the 'Not enough matches' error occur in the diagnostics report?
This error appears when customer data sent with the conversion tag contains empty fields. Remove the parameter entirely instead of sending blank values.
+ How long does it take for enhanced conversions to start working?
A validation and learning period of approximately 72 hours begins after activation, depending on daily conversion volume.
+ How do you fix 'Setup is missing required address fields'?
This error occurs when previously sent data fields are not consistently included in subsequent conversions. Ensure the same fields are sent consistently with every conversion.