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_namelast_nameemailphoneaddresscitystatezip/postal_codecountrydate_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.
Field types matter (especially for consent)
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).