How to Set Up Enhanced Conversions for Google Ads (and Fix Diagnostics)

By the Mayab Media Team · Level: Advanced · Time: 1 hour

Your conversion tracking works, but Google Ads keeps nudging you to turn on enhanced conversions. Or you already turned them on, and the Diagnostics tab shows Needs attention, a low coverage rate or an alert you don't understand.

Enhanced conversions add a hashed copy of what the customer typed into your form, such as an email address or phone number, to the conversion tag. Google hashes it with SHA-256 and matches it to signed-in Google accounts. That recovers conversions that cookies alone miss, for example when someone clicks on a phone and buys later on a laptop.

The setup has three parts: accept the customer data terms and switch the feature on in Google Ads, tell your tag where to find the data, and then read the diagnostics to see what's broken. Most problems live in that middle step, because the tag looks for an email that isn't there when it fires.

Quick answer

  1. In Google Ads, go to Goals > Settings, open Customer data use, check Turn on enhanced conversions and accept the terms.
  2. In GTM, open your Google Ads conversion tag (or Google tag) and turn on user-provided data with a User-Provided Data variable.
  3. Choose how to collect the data: automatic detection, CSS selectors, or a code/data layer variable. Code is the most reliable.
  4. Test a conversion and check the network request for an em parameter that starts with tv.1~em followed by a long hash.
  5. Wait about 48 hours, then open the conversion action's Diagnostics and fix any alerts.

Before you start

Have these ready before you change anything.

  • Working conversion tracking: The base conversion tag must already fire correctly. If it doesn't, fix that first with our conversion tracking guide.
  • Admin access in Google Ads: You need it to accept the customer data terms.
  • Publish access in GTM: Or access to edit the Google tag if you don't use GTM.
  • A form that collects an email or phone number: Google needs at least an email, or first name, last name, postal code and country. A phone number alone can work, but it matches better with an email.
  • Privacy review: Make sure your privacy policy covers sharing hashed data with Google, and that your Consent Mode setup passes ad_user_data correctly.
  • HTTPS on every page: Hashing fails on insecure pages.

Export your GTM container from Admin > Export Container before you start. It takes ten seconds and saves you from guessing what changed.

What changed in 2026

Google merged enhanced conversions for web and enhanced conversions for leads into one on/off setting. From April 2026, Google Ads accepts user data from website tags, Data Manager and API connections at the same time. By June 2026 the old step where you picked one method (Google tag, GTM or API) went away. Accounts that had already accepted the customer data terms were migrated automatically.

So if an older tutorial tells you to expand Enhanced conversions for web and pick Google Tag Manager from a dropdown, you may not see that anymore. The tag work in GTM is the same.

Step 1: Turn on enhanced conversions in Google Ads

Click the Goals icon in the left menu. Go to Settings. Expand the Customer data use panel.

Check Turn on enhanced conversions. Google shows a compliance statement about the Google Ads Data Processing Terms and its customer data policies. Read it and click Agree. Then click Save.

The account-level switch sets the default for all conversion actions. You can still opt a single action out later from its own settings, under its enhanced conversions option.

Google's help says data sent before you accept the terms isn't processed. So do this first, before you publish any tag changes.

ads.google.com/aw/conversions/settingsGoogle AdsEexample.comOverviewCampaignsGOALSSummarySettingsToolsAdminGoals settingsCustomer data useTurn on enhanced conversionsImprove measurement by sending hashed first-party data, like email addresses, fromyour website tags or connections.iYou agreed to the customer data terms on Nov 5, 2026.SaveCancel12
Figure 1. Turn the feature on and accept the customer data terms before you change any tags. Illustration of the screen. Labels can differ slightly in your account.
  1. The account-level switch. It applies to all eligible conversion actions by default.
  2. Without accepting the terms, Google ignores the user data your tag sends.

Step 2: Decide where the user data comes from

Before you open GTM, look at your site. Where is the email address at the moment the conversion tag fires?

  • On the thank-you page: for example, "We sent a confirmation to ana@example.com." Automatic detection or a CSS selector can read it from the page.
  • Only in the form, on an earlier page: the data is gone once the page changes. You need either the Google Ads User-Provided Data Event tag on form submit, or a data layer push.
  • In the data layer: your developer or ecommerce platform pushes the email with the purchase or lead event. This is the best case.

Google offers three collection methods:

Method How it works When to use it
Automatic The tag scans the page for email, phone and address patterns. Quick start; data visible on the page.
Manual (CSS selectors) You point the tag at specific page elements. Stable page markup with clear IDs.
Code A JavaScript or data layer variable returns the data as an object. Most reliable; works across page changes.

Google says code-snippet data takes priority when you combine methods. Many accounts run automatic detection as a safety net and add code for the main conversions.

Step 3: Configure the conversion tag in GTM

Open GTM and go to Tags. Click your Google Ads Conversion Tracking tag for the action you want to enhance.

Check Include user-provided data from your website. In the User-provided data field, choose New Variable. GTM creates a User-Provided Data variable. Pick the type:

  • Automatic collection: nothing else to set. You can add exclusions later.
  • Manual configuration: for each field, such as Email, pick or create a DOM Element variable. Set Selection Method to CSS Selector and paste the selector. Leave Attribute name blank.
  • Code: pick a Custom JavaScript or data layer variable that returns the object shown below.

Label names in GTM can vary slightly between container versions. If you don't see the checkbox on the conversion tag, Google's current guide also lets you add a user_data event parameter on the Google tag with the same variable.

For the code method, the variable must return an object with these keys. Remove any field you don't collect. Don't send empty strings.

function() {
  return {
    email: {{DLV - user.email}},
    phone_number: {{DLV - user.phone}},   // E.164 format, e.g. +525512345678
    address: {
      first_name: {{DLV - user.first_name}},
      last_name: {{DLV - user.last_name}},
      postal_code: {{DLV - user.zip}},
      country: 'MX'                         // 2-letter ISO code
    }
  };
}

You can send plain text, and Google normalizes and hashes it in the browser. You can also send values you already hashed with SHA-256, using keys like sha256_email_address. All values must be strings.

tagmanager.google.com/#/container/tagsGoogle Tag ManagerGGTM-XXXXXXXAds – Lead formTag ConfigurationGoogle Ads Conversion TrackingConversion ID123456789Conversion LabelAbC-D_efG-h12_34-567Include user-provided data from your websiteUser-provided data{{UPD - lead form}}TriggeringCE - generate_leadCustom Event12
Figure 2. Turn on user-provided data on the same tag that records the conversion. Illustration of the screen. Labels can differ slightly in your account.
  1. This checkbox adds the hashed user data to the conversion hit.
  2. The User-Provided Data variable tells the tag where to find the email, phone and address.

Step 4: Handle forms where the data disappears

This step matters when the email lives on the form page and the conversion fires on the next page.

Option A is the cleanest. Ask your developer to push the data to the data layer when the form submits successfully:

window.dataLayer = window.dataLayer || [];
dataLayer.push({
  event: 'generate_lead',
  user: { email: 'ana@example.com', phone: '+525512345678' }
});

Then fire the conversion tag on the generate_lead custom event, and read the values with data layer variables. See form tracking with GTM for the trigger side.

Option B needs no developer. Create a tag: Tags > New > Google Ads > Google Ads User-Provided Data Event. Enter the same conversion ID. Choose Automatic or Manual for the data variable. Use a Form Submission trigger on All Forms. Google says form submission is required for this tag. It stores the hashed data in a first-party cookie and attaches it to the conversion later in the session.

tagmanager.google.com/#/container/variablesGoogle Tag ManagerGGTM-XXXXXXXUPD - lead formVariable ConfigurationUser-Provided DataAutomatic collectionManual configurationCodeCode{{JS - user data object}}{ email: 'ana@example.com', phone_number: '+525512345678', address: { first_name: 'Ana', country: 'MX' } }12
Figure 3. The Code option points to a variable that returns the user data object. Illustration of the screen. Labels can differ slightly in your account.
  1. Code is the most reliable option when you control the data layer.
  2. The object Google expects. Only include fields you actually collect.

Step 5: Test before you publish

Click Preview in GTM and connect to your site. Submit the form with a real-looking test email you control.

In Tag Assistant, click the conversion event. Open the conversion tag and check that the user-provided data shows values, not undefined. Then open Variables and check your User-Provided Data variable on that same event.

Next, check the actual request. Google's guide describes this method:

  1. On the conversion page, right-click and choose Inspect.
  2. Open the Network tab and search for google.
  3. Find the request to googleadservices.com/pagead/conversion/ (some browsers show google.com/pagead/1p-conversion/).
  4. Open Payload and find the em parameter.

A value starting with tv.1~em followed by a long string means hashed email was sent. Phone shows as tv.1~pn. If you see tv.1~em with nothing after it, the variable was empty when the tag fired.

When the hash is there, Submit and Publish the container.

example.com/thank-youChrome DevToolsEexample.comNetworkFilter: googleNameStatusTypeconversion/123456789/?random=…200scriptcollect?v=2&tid=G-XXXXXXXXXX204pingHeadersPayloadResponselabel: AbC-D_efG-h12_34-567em: tv.1~em.Q2xJb0t0bWZ2cHRxN2RnZm…value: 501
Figure 4. A long string after tv.1~em means the hashed email reached Google. Illustration of the screen. Labels can differ slightly in your account.
  1. A long hash after tv.1~em is a pass. An empty value or an error code after em. needs fixing.

Step 6: Read the Diagnostics report

Google says diagnostics become available about 48 hours after setup. Go to Goals > Summary, click the conversion action, and open Diagnostics.

You'll see a data quality status:

  • Excellent: active and fully set up.
  • Good: active, but sending more fields could match more conversions.
  • Needs attention: active with errors, such as missing data.
  • No recent data: no enhanced conversions in the last 7 days.

Below that you get the Enhanced conversions coverage rate. It's the share of conversion events that carried enough user data. It defaults to 7 days and can switch to 30. The impact table also shows a match rate band and, for the first 30 days, a conversion uplift estimate.

ads.google.com/aw/conversions/diagnosticsGoogle AdsEexample.comOverviewCampaignsGOALSSummarySettingsToolsAdminLead form – contact pageDiagnosticsData qualityNeeds attentionCoverage (7 days)42%!Missing user-provided data: some conversions sent empty user data fields.MetricValueCoverage42%Match rateHIGHConversion upliftNot yet available12
Figure 5. Start with the alerts. Each one points to a specific setup problem. Illustration of the screen. Labels can differ slightly in your account.
  1. Status and coverage give you the health at a glance. The numbers here are only an example.
  2. Each alert names a problem. The table below explains what to do.

Still not working? Common causes

These are the alerts and symptoms you'll see most, and how to fix them.

Symptom or alert Likely cause Fix
Enhanced conversions not in use Customer data terms not accepted Goals > Settings > Customer data use, accept, Save.
Missing user data fields The tag fires on some pages without the user data parameter Check every conversion page in Tag Assistant. Add the variable to all conversion tags for that action.
Missing user-provided data The parameter is sent but empty The data isn't on the page, or the selector breaks on some devices. Switch to a data layer variable.
Setup has incorrect data formatting Email without "@", phone without country code Send phone in E.164 format (+52...). Trim spaces from emails.
Setup is missing required address fields Sending a name without postal code or country Send all four: first name, last name, postal code, country. Or just send email.
User address data field is incorrectly formatted Full country name instead of ISO code Use 2-letter codes like MX or US.
Low number of matched conversions Only one identifier is sent Add phone and address alongside email.
tv.1~em.e0 in the request Value failed validation Fix the input format.
tv.1~em.e3 in the request Page isn't on HTTPS Serve the conversion page over HTTPS.
Status No recent data No conversions, or tag changes not published Publish the container. Check that the base conversion still fires.
Coverage is low Some conversion paths don't collect email Collect email on every form, or add phone fields.

Automatic detection picks up the wrong email

Automatic collection reads the page. If your footer has a newsletter field or your support address is printed in the page, the tag might grab that instead. Add exclusions for those selectors, or switch to the code method.

Consent blocks the data

When ad_user_data is denied, Google won't use the user data for that conversion. That's expected. If coverage looks much lower than your consent rate suggests, check that your banner updates consent before the conversion tag fires.

Two methods are fighting

If you set up automatic detection in the Google tag and manual or code in GTM, Google prioritizes the code snippet. That's normally fine. If your data looks inconsistent, simplify to one method per action.

How to confirm it's fixed

  1. Same day: In a test conversion, the request payload shows tv.1~em followed by a long hash.
  2. After about 48 hours: Diagnostics shows a status other than No recent data. Any alerts you fixed should clear in the following days.
  3. After a week: Coverage should be stable. Compare it with the share of conversions where you actually collect an email.
  4. After about 30 days: Google says impact results appear in reporting. Check the uplift estimate in the diagnostics impact table.

Don't change several things at once. Fix one alert, wait a few days, then check again.

FAQ

Is enhanced conversions data sent in plain text?

The tag hashes it with SHA-256 in the browser before sending, unless you send values you already hashed yourself. Google says it uses the hash only to match conversions.

Do I need enhanced conversions for leads too?

Not as a separate setup anymore. Since the 2026 change, web and leads share one switch. You can still import offline conversions through Data Manager or the API alongside your tags.

Will enhanced conversions change my numbers?

They can add conversions that cookies missed. Results vary a lot by account, so don't expect a fixed percentage.

Can I use GA4 instead of GTM?

Yes. GA4 has its own user-provided data collection setting. If you import GA4 key events into Google Ads, see GA4 key events and turn on user-provided data in GA4 too.

Why does Diagnostics say "Needs attention" when everything fires?

Usually because some conversions arrive without data, like a phone lead with no email. Read the specific alert. A few empty conversions are normal.

Stuck on this one? We fix these for clients every week. Book a free audit

Sources

Previous
Previous

Google Ads Not Showing or "Limited by Budget"? How to Diagnose and Fix It

Next
Next

How to Set Up Google Ads Conversion Tracking in Google Tag Manager