Offline Conversions
How do you track GoHighLevel conversions in Google Ads and Meta?
By Rifat Mia, conversion tracking specialist. Updated October 27, 2026
Short answer
Capture the ad click identifiers (gclid, fbclid, and the Meta _fbp and _fbc cookies) on the landing page, store them on the GoHighLevel contact, then use a GHL workflow to send a webhook whenever an appointment is booked or an opportunity moves to a stage that matters. That webhook becomes a Google Ads offline conversion and a Meta Conversions API event, so both platforms learn which ads produce booked and paying customers.
Why do GoHighLevel funnels lose attribution?
GoHighLevel is excellent at what happens after a lead arrives: speed to lead, SMS and email follow up, AI booking agents and pipelines. The weak point is what the ad platforms see. By default Google Ads and Meta often only see a page view or a form submit, and nothing about whether that lead booked, showed up or paid.
The problem gets worse when the landing page lives outside GHL. Many agencies build pages in SwipePages, Unbounce, Webflow or WordPress and push leads into GHL with a webhook. If the click IDs are not passed along with the lead, the connection to the original ad is gone the moment the contact is created.
What needs to be captured on the landing page?
Before any offline conversion can work, the contact record in GHL needs the identifiers each ad platform uses to match a conversion back to a click:
- gclid, gbraid and wbraid for Google Ads.
- The _fbp cookie and the _fbc value (built from fbclid) for Meta.
- UTM source, medium, campaign and term for reporting inside GHL.
- Email and phone, which are hashed and sent as matching keys. UK and other international numbers should be normalised to E.164 format first.
On GHL native funnels and forms some of this is captured automatically. On external pages I add hidden fields or include the values in the webhook payload, and map them to custom contact fields in GHL so every workflow can use them.
How does a GHL workflow send the conversion?
- 1
Choose the trigger
Appointment Booked for booking funnels, Pipeline Stage Changed or Opportunity Status Changed for sales pipelines, or a tag being added when your team marks a lead as qualified.
- 2
Add a webhook action
The workflow posts the contact's click IDs, hashed matching data, conversion name, value and timestamp to a server-side GTM endpoint on your own subdomain.
- 3
Route it in server-side GTM
Tags in the server container send the event to Google Ads as an offline conversion and to the Meta Conversions API, with an event ID so it never double counts against the browser pixel.
- 4
Verify in each platform
Check Meta Events Manager for the event and its match quality, and Google Ads diagnostics for accepted and rejected uploads, before you let bidding use the new conversion.
Which GoHighLevel events should you send back?
Send fewer, more meaningful events. A typical clinic or service business setup looks like this:
- Lead: the form or call that created the contact. Usually already tracked in the browser.
- Schedule or Booked appointment: sent from the Appointment Booked trigger. This is often the best primary conversion for Meta because it has volume and intent.
- Qualified or Showed: sent when the team confirms the lead attended or met the criteria.
- Purchase or Closed won: sent with the real deal value when the opportunity is won. This is what value based bidding should eventually optimise towards.
Is GHL's built-in Meta integration enough?
It can be, for simple funnels that run entirely on GHL pages. It stops being enough when you have external landing pages, more than one pixel (for example an agency pixel and a client pixel on different paths), or you need precise control over which pipeline stage counts. Routing through server-side GTM gives one place to decide what each platform receives, and makes problems much easier to debug.
What else goes wrong in GoHighLevel tracking?
- Notification and confirmation emails sent from GHL's shared domain land in spam, so the client thinks leads are missing. A dedicated sending domain with SPF, DKIM and DMARC fixes this.
- Duplicate conversions because both the browser pixel and a workflow send the same event without a shared event ID.
- Phone numbers stored without a country code, which lowers match rates on both platforms.
- Workflows that fire on every stage change rather than once per opportunity.
FAQ
Frequently asked questions
Can GoHighLevel send offline conversions to Google Ads?
Yes. A GHL workflow can post a webhook with the stored gclid and contact details whenever an appointment is booked or a deal is won, and that data is uploaded to Google Ads as an offline conversion, usually through server-side GTM.
How do I pass fbp and fbc into GoHighLevel?
Read the _fbp and _fbc cookies on the landing page, add them to hidden form fields or the webhook payload, and map them to custom contact fields in GHL. Workflows can then include them in Meta Conversions API events.
Which GHL trigger should I use for conversions?
Use Appointment Booked for booking funnels, and Pipeline Stage Changed or Opportunity Status Changed for sales pipelines. Pick the stage that reflects real intent or revenue and only fire once per opportunity.
Do I still need the browser pixel if I use the Conversions API?
Yes. Run both and share an event ID so Meta deduplicates them. The pixel covers on-site behaviour and the server event fills gaps caused by ad blockers, browsers and later offline outcomes.
Does this work with landing pages outside GoHighLevel?
Yes. Pages on SwipePages, Unbounce, WordPress or Webflow can send leads to GHL by webhook. The key is including the click IDs and cookies in that payload so attribution survives the handoff.
Running ads into GoHighLevel?
I will check what your pixels and Google Ads actually receive today and map the events your pipeline should send back.
Get in touch