The Hidden Problem: Why Your GoHighLevel Forms Aren’t Tracking in Google Ads (And How to Fix It)
(Part 1 of 3 in the GoHighLevel Tracking Series)
GoHighLevel was delivering leads—but Google Ads reported zero conversions. The problem lies in how these forms are embedded—as iframes, AJAX-driven submissions, and popup-based with no redirect—making them invisible to tracking tools. Let’s fix that!
Late Tuesday night, I conceded that the task wasn’t as straightforward as expected—tracking a single form submission from GoHighLevel into Google Ads had proven more difficult than anticipated. The forms were working. Leads were coming in. But Google Ads showed zero conversions. I knew we were missing crucial data that would help optimize our campaigns.
If you’re using GoHighLevel forms embedded on your WordPress site, there’s a 90% chance you’re losing conversion data right now. Not because your forms aren’t working, but because GHL forms operate in a parallel universe that Google Tag Manager can’t see. They’re iframes. They submit via AJAX. They’re popup forms without thank you pages. They’re tracking nightmares.
Over the next three weeks, I’m going to share exactly how I solved this problem, implemented a solution that actually works, and built a system that captures the data you need to make informed marketing decisions.
But first, let me show you why what you’ve tried so far hasn’t worked.
The Expensive Problem Nobody Talks About
When you’re running Google Ads, every conversion matters. Without accurate conversion tracking, you’re essentially flying blind. You can’t optimize your bids, you can’t identify which keywords are actually driving results, and you can’t calculate your real return on ad spend.
Here’s what makes GoHighLevel forms particularly challenging:
1. The iFrame Isolation
GoHighLevel forms are embedded as iframes. For those unfamiliar with the technical details, an iframe is essentially a website within a website. Your form lives on GoHighLevel’s servers (specifically, on api.leadconnectorhq.com
), not on your WordPress site.
This creates a fundamental problem: Google Tag Manager, which is installed on your WordPress site, can’t directly “see” what happens inside the iframe. It’s like trying to track what happens in a neighbor’s house when you can only stand in your own yard.
2. The AJAX Submission Challenge
Modern forms don’t reload the page when submitted. GoHighLevel forms use AJAX (Asynchronous JavaScript and XML) to submit data in the background. This is great for user experience – no annoying page refreshes. But it’s terrible for traditional conversion tracking, which typically relies on a “thank you page” URL to trigger conversions.
3. The Popup Predicament
Many GoHighLevel users, myself included, use popup forms that appear when someone clicks a button. After submission, you see a brief “Thank You” message that disappears after a few seconds. There’s no URL change, no page load, no traditional “conversion signal” for Google to detect.
What Doesn’t Work (And What I Wasted My Time On)
Before I share the solution, let me save you some time by telling you what I did and why it didn’t work:
Attempt #1: Standard GTM Form Submission Trigger
What I tried: Setting up a basic Form Submission trigger in Google Tag Manager.
Why it failed: GTM can’t detect form submissions that happen inside iframes on different domains.
Attempt #2: Element Visibility Trigger
What I tried: Creating a trigger that fires when the “Thank You” message appears.
Why it failed: The success message is inside the iframe, invisible to GTM.
Attempt #3: Click Trigger on Submit Button
What I tried: Tracking clicks on the submit button.
Why it failed: Clicks don’t equal conversions. You’d track failed submissions, validation errors, and abandoned forms as “conversions.”
Attempt #4: Generic “Track All Forms” Scripts
What I tried: Various JavaScript snippets from forums and AI tools.
Why it failed: They weren’t designed for cross-domain iframes or AJAX submissions.
The Breakthrough: Understanding How GHL Forms Really Work
The turning point came when I opened the browser’s Developer Tools and started examining the network traffic. I noticed something interesting: when a form was submitted, there was a POST request to:
https://api.leadconnectorhq.com/widget/form/ABC123XYZ789
LeadConnectorHQ – that was the key. GoHighLevel forms communicate with their parent page using something called the postMessage
API. This is a secure way for iframes to send messages to the page that contains them.
The Solution That Actually Works
Here’s the tracking script that finally solved the problem for me. This code listens for messages from the GoHighLevel iframe and pushes conversion data to Google Tag Manager’s dataLayer:
GoHighLevel Form Submission Tracking Script
How to Implement This Solution
Step 1: Add the Script to Your WordPress Site
If you’re using a child theme (recommended), add this to your functions.php
file.
Alternative: If you’re using Divi, you can add the script via Divi → Theme Options → Integration in the “Add code to the < body >” section.
Step 2: Configure Google Tag Manager
Now we need to set up GTM to catch the events our script is sending:
Create a Custom Event Trigger:
- In GTM, go to Triggers → New
- Name it: “GHL Form Submission”
- Trigger Type: Custom Event
- Event name:
ghl_form_submit
(must match exactly) - Save the trigger
Create a Conversion Linker Tag (Important!):
- Go to Tags → New
- Name: “Google Ads – Conversion Linker”
- Tag Type: Conversion Linker
- Triggering: All Pages
- Save
This tag is crucial for tracking conversions in Safari and Firefox, which restrict third-party cookies.
Create the Google Ads Conversion Tag:
- Go to Tags → New
- Name: “Google Ads – GHL Form Conversion”
- Tag Type: Google Ads Conversion Tracking
- Enter your Conversion ID and Label (from Google Ads)
- Triggering: Select “GHL Form Submission”
- Save
Step 3: Test Your Implementation
Testing is crucial. Here’s how to verify everything is working:
- Open GTM Preview Mode: Click Preview in GTM and enter your website URL
- Open Browser Console: Press F12 and go to the Console tab
- Submit a Test Form: Fill out and submit your GHL form
- Check for Success Messages:
- In the console, you should see: “GHL Form Submitted – Event pushed to dataLayer”
- In GTM Preview, you should see the
ghl_form_submit
event fire - Your Google Ads conversion tag should show as “Fired”
Step 4: Publish and Monitor
Once testing is successful:
- Publish your GTM changes
- Submit a few test conversions using different email addresses
- Wait 24-48 hours for Google Ads to start showing conversion data
- Check your Conversions section in Google Ads for the status update
Common Issues and Solutions
“The event fires but my tag doesn’t”
Solution: Check for typos in the event name. It must be exactly ghl_form_submit
– this is case-sensitive.
“I don’t see any console messages”
Solution: Make sure the script is loading. Check your page source for the script, and ensure there are no JavaScript errors.
“It works sometimes but not always”
Solution: Some forms might submit differently. The script includes multiple detection methods to catch various submission types.
What You’ve Accomplished
If you’ve followed this guide, you now have:
- ✅ Working conversion tracking for GoHighLevel forms
- ✅ Data flowing from iframe forms to Google Ads
- ✅ The ability to optimize your campaigns based on actual conversions
- ✅ A foundation for more advanced tracking
But here’s the thing: we’re only tracking that a form was submitted. We don’t know who submitted it, and in a world where cookies are increasingly restricted, that’s leaving money on the table.
What’s Next: The Power of Enhanced Conversions
In Part 2 of this series, we’ll look at how to capture the actual user data from form submissions – email, phone, name – and send it to Google Ads using Enhanced Conversions. This isn’t just about tracking more conversions; it’s about tracking conversions that would otherwise be lost to iOS restrictions, ad blockers, and cookie deletion.
The script I’ll share in Part 2 builds on what we’ve created here, but adds a crucial layer that can increase your tracked conversions. More importantly, it future-proofs your tracking for the cookie-less future that’s rapidly approaching.
For now, implement what you’ve learned here. Get your basic tracking working. Verify those conversions are flowing into Google Ads. Because once you have this foundation solid, the enhanced tracking we’ll add next week will be a simple upgrade that multiplies your results.
Next: Part 2 – Enhanced Conversions: How to Capture and Send User Data from GoHighLevel Forms
Have questions about this implementation? We’d love to hear about your results.
Resources:
Quick Implementation Checklist:
- Add tracking script to WordPress
- Create Custom Event trigger in GTM
- Set up Conversion Linker tag
- Configure Google Ads Conversion tag
- Test in Preview mode
- Verify console messages
- Publish GTM changes
- Monitor Google Ads for conversions
This is Part 1 of a 3-part series on mastering GoHighLevel form tracking. Part 2 covers Enhanced Conversions, and Part 3 explores pipeline automation.