> ## Documentation Index
> Fetch the complete documentation index at: /docs/llms.txt
> Use this file to discover all available pages before exploring further.

# GoHighLevel and ClickFlare Integration Guide

> Track GoHighLevel leads in ClickFlare: keep the click ID on the contact, then send bookings and sales from a workflow Custom Webhook action.

![GoHighLevel and ClickFlare Integration](https://mintcdn.com/clickflare/gS923ib4WFySqxSL/images/integrations/covers/gohighlevel.png?fit=max\&auto=format\&n=gS923ib4WFySqxSL\&q=85\&s=6d3ce44c629a7198c114bbb1132872b4)

HighLevel (often called GoHighLevel) is a CRM and marketing automation platform with its own funnels, forms, calendars, pipelines and workflows. Agencies and lead-gen teams use it to capture leads, book calls and track opportunities to a sale.

This guide sends the steps that matter back to ClickFlare:

* **ClickFlare → HighLevel:** ClickFlare passes its click ID to your funnel page, and the form saves it on the contact in a custom field.
* **HighLevel → ClickFlare:** when a workflow reaches the step you choose, the **Custom Webhook** action sends the conversion to ClickFlare with that click ID.

Each step arrives as its own custom conversion, so opt-ins, booked calls and sales show as separate columns next to your ad cost. An optional last section covers the reverse direction.

***

## At a glance

To set up GoHighLevel with ClickFlare:

1. Create conversions, campaign and offer.
2. Create the click ID custom field.
3. Save the click ID from the form.
4. Add the Custom Webhook action.
5. Write the body and repeat.

Each step is explained in [Setup](#setup).

| | GoHighLevel + ClickFlare |
| - | - |
| **How it connects** | Workflow Custom Webhook, JSON POST to /cf/cv |
| **What reaches ClickFlare** | Opt-ins, booked calls, sales, payout |
| **Timing** | Real time, per conversion |
| **Key parameters** | `cf_click_id`, `ct`, `payout`, param1 to param20 |
| **Works with** | HighLevel funnels, forms, calendars and workflows |
| **Good to know** | Use Event = CUSTOM for JSON. Event = POST sends a form body. |

***

## How the data flows

```text theme={null}
Ad click
  → https://trk.yourdomain.com/cf/r/CAMPAIGN?...
     (ClickFlare records the click and generates the click ID)
  → https://yourfunnel.com/optin?cf_click_id=CF_CLICK_ID
     (the form keeps the click ID in a hidden field)
  → Visitor submits the form
     (the contact is created with the click ID in a custom field)
  → Visitor books a call / buys
  → Workflow: Custom Webhook (Event = CUSTOM, POST, JSON)
     POST https://trk.yourdomain.com/cf/cv
     {"cf_click_id": "CF_CLICK_ID", "ct": "booked", "payout": 0}
     (ClickFlare matches the conversion to the original click)
```

| Piece | Where | Value |
| - | - | - |
| **Offer URL** (in ClickFlare) | Your parameter + ClickFlare token | `cf_click_id={cf_click_id}` |
| **Custom field** (in HighLevel) | Contact | Holds the click ID |
| **Custom Webhook** (in a workflow) | ClickFlare keys + HighLevel dynamic values | `cf_click_id`, `ct`, `payout` |

***

## What you'll need

* A ClickFlare account with your **own tracking domain**. See [Tracking domains](/docs/en/settings/tracking-domains.md).
* A HighLevel account with workflows, and a form or funnel that can keep a URL parameter in a hidden field.
* Access to add the **Custom Webhook** action. HighLevel bills some workflow actions per execution as premium actions. Check in your account whether Custom Webhook is one of them before you send high volume through it.

***

## Setup

**1. Set up your own tracking domain**

Add a custom tracking domain, for example `trk.yourdomain.com`, under [Tracking domains](/docs/en/settings/tracking-domains.md). Every Custom Webhook action points at it.

**2. Create a custom conversion for each step**

In ClickFlare, go to **Settings → Custom Conversions** and create one per step you report:

| Step in HighLevel | `ct` value |
| - | - |
| Opt-in form submitted | `lead` |
| Call booked | `booked` |
| Sale or opportunity won | `sale` |

The parameter of each custom conversion is the `ct` value the workflow sends. It must match exactly. See [Custom conversions](/docs/en/settings/custom-conversions.md).

**3. Create the campaign and add your funnel page as the offer**

Go to **Campaigns → New Campaign** and pick your traffic source and tracking domain. See [Creating a campaign](/docs/en/campaigns/creating-a-campaign-in-click-flare.md).

In the campaign path, create a new offer inline with the funnel page that holds your form:

```text theme={null}
https://yourfunnel.com/optin?cf_click_id={cf_click_id}
```

Keep the braces. Set the offer payout to **Auto** so ClickFlare uses the payout HighLevel sends. Save the campaign and copy the campaign URL for your ads.

**4. Create the click ID custom field**

In HighLevel, create a contact custom field of a text type, for example **ClickFlare Click ID**.

**5. Save the click ID from the funnel form**

Add the custom field to your form as a hidden field and set it to take its value from the `cf_click_id` URL parameter. Check your form builder's field settings for the option that fills a field from the URL. HighLevel's help center doesn't document it in the article this guide is based on, so test with one submission and check the contact record.

If your funnel has several pages, the click ID must reach the page with the form. Keep the parameter on links between pages, or put the form on the first page.

**6. Add the Custom Webhook to a workflow**

Go to **Automation → Workflows** and open the workflow for the step, for example one triggered when an appointment is booked. Click **+ Add action → Send Data → Custom Webhook** and name it, for example "ClickFlare booked call".

**7. Configure it as a JSON POST**

1. Set **Event** to **CUSTOM**. This shows **Method**, **Content-Type** and the **Raw Body** editor.
2. Set **Method** to **POST**.
3. Enter the URL `https://trk.yourdomain.com/cf/cv`.
4. Set authorization to none. ClickFlare's postback doesn't need it.
5. Set **Content-Type** to `application/json`.
6. In **Raw Body**, write the JSON and insert the click ID field with the tag icon (the dynamic value picker):

```json theme={null}
{
  "cf_click_id": "CLICK_ID_FIELD",
  "ct": "booked",
  "payout": 0
}
```

Replace `CLICK_ID_FIELD` with the dynamic value the picker inserts for your **ClickFlare Click ID** field. It looks like `{{contact.id}}` but with your field's key. Keep the quotes around it.

For a sale, add `"txid"` with a value unique per conversion, such as an opportunity or order ID, so several sales on one click stay apart. See [Steps, payout and duplicates](#steps-payout-and-duplicates).

Click **Save Action**.

> [!WARNING]
>
> Don't use **Event = POST**. That mode sends a form-style key/value body, not JSON. ClickFlare's JSON endpoint needs a JSON body, so use **CUSTOM**, or the GET option below.

**8. Repeat for each step**

Add a Custom Webhook in each workflow you report from, each with its own `ct`. Then test (see [Verify the setup](#verify-the-setup)).

***

## Option: GET postback with query parameters

Use **Event = GET** if you prefer the URL postback. It carries the same values as the JSON body, `txid` included. GET sends no body. Add these under **Query Parameters**, using the tag icon for dynamic values:

| Key | Value |
| - | - |
| `click_id` | Your click ID custom field |
| `ct` | `sale` |
| `payout` | The opportunity value or order amount |
| `txid` | A value unique per conversion, such as an opportunity or order ID |

The request matches this postback:

```text theme={null}
https://trk.yourdomain.com/cf/cv?click_id=CF_CLICK_ID&ct=sale&payout=497&txid=ORDER_ID
```

Note the key is `click_id` in the URL and `cf_click_id` in a JSON body.

***

## Steps, payout and duplicates

**One step, one `ct`.** A conversion with a different `ct` on the same click is added as a new conversion. A contact who opts in, books and buys shows once in each column, so you see cost per lead, cost per booked call and cost per sale side by side.

**Payout from the sale.** HighLevel's dynamic values cover contact, opportunity and other workflow data. On the `sale` webhook, insert the opportunity value or order amount with the tag icon. Send `0` on earlier steps so revenue isn't counted twice.

**Repeats.** Without `txid`, the same `ct` arriving twice for one click counts as one conversion, which protects you if a contact re-enters a workflow. For several sales per click, send a unique `txid` in the JSON body or the GET query.

**Choose what the ad platform sees.** Each custom conversion is mapped to the traffic source postback separately, so you can send only `booked` or `sale` to the ad platform.

***

## Verify the setup

**1. Click through the campaign**

Open your ClickFlare campaign URL. The funnel page should load with `cf_click_id=` and a real click ID, not the text `{cf_click_id}`.

**2. Submit the form**

Open the new contact in HighLevel and check the click ID custom field holds the same ID.

**3. Run the workflow**

Trigger the step (book a test call), or use **Test Workflow** with that contact. Check the workflow's **Execution Logs** for the webhook's status code. Turn on **Save response from this Webhook** if your account offers it.

**4. Check ClickFlare**

In **Logs → Event Logs**, the conversion should appear with your `ct` and payout on the campaign you clicked through.

To see exactly what HighLevel sends, point the action at a test URL from Webhook.site first, then switch the URL back to your tracking domain.

***

## Send ClickFlare conversions to HighLevel (optional)

To go the other way, for example to tag a contact or move an opportunity when ClickFlare records a purchase from your checkout, use the [Custom Webhook integration](/docs/en/integrations/custom-webhook-integration.md). Go to **Integrations → Conversion API → New integration**, choose **Webhooks**, map the event, choose **POST** and put macros such as `{cf_click_id}` and `{payout}` in the body.

On the HighLevel side, a workflow can start from an incoming webhook with the **Inbound Webhook** trigger, which HighLevel lists as a premium trigger. The workflow then finds the contact by the click ID and acts on it. Without it, use [Zapier](/docs/en/integrations/zapier-click-flare-integration-guide.md), [Make](/docs/en/integrations/make-click-flare-integration-guide.md) or [n8n](/docs/en/integrations/n8n-click-flare-integration-guide.md) to receive the webhook and update HighLevel.

***

## Troubleshooting

> [accordion] The click ID field is empty on new contacts
>
> * The hidden field isn't set to read `cf_click_id` from the URL, or reads a different parameter name.
> * The form is on a later funnel page and the parameter was lost on the way.
> * A lander's CTA links straight to the funnel instead of using the ClickFlare click URL.
> * The campaign uses direct tracking, so the click ID isn't in the URL. See [Direct tracking](/docs/en/tracking/direct-tracking-clickflare.md).

> [accordion] There's no Raw Body or Content-Type field
>
> **Event** isn't set to **CUSTOM**. Only CUSTOM shows the method picker, Content-Type and Raw Body.

> [accordion] The webhook ran but no conversion shows
>
> * The raw body has a literal field name instead of the dynamic value, or the field was empty on that contact.
> * The body uses `click_id` instead of `cf_click_id`, or Content-Type isn't `application/json`.
> * The `ct` value doesn't match a custom conversion's parameter exactly.
>
> See [Troubleshooting S2S postbacks](/docs/en/tracking/troubleshooting-s2s-postback-url-in-clickflare.md).

> [accordion] 400 or 422 in the execution logs
>
> The JSON is invalid. Check for a missing comma or quote, and that the dynamic value is inside quotes.

***

## FAQ

> [accordion] Does ClickFlare integrate with GoHighLevel?
>
> Yes. The form saves the ClickFlare click ID on the contact, and a workflow's Custom Webhook action sends it to ClickFlare as JSON at the step you choose.

> [accordion] Custom Webhook or Webhook (Outbound)?
>
> Custom Webhook. HighLevel recommends it for flexible request building. HighLevel describes the simpler **Webhook (Outbound)** action as being for pre-defined patterns. You need the raw JSON body with ClickFlare's own keys, which Custom Webhook gives you.

> [accordion] Can I track the opt-in without a workflow?
>
> Yes. Place the [conversion tracking pixel](/docs/en/settings/conversion-tracking-pixel.md) on the thank-you page with `ct=lead`, and use workflows only for later steps.

> [accordion] Do I need a specific workflow trigger?
>
> No. HighLevel says any trigger works with Custom Webhook, as long as the fields you map exist when the workflow runs.

> [accordion] Can I send extra data, like the calendar or product?
>
> Yes. Add `param1` to `param20` to the JSON body or the query parameters. ClickFlare stores them with the conversion.

***

## Related

> [card] [Custom conversions](/docs/en/settings/custom-conversions.md)
>
> One ct per step

> [card] [Postback parameters](/docs/en/tracking/click-flare-parameters-in-postback-urls.md)
>
> click\_id, txid, ct

> [card] [HubSpot](/docs/en/integrations/hubspot-click-flare-integration-guide.md)
>
> The same flow in HubSpot


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.