Docs navigation
GoHighLevel
BetaSend leads as contacts into a GoHighLevel sub-account (Location). Optionally drop them directly into a sales pipeline at a specific stage.
What this is
GoHighLevel (GHL) is a marketing + sales platform widely used by agencies. Each customer is a "Location" (sub-account). LeadRails creates a contact in the target Location for each lead. With optional pipeline configuration, the contact also gets added to a specific sales pipeline at a named stage — perfect for triggering GHL automations from inbound leads.
Where to find your credentials
Location ID
- Sign in to your GHL agency dashboard.
- Pick the sub-account (Location) you want LeadRails to send to.
-
After clicking into the Location, the URL becomes
https://app.gohighlevel.com/v2/location/<LOCATION_ID>/dashboard. -
Copy the
<LOCATION_ID>from the URL — it looks likeloc_abc123xyzor a long alphanumeric.
Private Integration Token (newer flow — recommended)
- Inside the target Location: Settings → Business Profile.
- Scroll to "Private Integration Token" → click "Create New".
-
Pick scopes — for LeadRails you need at minimum:
contacts.write. For pipeline assignment, also:opportunities.writeandpipelines.read. -
Copy the token immediately — starts with
pit-followed by a UUID. - GHL only shows the token once.
Legacy API Key (older Locations)
If you don't see "Private Integration Token", use Settings → API Keys instead. Legacy keys are long opaque strings without a prefix.
We recommend migrating to Private Integration Token when possible — it's scoped + revocable.
Adding contacts to a pipeline (optional)
If you want LeadRails leads to drop directly into a pipeline (not just create a contact), grab the Pipeline ID + Stage ID:
- In your Location: Settings → Pipelines → click your pipeline.
-
The URL becomes
https://app.gohighlevel.com/v2/location/<LOC>/settings/pipelines/<PIPELINE_ID>. - Copy the
<PIPELINE_ID>. - Click the stage you want leads to land at — its ID appears in the page's URL or in the stage detail panel.
- Copy the
<STAGE_ID>.
Both must be set together for pipeline assignment. Setting only one is treated as "no pipeline" (contact still gets created, just not added to a pipeline).
Set up your destination in LeadRails
- Sign in → Destinations → New.
- Adapter type:
GoHighLevel (Beta). - Location ID: paste.
- API Key: paste your Private Integration Token (or legacy key).
- Pipeline ID (optional): paste if you want pipeline routing.
- Stage ID (optional): paste if you want pipeline routing (both required together).
- Click Create.
Test it
- Sources → your source → Settings → ensure a route exists from this source to the GHL destination.
- Click "Send test event".
-
Within seconds: a contact "Test Lead" with email
test+leadrails@example.comappears in your GHL Location's contact list. - If pipeline + stage are configured: the contact also shows up as an opportunity at the named stage.
- Clean up the test contact in GHL after verifying.
Contact record shape
- LeadRails creates a contact with: first_name (from lead.name, split), last_name, email, phone, source ="LeadRails" tag, customField entries for source_url and any UTM params.
- With pipeline + stage: also creates an opportunity at the configured stage with the contact attached.
- Customize via per-route mapping (Routes → Mapping editor).
Common issues
401 "Invalid token"- Token expired or revoked. Generate a new Private Integration Token.
403 "Insufficient scopes"-
Token doesn't have
contacts.write(oropportunities.writeif using pipeline). Re-generate with broader scopes. 404 "Location not found"- Location ID is wrong, or the token doesn't have access to that Location. Verify Location ID matches the URL exactly.
422 "Invalid pipeline/stage"- Pipeline ID or Stage ID is wrong, or the stage doesn't belong to the pipeline. Both IDs must match the Location.
- Duplicate contact
- GHL has fuzzy email matching. Contact may have been created elsewhere; LeadRails treats this as a soft conflict (still surfaces in Jobs as a permanent_failure for review).
Beta status
GoHighLevel was added to LeadRails in our v2 adapter wave. It's stable enough to use in production, but we're still tuning the contact-deduplication strategy and gathering feedback on which custom fields to expose. The Beta label reflects "recently shipped" rather than "unreliable."