Skip to content
MetricMaven

Platform Playbooks

GoHighLevel offline conversions: sending won deals to Google Ads and Meta

Google Ads and Meta only see the form fill unless you send outcomes back. Here is how to capture the match keys at lead time, trigger on won deals in GoHighLevel, and send them without double counting.

Jamie IsabelJamie IsabelPublished October 12, 20268 min read
On this page

GoHighLevel knows which leads became booked appointments and which opportunities were won. Google Ads and Meta know that someone filled in a form. Until the outcome goes back to the ad platforms, their bidding optimizes for cheap leads, not for revenue.

Why ad platforms optimize for the wrong event

A form fill is the last event the ad platform can see. The booked call, the qualified lead, and the won deal happen later, inside the CRM. If the platform never hears about them, it treats every lead as equal and spends toward whatever produced the most form fills. The reporting side of that gap is covered in GoHighLevel attribution reporting. This post covers the send side.

Capture the match keys when the lead arrives

Offline conversions only match when the upload carries something the platform can tie back to a click or a signed-in user. If the lead is saved without those values, no later workflow can recover them. Add hidden fields to the GoHighLevel form, calendar, or landing page, and map them to contact custom fields so they persist on the record:

  1. Google click IDs: gclid, gbraid, and wbraid, stored separately so each can be sent for the right upload.
  2. Meta click and cookie values: fbclid, plus the _fbc and _fbp cookie values read from the page at form submit.
  3. Customer identifiers: email and phone, normalized and hashed before any value leaves your systems.
  4. Campaign context: UTMs and the landing page, kept for reporting. A clean UTM setup is covered in dynamic UTM parameters.
  5. Stage timestamps and the GoHighLevel opportunity ID, used later as the deduplication key.

If the form submits on a different domain or inside an iframe, the cookie values may not be readable from the page that gets the submission. Test that path on purpose. The GoHighLevel and GA4 mismatch guide covers why iframe and separate-domain setups lose tracking.

Trigger on the stages that matter

Build a GoHighLevel workflow that starts on Opportunity Status Changed or Pipeline Stage Changed, filtered to the Won stage. Booked and qualified stages can use their own workflows if you want earlier signals, but keep them separate from Won so each conversion action has one meaning. GoHighLevel offers workflow actions and conversion features that change over time, so check GoHighLevel’s current workflow actions before building a custom endpoint. If nothing native fits the stage and the platform, use a Webhook action that posts to an endpoint or integration you control, and that endpoint calls the ad platform APIs.

Map each field to the platform that needs it

The same contact record feeds two different upload formats. The table shows where each GoHighLevel value goes. Field names follow each platform’s upload documentation, so confirm them against the current reference before you build.

GoHighLevel fieldGoogle Ads upload fieldMeta CAPI field
gclid, gbraid, wbraidClick identifier on the conversion upload (match to the click)Not used by Meta; keep for Google only
_fbc cookie value (or fbclid, formatted the way Meta specifies for fbc)Not used by Googleuser_data.fbc
_fbp cookie valueNot used by Googleuser_data.fbp
Email (hashed)User-provided identifier, for enhanced conversions for leadsuser_data.em
Phone (hashed)User-provided identifier, for enhanced conversions for leadsuser_data.ph
Won stage timestamp and timezoneConversion date and time, with timezone offsetevent_time
Deal value and currencyConversion value and currency codecustom_data.value and custom_data.currency
Opportunity IDOrder ID, used to deduplicateevent_id, used to deduplicate
Pipeline stage nameConversion action name (one action per outcome)event_name (for example Purchase or a named lead stage)
Keep click IDs platform-specific, send hashed identifiers only, and use the opportunity ID as the single deduplication key.

In Google Ads, create a conversion action set up for imports, which takes offline conversions. Each upload matches a conversion to a click, using the gclid, gbraid, or wbraid saved at lead time, or to hashed user data for enhanced conversions for leads. Each upload also needs a conversion time with its timezone, plus value and currency. Google sets a maximum lookback between the click and the imported conversion, so check the current limit in Google’s offline conversion import guide before you schedule uploads for older deals.

Meta: send a system-generated CRM event

For Meta, send events through the Conversions API with action_source set to system_generated, which is the value for events that come from a CRM rather than a browser or app. Each event needs an event_name, an event_time, and user_data. Hash the email and phone values, and include fbc and fbp when you have them. Add value and currency in custom_data. Meta’s CRM integration for conversion leads optimization is built around lead stage events, so decide whether your stages map to a standard event or a custom lead-stage name. The details can change, so confirm the current requirements in Meta’s Conversions API for CRM documentation.

Send value, and never count a deal twice

Value-based bidding needs the deal value, so send it with each Won event rather than a flat count. Then keep the events clean. Use one conversion action per outcome. Do not send the same opportunity to a single action at several stages, because each send adds to the count. If booked and won both go to the same action, the platform will treat one deal as two conversions. Use the opportunity ID as the deduplication key, which maps to the order ID on Google and the event ID on Meta.

Send only hashed identifiers, and only the values the platform needs to match and value the event. Respect the consent the lead gave at capture. Do not send appointment details, notes, or anything the contact typed into a free-text field into event parameters. Healthcare and other regulated businesses need a stricter review of what leaves the CRM, which is covered in marketing analytics for healthcare.

QA with one won deal before you turn it on

  1. Submit a test lead with a known click ID, move it through the stages, and mark one deal Won.
  2. Confirm the upload appears in Google Ads conversion diagnostics or upload status, with the expected value and time.
  3. Confirm the Meta event appears in Events Manager with the expected event name and value.
  4. Watch the match rate for a week, and investigate any drop against the capture form.
  5. Keep a send log with the opportunity ID, platform, event name, value, timestamp, and response status for every event.

Where MetricMaven fits

We build the capture, the stage mapping, the send path, and the send log as one system, then reconcile won deals against what each platform recorded. Clean campaign tagging comes first, so start with dynamic UTM parameters. The attribution modeling service covers how those outcomes feed the wider reporting model. If you want the setup checked before it spends budget, book a tracking audit.

Frequently asked questions

How do I send GoHighLevel won deals to Google Ads?

Capture the gclid, gbraid, or wbraid when the lead arrives and store it on the GoHighLevel contact. When the opportunity reaches Won, upload an offline conversion to a Google Ads conversion action that carries that click ID, the conversion time with its timezone, the deal value, and the currency. Check Google’s current import requirements before you build the sender.

Does GoHighLevel send conversions to Meta automatically?

Do not assume it does. Confirm which workflow actions and integrations your GoHighLevel account offers today, since they change over time. If none covers the stages you need, a custom endpoint can send system-generated events to the Meta Conversions API using hashed identifiers and the fbc and fbp values captured at lead time.

Why do my offline conversion uploads show no matches?

The usual causes are that the lead was saved without a click ID or cookie value, identifiers were hashed or normalized inconsistently, or the click fell outside the platform’s allowed window. Read each platform’s match diagnostics, then fix capture on the form before you change the sender.

Can MetricMaven help set up GoHighLevel offline conversions?

Yes. We map the GoHighLevel stages, click identifiers, hashed customer fields, and value rules to each ad platform, test one won deal end to end, and keep a send log so the team can see what was sent, when, and why.

Sources and references

Tracking audit

Find out what your tracking is missing.

Every engagement starts with a written audit of what you track today, what’s broken, and what to fix first.

Book a tracking audit
  1. What we check

    Tags, events, and consent on your site, and how conversions reach GA4, your ad platforms, and your CRM.

  2. What you get

    A ranked list of tracking gaps with the business impact of each and the effort to fix it.

  3. What follows

    Your team works through the list, or we implement the fixes and keep them working.