GoHighLevel (LeadConnector) Integration

The native GoHighLevel integration pushes each lead straight into your GHL location as a contact - no workflows or webhook wiring required.

This guide covers connecting it and, most importantly, how field mapping works (this is where almost every setup issue comes from).


Connecting GoHighLevel

1. Connect your GoHighLevel account

Go to Settings → Integrations and connect your GoHighLevel account (you'll log in to GHL and choose the location to connect).

2. Enable it for your funnel

In a funnel's Lead Delivery panel, enable the GoHighLevel connection.

You can set a:

  • Source label
  • Tags
  • "Update existing contact on email match" (upsert) option so repeat visitors don't create duplicates

Standard contact info creates/updates the contact automatically; everything else flows through as custom fields.


The one rule that matters: keys must match exactly

GoHighLevel matches your data to its fields by an exact key.

If the key you send doesn't match a custom field that exists in GHL, GHL silently ignores it - no error, the field just stays blank.

There are two things to get right:

1. Do not add a contact.  prefix, and never use {{ }}  brackets

Send the plain key:

accident_type

utm_source

Not:

contact.accident_type

The {{contact.…}}  format you see inside GHL is its display syntax for referencing a field in emails/workflows; it is not the key to use here.

Adding it makes GHL drop the field.

2. The matching custom field has to already exist in GHL

Create the custom field in your GHL location first, then make sure its key matches the key LeadCapture sends.

A blank field almost always means either:

  • A prefix was added
  • The custom field doesn't exist
  • The key doesn't match

Standard fields

Map automatically - leave them plain

These go straight onto the GHL contact and need no custom field:

  • first_name
  • last_name
  • email
  • phone
  • address
  • city
  • state
  • zip  / postal_code
  • country
  • date_of_birth

Do not prefix these or send them as custom fields - if you do, the contact's real name/phone won't get set.


Custom fields

Create them in GHL with a matching key

Everything else - your survey answers, UTMs, click IDs, and the system fields below - lands as a custom field.

For each one you want, create a custom field in GHL whose key equals the key you send.


When you create a custom field in GHL, you choose a type. Pick the right one:

  • Consent / TCPA language → use a "Large Text" / multi-line / text-area field.

    The consent text is a long paragraph, and a single-line text field will reject or cut it off. This is the most common reason consent won't come through.

  • Dates (created time, date of birth) → a Date field works, or Large Text if you want the raw value.
  • Everything else → single-line text is fine.

System & compliance fields you can send

The connector can pass these through as custom fields.

Create a matching custom field in GHL for any you want (keys shown):

Data Key
Lead ID lead_id
Lead number lead_number
Created time created_at
IP address ip_address
User agent user_agent
TrustedForm certificate trustedform_cert_url
TCPA consent text your consent block's key (e.g. tcpa_consent_text ) - use a Large Text field
TCPA opt-in (agreed) that key + _agreed  (e.g. tcpa_consent_text_agreed )
OTP code otp_code
Phone verified phone_verified
Email verified / status email_verified , email_verification_status
Phone validation phone_valid , phone_carrier , phone_line_type , phone_activity_score , phone_is_prepaid , phone_country_code , phone_country_name , phone_litigator_risk
Meta cookies fbp , fbc

Renaming keys to match your GHL fields

If your GHL custom fields already use different keys, you don't have to recreate them.

In the funnel's Field Mapping panel there's a System Fields section where you can rename the outbound key for these fields - set each to match your existing GHL field key.

For example, if your GHL TrustedForm field's key is:

trusted_form

Set "TrustedForm Cert URL" to:

trusted_form

For your own form/custom fields, edit the field's Integration Key to match the GHL custom field's key.


Troubleshooting: a field is blank in GHL

Work through these in order:

1. Does the custom field exist in GHL?

If not, create it.

2. Do the keys match exactly?

No contact.  prefix, no brackets.

Compare the key you send with the GHL field's key character-for-character.

3. Is it the right field type?

Long content (consent) needs a Large Text field.

4. Standard field not setting the contact?

Make sure it's plain:

first_name

Not:

contact.first_name

After fixing, submit one fresh test lead and check the contact.


Native connector vs. webhook

The native connector creates the contact directly - simplest for getting leads into GHL as contacts.

If you need the lead to trigger a specific GHL workflow or enter a pipeline/opportunity, you can add a GHL "Contact Created" trigger on top of the connector, or use a webhook to a GHL inbound-webhook workflow (which requires mapping the fields inside GHL's workflow builder).

Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.