DEV Community

Cover image for GoHighLevel Form Conversion Tracking in GTM: GA4, Google Ads and Meta
MD Niamul
MD Niamul

Posted on

GoHighLevel Form Conversion Tracking in GTM: GA4, Google Ads and Meta

Your GoHighLevel CRM keeps filling up with new contacts, while GA4 and Google Ads barely move. That gap is a tracking problem, and it usually starts at the form.

GoHighLevel form conversion tracking with Google Tag Manager works like this: a listener tag catches the message the embedded form sends when someone submits, pushes a ghl_form_submit event into the data layer, and your GA4, Google Ads and Meta tags all fire from that one event.

Wrong lead numbers mean wrong bids and wasted budget, so this is worth an afternoon. I build it for agencies every week as a GoHighLevel tracking specialist. Below is the five-step version, with real screens from my own Tag Manager container and a real test lead.

Step 1: Check how your GoHighLevel form is added to the page

Most GoHighLevel forms are embedded as an iframe, which is a page inside your page that loads from another domain. Think of a sealed post box in a shop lobby. People drop letters in, but the shop's cameras cannot read what went inside. Google Tag Manager is that camera, so the normal form submission trigger never fires.

The form does send a short message to the page around it when someone submits. Your page can listen for that message, and Step 2 does exactly that. Before you change anything, scan your container with my free tool to scan a GTM container so you know what is already in it.

Do this:

  • Open the page with your form, right-click the form and choose Inspect.
  • Look for an iframe with a source on leadconnectorhq.com, msgsndr.com or your white-label domain.
  • Write that domain down. You will allow it in the listener.
  • Submit one test lead and confirm it lands in GoHighLevel.

Step 2: Add the GoHighLevel listener as a Custom HTML tag in GTM

The listener is a Custom HTML tag that waits for the form's message. In my build it trusts only GoHighLevel domains, ignores the load and height messages the form sends all day, and counts each submit once. When a real submit arrives, it pushes ghl_form_submit with the contact details and the visitor's traffic source.

In the screenshot you can see the tag name and the code. I add two things to every build: a DEBUG_MODE switch that logs each push to the console while you test, and a consent block that you match to your own cookie banner. If you want a starting point, my free tool for building a form listener writes one for you. Read the code once before you paste it. You should know what runs on your site.

Do this:

  • In GTM, go to Tags, then New, and choose Custom HTML.
  • Paste the listener code and give the tag a clear name.
  • Add your white-label domain to the allowed list if you use one.
  • Set the trigger to All Pages and save.

Step 3: Send the lead to GA4 as a generate_lead event

Now GTM needs a moment to act on. Create a Custom Event trigger with the event name ghl_form_submit, then a GA4 Event tag called generate_lead that fires on it. I use generate_lead because GA4 and Google Ads already know it, so it shows up in reports and imports cleanly.

Add one or two useful parameters, like the page path in my screenshot or the form ID, so you can compare forms later. One rule I never bend: do not send email or phone to GA4 as event parameters. Google does not allow personal data in GA4. Once the first lead shows up, mark generate_lead as a key event. The wider GA4 and Google Ads picture is in my GoHighLevel GA4 and Google Ads tracking guide.

Do this:

  • Create a Custom Event trigger with the event name ghl_form_submit.
  • Create a Google Analytics: GA4 Event tag and enter your Measurement ID.
  • Set the event name to generate_lead and add page_path or a form ID as a parameter.
  • Attach the ghl_form_submit trigger and save.
  • In GA4, mark generate_lead as a key event after the first lead arrives.

Step 4: Send the lead to Google Ads with enhanced conversions

GA4 tells you what happened. Google Ads also needs to know which click led to the lead. Add a Google Ads Conversion Tracking tag with your conversion ID and label, and fire it on the same ghl_form_submit trigger. In my tag, called GEC Lead Form Tracking, the event parameters carry the hashed email, phone, first name and last name, plus address fields.

Those hashed values are what turn it into enhanced conversions for leads. They help Google match the lead to the ad click when cookies fall short. Pass them only when your consent setup allows it. I wrote the full walkthrough in my GoHighLevel enhanced conversions guide. If you also advertise on Meta, add a Meta Pixel Lead tag on the same trigger with an event ID, which is what I did in this build.

Do this:

  • Create a Google Ads Conversion Tracking tag and enter the conversion ID and label.
  • Add the hashed email, phone and name values as event parameters from your variables.
  • Fire it on the ghl_form_submit trigger, and keep a Conversion Linker tag on all pages.
  • Add a Meta Pixel Lead tag on the same trigger if you run Meta ads.

Step 5: Test with a real lead in Tag Assistant, then publish

Click Preview, open your page and submit a real test lead. In Tag Assistant, find ghl_form_submit in the left list and open it. The API Call should show one push with the form details, the traffic source and an event ID. The contact values are blurred in my screenshot, but they were all there.

Then open Tags Fired. In my run, the Google Ads tag and the Meta Pixel Lead tag both showed Succeeded. Look at Tags Not Fired too, because your GA4 generate_lead tag should not be sitting there. If it is, check its trigger first. Test your cookie banner with my Consent Mode checker before you publish. If you would rather have it built and documented for your account, see my done-for-you GoHighLevel tracking setup.

Do this:

  • Click Preview in GTM and submit one real test lead on the live page.
  • Confirm you see one ghl_form_submit event, not two or three.
  • Check Tags Fired: GA4, Google Ads and Meta each fire once.
  • Confirm the lead in GA4 DebugView and in Google Ads diagnostics.
  • Publish the container with a clear version name.

Quick answers

Why does Google Tag Manager not track my GoHighLevel form?

The form usually loads in an iframe from a GoHighLevel domain. Your page cannot read inside it, so the normal form trigger stays silent. A listener that catches the form's message fixes it.

Which GA4 event should I use for a GoHighLevel lead?

Use generate_lead. It is a standard GA4 event name and Google Ads understands it. Mark it as a key event so GA4 counts it as a conversion.

Can I send the lead's email to GA4?

No. Google does not allow personal data in GA4 parameters. Use hashed email and phone only for Google Ads enhanced conversions and Meta, and only when consent allows it.

Why does one GoHighLevel submit show up two or three times?

The form can send its submit message more than once. A good listener counts only the message with the contact data, once per form.

Key takeaways

  • GoHighLevel forms usually sit in an iframe, so the normal GTM form trigger cannot see a submit.
  • One Custom HTML listener catches the form's message and pushes a single ghl_form_submit event.
  • That one event can fire GA4 generate_lead, a Google Ads conversion and a Meta Pixel Lead.
  • Hashed email and phone go to Google Ads and Meta only, with consent. Never to GA4.
  • Test one real lead in Tag Assistant and check that each tag fires once before you publish.

Summary

GoHighLevel form conversion tracking with Google Tag Manager starts with a Custom HTML listener, because forms embedded as iframes cannot be read by normal triggers. The listener catches the form's submit message and pushes ghl_form_submit into the data layer. A Custom Event trigger then fires a GA4 generate_lead event, a Google Ads conversion tag with enhanced conversions and a Meta Pixel Lead event. Test one real lead in Tag Assistant, check consent, then publish. It is for agencies and lead-gen teams that want CRM leads to match ad reports.

Want the full guide with the code, calendar tracking and server-side tracking? It is here: https://mdniamul.com/gohighlevel-form-conversion-tracking-services/

When did you last compare your GoHighLevel contacts with the conversions in your ads account?

MD Niamul

Conversion Tracking and Web Analytics Specialist, Digital Soldier Agency

Top comments (0)