Offline Conversion Tracking with GoHighLevel
GoHighLevel runs a lot of agency funnels and loses a lot of attribution. Here is how to capture click IDs and report real outcomes.

This post shows you how to capture click IDs in GoHighLevel and send real outcomes back to Google Ads and Meta, so your campaigns optimise toward booked and closed rather than toward opt ins.
GoHighLevel runs a huge number of agency funnels, and a huge number of them report opt in volume to clients while the actual sales stay invisible.
When this fits
You run funnels and pipelines in GoHighLevel for yourself or for clients.
The money event is a booked call, a show, or a closed deal, not the opt in.
You are reporting lead counts and getting asked awkward questions about lead quality.
What you will build
Custom fields on the contact and opportunity.
Funnel form wiring that captures click IDs.
A workflow that fires on pipeline stage change.
A feed into Google Ads and Meta.
Let’s implement it
Step 1: create custom fields
In Settings, then Custom Fields, add text fields for Google Click ID, gbraid, wbraid, fbclid, and your first and last touch UTM values.
Create them at contact level, and mirror the click ID onto the opportunity so repeat buyers do not reuse an old click.
Step 2: capture in the funnel
GoHighLevel funnels let you add custom fields to forms and hide them. Add your fields, then add a tracking code block to the funnel that reads the URL, writes cookies, and fills the hidden inputs on page load.
Two GoHighLevel specific gotchas:
Two step funnels can lose URL parameters between steps. Capture on the first page into a cookie rather than reading the URL on the form page.
If you use the same funnel across several domains, make sure your cookie domain matches each one.
Step 3: workflow on stage change
Build a workflow triggered by opportunity stage change. On Qualified or Won, send a webhook containing the click ID, the stage, the value and the timestamp.
Point that webhook at your own endpoint, at Make, or at a sheet: automating with Make.
Step 4: send it onward
For Google Ads, upload against the click ID. For Meta, send an offline event through the Conversions API with fbclid, hashed email and hashed phone.
Because GoHighLevel holds verified phone numbers for most contacts, your Meta match rates here are usually better than average. Use that.
The agency angle
If you manage several client accounts, build this once as a template funnel and workflow, then clone it per client. The capture script and field names stay identical, only the ad account IDs change.
That turns a per client project into a ten minute setup, and it is the difference between reporting opt ins and reporting revenue.
Before you finish
Real ad click, real funnel submission, click ID on the contact.
Move an opportunity to Won and confirm the webhook fired with the right payload.
Check match rates in both platforms after a test batch.
Confirm multi step funnels still carry the values.
Confirm the cookie domain matches every domain the funnel runs on.
FAQ
Does GoHighLevel have a native Google Ads conversion upload?
Integrations vary and change. Whatever the current state, the webhook plus sheet or webhook plus automation route always works and does not depend on a feature staying supported.
What about calls booked through the built in calendar?
Treat the booking as a conversion stage and fire the workflow on it. Booked calls are usually the strongest mid funnel signal you have.
Can I do this without any code at all?
Almost. You need a small tracking snippet in the funnel to capture the click IDs. Everything after that is workflows and automation tools.
My client has no CRM, just a spreadsheet.
No CRM at all, and you want the simplest possible version? I wrote a full walkthrough of that for Stape using nothing but a spreadsheet: Google Ads offline conversion tracking without a CRM. Click to read it here.
Need this built properly?
Report revenue instead of opt ins and the lead quality conversation ends. I set up and repair tracking for ecommerce stores and lead generation businesses, so the numbers in your ad accounts match the money in your bank account.
Have a look at what I do, or book a call and we can go through your setup together.



















