Track GoHighLevel Form Leads with Google Ads Enhanced Conversions in 2026 (GTM Guide)

GoHighLevel form leads tracked with Google Ads Enhanced Conversions through a GTM listener and data layer.

100% Human Written By MD Niamul
GoHighLevel Automation | Ai Agent Automation | Google Ads | Full‑Stack Web Analytics Conversion Tracking & Server Side Tracking Specialist

Quick Answer

To track GoHighLevel form leads with Google Ads Enhanced Conversions, capture the lead’s email and phone number from the embedded GoHighLevel form with a Google Tag Manager listener, push them to the data layer, and map them to a User-Provided Data variable on your Google Ads conversion tag. Turn on Enhanced Conversions in Google Ads, then test in GTM Preview mode. Google hashes the details and uses them to match the lead to the ad click, even when cookies are missing.

Key Takeaways

  • The gap: a normal conversion tag only knows that a form was submitted. It depends on a cookie to connect that form to an ad click.
  • The fix: Enhanced Conversions adds the lead’s own details, hashed, so Google can match the conversion without the cookie.
  • What a lead form needs: email and phone number are enough. Name and address are optional extras.
  • The GoHighLevel problem: the form sits inside an iframe, so GTM cannot read the fields directly. A small listener script solves this.
  • The build: one listener tag, a few Data Layer Variables, one User-Provided Data variable, and one setting on your existing conversion tag.
  • Proof it works: the conversion request carries a hashed em value, and Diagnostics in Google Ads confirms it about 48 hours later.

Introduction: The Lead Is in GoHighLevel, but Google Ads Never Saw It

The first time I compared a GoHighLevel pipeline with a Google Ads account side by side, the two numbers did not agree. The CRM showed every lead. Google Ads showed fewer.

Nothing was broken. The form worked. The conversion tag fired.

The leads were real. Google just could not connect some of them to an ad click.

Here is why. A standard Google Ads conversion relies on a click ID stored in a browser cookie. If the visitor clicked the ad on a phone and filled in the form on a laptop, the cookie is not there. If Safari shortened the cookie’s life, it is not there. If the visitor declined or cleared cookies, it is not there. The conversion still happens, but Google cannot say which ad earned it.

Enhanced Conversions closes that gap. Along with the conversion, you send the details the lead typed into your form. Google hashes them and compares them with its signed-in users. Now the match no longer depends on one fragile cookie.

In this guide I will show you how to set up Google Ads Enhanced Conversions for GoHighLevel form leads using Google Tag Manager, step by step. This continues my earlier guide on GoHighLevel form Google Ads conversion tracking with GTM, where we built the base conversion tag. If you have not done that part yet, start there.

Standard Conversion vs. Enhanced Conversion: What Google Receives

Area Standard conversion Enhanced conversion
What is sent The conversion and the click ID from a cookie The conversion, the click ID, and hashed lead details
How Google matches the lead Cookie only Cookie, or hashed email and phone
Lead switches device Often not matched Can still be matched
Cookie blocked or expired Often not matched Can still be matched
What Smart Bidding learns from Part of your leads More of your leads
Comparison of a standard Google Ads conversion and an Enhanced Conversion for a GoHighLevel form lead.

What Is Google Ads Enhanced Conversions for Leads?

Enhanced Conversions is a Google Ads feature that sends first-party customer data with your conversion. First-party data means details the person gave you directly, such as the email address they typed into your form.

Before the data leaves the browser, it is hashed with SHA-256. Think of hashing as a paper shredder that always shreds the same page into the same pattern. Google cannot rebuild the email from the pattern. It can only check whether the pattern matches one it already has for a signed-in user.

The data layer is where the lead’s details wait for GTM. Think of it as an invisible filing cabinet on your page. A script puts a folder in, and GTM reads the folder.

Which Details Does Enhanced Conversions Use?

Google accepts these fields. Only the first four are hashed.

Detail Hashed? Needed for a lead form?
Email Yes Yes. This is the most useful field.
Phone number Yes Recommended, together with email
First name and last name Yes Optional
Street, city, region, postal code, country No Optional. Only useful as a full address.

An online store usually has all of these at checkout, so it can send everything. A lead form is different. Most GoHighLevel forms ask for a name, an email and a phone number. Email and phone are enough.

Important: Google only uses address data when first name, last name, postal code and country are all present. If your form does not collect a full address, leave the address fields out. And only send details the lead typed in. A city or postal code guessed from the visitor’s IP address is not user-provided data.

Prerequisites & Setup Checklist

  • Google Ads: admin access, auto-tagging turned on, and a lead conversion action already created.
  • Google Tag Manager: publish access to the Web container on the page where the form is embedded.
  • Existing setup: a Conversion Linker tag and a Google Ads conversion tag for the GoHighLevel form.
  • GoHighLevel: a form with at least an email field, embedded on your landing page or funnel page.
  • Consent banner: a consent management platform with Google Consent Mode V2 if you have visitors from the EU, EEA or UK.

Not sure what is already installed? Run the page through my free Google Ads audit tool or the free tracking audit tool first.

Video Tutorial Walkthrough

Prefer to watch? In this video I set up Enhanced Conversions for a GoHighLevel form in Google Tag Manager from start to finish.

Step-by-Step Implementation Guide

The setup has six phases. Follow them in order, because each one uses what the phase before it created.

Phase 1: Capture the GoHighLevel Form Data with a Listener

An embedded GoHighLevel form loads inside an iframe. Think of an iframe as a glass window in the wall of your page. You can see the form through it, but GTM stands outside and cannot reach in to read the fields.

The form does help us, though. After a successful submit it sends a message out to the page with the contact’s details. A listener is a small script that waits for that message, like a catcher’s mitt, and drops the details into the data layer.

Step 1: Create the listener tag

  1. In your Web GTM container, click Tags in the left menu, then the blue New button.
  2. Click Tag Configuration and choose Custom HTML.
  3. Paste the code below.
  4. Under Triggering, choose All Pages.
  5. Name the tag cHTML – GoHighLevel Form Listener and click Save.

If you already added a GoHighLevel listener in the previous guide, keep one listener only. Two listeners would push the lead twice.

GTM Custom HTML tag
<script>
(function () {
  var sent = {};

  window.addEventListener('message', function (event) {
    var data = event.data;

    // 1. GoHighLevel sends an array. The contact details are a JSON string in position 2.
    if (!Array.isArray(data)) { return; }
    if (data[0] !== 'set-sticky-contacts' || data[1] !== '_ud') { return; }

    var contact;
    try { contact = JSON.parse(data[2]); } catch (e) { return; }
    if (!contact || !contact.email) { return; }

    // 2. Fire only once per lead on this page
    if (sent[contact.email]) { return; }
    sent[contact.email] = true;

    // 3. Build the user_data object with the fields the form collected
    var userData = { email: contact.email };
    if (contact.phone) { userData.phone_number = contact.phone; }
    if (contact.first_name) { userData.first_name = contact.first_name; }
    if (contact.last_name) { userData.last_name = contact.last_name; }
    if (contact.city) { userData.city = contact.city; }
    if (contact.state) { userData.region = contact.state; }
    if (contact.postal_code) { userData.postal_code = contact.postal_code; }
    if (contact.country) { userData.country = contact.country; }

    // 4. Hand the lead to Google Tag Manager
    window.dataLayer = window.dataLayer || [];
    window.dataLayer.push({
      event: 'ghl_form_submit',
      user_data: userData
    });
  });
})();
</script>

How the code works

  • Part 1 ignores every message that is not the GoHighLevel contact message.
  • Part 2 makes sure the same lead is only pushed once on a page.
  • Part 3 builds a user_data object and only includes fields that have a value. Google asks you to leave out empty fields.
  • Part 4 pushes the event ghl_form_submit to the data layer. This is the event your tags will fire on.

Good to know: this listener relies on the message format the GoHighLevel form sends today. If GoHighLevel changes that format, the listener needs an update, so always confirm it in Preview mode (Phase 2). If you need a listener for a different form tool, my free form tracking listener generator builds one for you.

Four steps to capture GoHighLevel form data with a Google Tag Manager listener for Enhanced Conversions.

Phase 2: Check the Data Layer in Preview Mode

Before you build anything else, confirm the lead’s details really arrive. This takes two minutes and saves hours of guessing later.

  1. In GTM, click the Preview button in the top right corner.
  2. Enter the URL of the page with your GoHighLevel form and click Connect.
  3. Wait for the form to load, then fill it in with a test name, email and phone number, and submit it.
  4. Go back to the Tag Assistant tab. In the left timeline, click the event ghl_form_submit.
  5. Open the Data Layer tab and look for user_data.

You should see something like this:

Data layer key Example value
event ghl_form_submit
user_data.email [email protected]
user_data.phone_number +15551234567
user_data.first_name Jane
user_data.last_name Doe

Check the phone format. Google expects the international E.164 format: a plus sign, the country code, then the number, with no spaces or dashes. For example, +15551234567. If your form saves phone numbers in a local format, switch the GoHighLevel phone field to include the country code.

If the ghl_form_submit event does not appear, jump to the troubleshooting section before you continue.

Four steps to check GoHighLevel form data in the data layer using Google Tag Manager Preview mode.

Phase 3: Create the Data Layer Variables

GTM cannot use a data layer value until you create a variable for it. A variable is a label that tells GTM which drawer of the filing cabinet to open.

Step 1: Create one variable per field

  1. In GTM, click Variables in the left menu.
  2. Scroll to User-Defined Variables and click New.
  3. Click Variable Configuration and choose Data Layer Variable.
  4. In Data Layer Variable Name, type the key exactly as it appears in Preview mode.
  5. Name the variable and click Save.
  6. Repeat for each field your form collects.
Variable name in GTM Data Layer Variable Name
dlv – user_data.email user_data.email
dlv – user_data.phone_number user_data.phone_number
dlv – user_data.first_name user_data.first_name
dlv – user_data.last_name user_data.last_name

Critical step: the names are case sensitive. user_data.Email and user_data.email are two different keys, and the wrong one returns nothing.

Should you hash the values yourself? You do not have to. When you send plain values, the Google tag normalizes and hashes them for you before they leave the browser. If your data layer already holds SHA-256 values, you can send those instead, and my free hashing code generator creates the GTM variables for that. Pick one way and use it for every field.

Four steps to create Data Layer Variables in Google Tag Manager for GoHighLevel Enhanced Conversions.

Phase 4: Turn On Enhanced Conversions in Google Ads

Google Ads ignores user-provided data until you switch the feature on and accept the customer data terms. If you skip this phase, the tag still sends the data and Google simply drops it.

Step 1: Turn on the account setting

  1. In Google Ads, click the Goals icon in the left menu.
  2. Open Conversions and click Settings.
  3. Expand Enhanced conversions. Some accounts still show a separate Enhanced conversions for leads section. Google has been merging the two into one setting during 2026.
  4. Tick the box to turn it on.
  5. Choose Google Tag Manager as the method.
  6. Open the customer data terms, read them, and accept.
  7. Click Save.

Step 2: Check the conversion action

  1. Go to Goals, then Summary.
  2. Click the lead conversion action you created for the GoHighLevel form.
  3. Open its settings. If you see an Enhanced conversions section there, turn it on and choose Google Tag Manager.
  4. Save the conversion action.

Google’s own steps for this screen are in the enhanced conversions setup guide for Google Tag Manager.

Four steps to turn on Enhanced Conversions in Google Ads settings and choose Google Tag Manager as the method.

Phase 5: Add the User-Provided Data to Your Google Ads Tag

Now we connect the two sides. The variables from Phase 3 go into one User-Provided Data variable, and that variable goes onto the conversion tag you already have.

Step 1: Open your conversion tag

  1. In GTM, click Tags.
  2. Open the Google Ads conversion tag that fires on the GoHighLevel form, for example Google Ads – GHL Lead Form.
  3. Click inside Tag Configuration to edit it.
  4. Tick Include user-provided data from your website.

Step 2: Create the User-Provided Data variable

  1. In the dropdown that appears, choose New Variable.
  2. For the type, choose User-Provided Data.
  3. Select Manual configuration.
  4. Map each field to the matching variable from Phase 3.
  5. Name the variable UPD – GHL Lead Data and click Save.
Field in the variable GTM variable to select
Email {{dlv – user_data.email}}
Phone {{dlv – user_data.phone_number}}
First Name {{dlv – user_data.first_name}}
Last Name {{dlv – user_data.last_name}}
Street, City, Region, Postal Code, Country Leave empty unless your form collects a full address

Step 3: Check the trigger and save

  1. Under Triggering, make sure the tag fires on a Custom Event trigger where the event name is ghl_form_submit.
  2. Click Save.

Why the trigger matters: the user data only exists in the data layer at the moment of the ghl_form_submit event. If the tag fires on a page view or a thank-you page instead, the variables are empty and nothing is sent.

Good to know: Google also offers a separate tag type called Google Ads User-Provided Data Event. Use that one when your conversion is recorded later, for example from your CRM. When the conversion tag fires at the moment of the form submit, as it does here, the checkbox on the conversion tag is all you need.

Four steps to add a User-Provided Data variable to the Google Ads conversion tag in Google Tag Manager.

Phase 6: Respect Consent with Google Consent Mode V2

Enhanced Conversions sends personal details, so consent matters. Consent Mode works like a traffic light for your tags. Green means they may send the data. Red means they must hold back.

  1. Make sure your consent banner’s tag fires on Consent Initialization – All Pages, before every other tag.
  2. For regions that require consent, the default state of ad_storage, ad_user_data and ad_personalization should be denied until the visitor chooses.
  3. Google tags read these signals on their own. When ad_user_data is denied, the tag does not send user-provided data for advertising.

You can test your banner with my free Consent Mode v2 checker.

The Full Data Flow at a Glance

# What happens Where
1 A visitor clicks your ad and lands on the page with the form Google Ads
2 The visitor submits the GoHighLevel form GoHighLevel iframe
3 The listener catches the form’s message and pushes ghl_form_submit with user_data Web GTM
4 The Data Layer Variables read the email, phone and name Web GTM
5 The conversion tag fires and the Google tag hashes the details Web GTM
6 Google Ads matches the hashed details to a signed-in user and credits the ad click Google Ads
Data flow from a GoHighLevel form submit through the GTM listener and data layer to Google Ads Enhanced Conversions.

Testing & Validation Workflow

  1. Open Preview mode. Click Preview in GTM and connect to the page with the form.
  2. Submit a test lead. Use an email address you control.
  3. Check the event. In the timeline, click ghl_form_submit. On the Tags tab, your Google Ads conversion tag should be listed under Tags Fired.
  4. Check the variables. On the Variables tab, UPD – GHL Lead Data should show the email and phone you typed.
  5. Check the request. Open Chrome Developer Tools, go to the Network tab, and filter for google. Find the conversion request and look for an em value that starts with tv.1~em. followed by a long string. That long string is the hashed email. An em with nothing after it means the data was empty.
  6. Publish. Click Submit in GTM to make the changes live.
  7. Check Google Ads. About 48 hours later, open Goals, then Summary, click the conversion action and open Diagnostics. Give it around 30 days before you judge the effect on reported conversions.
Four checks to test Google Ads Enhanced Conversions for a GoHighLevel form in GTM Preview and Google Ads.

Troubleshooting Common Mistakes

Mistake 1: The ghl_form_submit event never appears

The Problem: you submit the form and nothing new shows in the Preview timeline.

The Cause: the listener tag is not firing on that page, or the form opens on its own GoHighLevel page instead of inside your page, so there is no message for your page to catch.

The Solution: confirm cHTML – GoHighLevel Form Listener fired on page load. If the form lives on a GoHighLevel funnel page, install the same GTM container on that funnel page so the listener runs next to the form.

Mistake 2: The tag fires but the user data is empty

The Problem: the conversion tag fires, but UPD – GHL Lead Data shows undefined.

The Cause: a Data Layer Variable name does not match the key, or the tag fires on a different event than ghl_form_submit.

The Solution: copy each key from the Data Layer tab in Preview mode and paste it into the variable. Then make the Custom Event trigger use the exact event name.

Mistake 3: Diagnostics says the phone number is not formatted correctly

The Problem: Google Ads accepts the email but flags the phone number.

The Cause: the number arrives without a country code, or with spaces, brackets or dashes.

The Solution: set the GoHighLevel phone field to store the country code, so the value looks like +15551234567.

Mistake 4: Leads are counted twice

The Problem: Google Ads shows two conversions for one form fill.

The Cause: two listeners are installed, or one conversion tag fires on the form event and a second one fires on the thank-you page.

The Solution: keep one listener and one conversion tag per conversion action. Pause the extra one.

Mistake 5: Enhanced Conversions shows no data in Google Ads

The Problem: everything looks right in Preview mode, but Google Ads reports nothing.

The Cause: the account setting from Phase 4 is still off, the customer data terms were not accepted, or the container was never published.

The Solution: go back to Goals, Conversions, Settings and confirm the feature is on. Then publish the GTM container and wait about 48 hours.

What to Set Up Next

Enhanced Conversions improves how many leads Google can match. It does not tell Google which leads were any good. These guides cover the next steps:

If you would like this built and tested for you, see my GoHighLevel form conversion tracking service or my work as a GoHighLevel conversion tracking specialist.

Conclusion

You now have Enhanced Conversions running on your GoHighLevel form. The listener catches the lead, the data layer holds the details, and your Google Ads tag sends them hashed with every conversion.

Three things to do from here. First, publish the container and submit one real test lead. Second, check Diagnostics in Google Ads after 48 hours. Third, leave the setup alone for about 30 days so Smart Bidding can learn from the fuller data.

After that, your bids are based on more of the leads you actually received.

Summary by MD Niamul

Google Ads Enhanced Conversions for GoHighLevel forms sends the lead’s hashed email and phone number with the conversion, so Google can match the lead to an ad click even when the click cookie is missing. Because the GoHighLevel form sits in an iframe, a Google Tag Manager listener catches the form’s message and pushes the event ghl_form_submit with a user_data object to the data layer. Data Layer Variables read those values, a User-Provided Data variable maps them, and the Google Ads conversion tag sends them with “Include user-provided data from your website” turned on. Enhanced Conversions must be enabled in Google Ads under Goals, Conversions, Settings. Test in GTM Preview mode and confirm in Diagnostics after about 48 hours.

Frequently Asked Questions (FAQ)

1. What are Google Ads Enhanced Conversions?

Enhanced Conversions is a Google Ads feature that sends first-party customer details, such as email and phone number, together with your conversion. The details are hashed with SHA-256 before they leave the browser, so Google never receives the readable value. Google compares the hashed details with its signed-in users to connect the conversion to an ad click. This helps when the click cookie is missing, for example after a device switch or when a browser limits cookies.

2. Why do GoHighLevel leads go missing in Google Ads?

Usually the lead is real and the tag fired, but Google could not link the conversion to an ad click. A standard conversion depends on a click ID stored in a cookie. If the visitor changed device, used a browser that shortens cookie life, or declined cookies, that link is lost. Tracking problems can also play a part, such as a tag that fires on the wrong event. Enhanced Conversions gives Google a second way to make the match.

3. Can GTM read GoHighLevel form fields directly?

No. An embedded GoHighLevel form loads inside an iframe from a different domain, and the browser blocks your page from reading fields inside it. Standard GTM form triggers and DOM variables therefore return nothing. The reliable method is a listener script in a Custom HTML tag. It waits for the message the GoHighLevel form sends after a successful submit, reads the contact details from that message, and pushes them to the data layer for GTM.

4. Which data does a lead form need to send?

For a lead form, email and phone number are enough, and email is the most useful field. First name and last name are optional extras that can help matching. Address fields only help when first name, last name, postal code and country are all present, so most lead forms should leave them out. Send only details the person typed into your form. Leave a field out completely when it has no value instead of sending it blank.

5. Do I need to hash the data myself?

No. When you map plain values in the User-Provided Data variable, the Google tag normalizes and hashes them with SHA-256 in the browser before sending. This is the simplest and safest route. If your data layer already contains SHA-256 values, you can send those instead using the pre-hashed key names. Do not mix the two methods for the same field, and never hash a value twice, because a double-hashed email will not match anything.

6. What phone format does Google Ads need?

Google expects phone numbers in E.164 format. That means a plus sign, the country code and the full number, with no spaces, brackets or dashes. For example, a United States number looks like +15551234567. If your GoHighLevel form stores numbers in a local format without the country code, Google may not match them and Diagnostics can flag a formatting issue. Set the phone field in GoHighLevel to include the country code so the value arrives ready to use.

7. Where do I turn on Enhanced Conversions?

In Google Ads, click the Goals icon, open Conversions and click Settings. Expand the Enhanced conversions section, tick the box to turn it on, choose Google Tag Manager as the method, and accept the customer data terms. Some accounts still show a separate section for leads, because Google has been merging the web and leads settings during 2026. Then check your lead conversion action and enable the feature there if the option is shown.

8. How do I test Enhanced Conversions in GTM?

Open GTM Preview mode, connect to the page with the form and submit a test lead. Click the ghl_form_submit event and confirm your Google Ads conversion tag fired. On the Variables tab, the User-Provided Data variable should show the email and phone you entered. For a deeper check, open the browser’s Network tab, find the Google conversion request and look for an em value that starts with tv.1~em. followed by a long string.

9. How long until Google Ads shows the result?

Google Ads needs time to process the data. The Diagnostics tab for the conversion action is usually ready about 48 hours after you publish the setup and real conversions start coming in. It tells you whether Enhanced Conversions is recording and whether any field has a formatting problem. To judge the effect on reported conversions, give it around 30 days, because Google needs enough conversions over time to show a reliable comparison.

10. Is Enhanced Conversions allowed under GDPR?

Enhanced Conversions can be used in a compliant way, but it does send personal data for advertising, so you need a lawful basis and valid consent where the law requires it. Use a consent banner with Google Consent Mode V2 and set ad_user_data to denied by default in regions that require consent. Google tags then hold back user-provided data until the visitor agrees. This is general information, so confirm your own obligations with a privacy professional.

🚀 Need Help Advanced GHL Automation & Tracking Setup?

💬 Want this implemented without mistakes?

I’ve helped 850+ advertiser agencies & D2C brands unlock $11.6M+ revenue by implementing 1,500+ Ai Driven GoHighLevel full Business Automation+ client-side & server-side tracking systems.

⮏ My core services include:

⨭ GoHighLevel Automation — build CRM pipelines, WhatsApp automation, AI voice workflows & automated follow-ups end-to-end.
⨭ AI Agent Automation — deploy AI chatbots & agents for 24/7 lead qualification and support.
⨭ Paid Ads Management — Google Ads, Meta Ads.
⨭ Full Stack SEO/GEO/AEO Manager.
⨭ CRO-Focused Web Development — Landing Pages on WordPress, Shopify, Wix, Squarespace.
⨭ Google Tag Manager (GTM) — manage data layers & (Marketing platform Tag, Trigger & Variables).
⨭ Custom Code by GTM — HTML, CSS & JavaScript for the help of marketing platform advanced tracking.
⨭ Server-Side Tracking — Bypassing ITP/Ad-blockers for 99% accuracy (Stape Partner)
⨭ Google Analytics 4 (GA4) — visualize customer journeys.
⨭ Multi-Channel CAPI — Facebook, TikTok, Pinterest & Snapchat Conversion API & Klaviyo email marketing tools.
⨭ Third Party Checkout Conversion Tracking — Shopify, Stripe, GoQuick, ShipRocket, PayPal or more.
⨭ Google Consent Mode (GCM) — maintain GDPR compliance.
⨭ Marketing Automation — streamline workflows (Zapier/n8n/Make).
⨭ CRM Conversion Tracking — link offline sales to ads.
⨭ Tag Management — GTM & Third-Party Checkout Tracking.
⨭ Offline & CRM Tracking — HubSpot, Salesforce, Zoho, Pipedrive, Odoo, Webhook & Sheet.
⨭ Advanced Analytics — GA4, Google Looker Studio & Big Query (SQL) for deep data visualization.

If you want your GoHighLevel Business Automation & server side tracking done right the first time, message me.

Leave a Reply

Your email address will not be published. Required fields are marked *

Conversion tracking specialist dashboard showing Google Ads and GA4 data analysis with GTM integration.

MD NIAMUL

GoHighLevel Automation | Ai Agent Automation | Server Side Tracking Specialist

Niamul

If You Need GTM Listener Code Submit Your Email