How the GoHighLevel Zapier integration works
Zapier lists GHL's app as LeadConnector. GHL calls it its official, white-labeled connection.
To connect a sub-account:
- 01In the Zap editor, add a LeadConnector step.
- 02Under Account, click Sign In and log in with your GHL email and password.
- 03Pick the sub-account. You don't need an API key.
Each connection covers one sub-account. For another client, add a new LeadConnector connection and switch the Zap to it.
Zapier's LeadConnector guide lists what the app supports:
- Trigger: Pipeline Stage Changed (instant).
- Actions: Add/Update Contact, Add/Update Opportunity, Add Lead to Workflow, Stop All Workflows for Lead, Add Task.
- Searches: none.
That's a short list. For other GHL events, send a workflow webhook to Zapier instead.
Zapier bills by tasks. A task counts when an action completes, and triggers don't count. The Free plan gives 100 tasks a month and two-step Zaps only. Professional starts from $19.99/month and adds multi-step Zaps and webhooks. Check Zapier's pricing page for your task volume.
GoHighLevel webhook actions (outbound)
GHL workflows have two webhook actions that send data out.
Webhook sends a payload to your URL when a contact reaches the step. It includes the contact's standard and custom fields, plus sub-account data. POST is the default method.
Some data depends on the trigger. For example, appointment details appear only with an Appointment Booked trigger. You can also add custom key/value pairs, with values like {{contact.source}}.
Custom Webhook builds a full HTTP request. It supports GET, POST, PUT and DELETE, plus custom headers and query parameters. Auth options are Bearer token, API key, Basic and OAuth2.
GHL offers no static IP allowlist for Custom Webhook calls. It recommends header-based auth instead. To test, run Test Workflow and check Execution Logs for an "Executed" status.
To send GHL data to Zapier, point the Webhook action at a Catch Hook URL from Webhooks by Zapier. Webhooks by Zapier needs a paid Zapier plan.
GHL's premium-features article lists Custom Webhooks as premium. It doesn't name the standard Webhook action, so check GHL's current docs before you budget.
The GoHighLevel Inbound Webhook premium trigger
The Inbound Webhook trigger gives a workflow its own URL. Any app that can send an HTTP request can use it to start the workflow.
Set it up in five steps:
- 01Turn on premium features in Agency View > Settings > Company > Workflow - Premium Features.
- 02In a workflow, add the Inbound Webhook trigger and copy its URL.
- 03Send a test request with POST, GET or PUT and a JSON body.
- 04Click Test Trigger, select the request, and save it as sample data. Then save the trigger.
- 05Map the fields in the Create/Update Contact action that follows.
GHL's rules for the payload:
- Send JSON. It's the only supported format.
- Use keys without spaces, like
first_nameorfirstName. - Include an email or phone for contact-based workflows. GHL calls this mandatory.
- Reselect the mapping reference whenever the payload structure changes.
Cost and billing. Inbound Webhook is a premium trigger. Each eligible sub-account gets 100 free lifetime premium executions, and they don't reset. After that, each run costs $0.01, unless you buy a Workflow Pro plan:
| Workflow Pro plan | Price | Included executions | Overage per execution |
|---|---|---|---|
| Starter | $10/month | 10,000/month | $0.008 |
| Growth | $25/month | 30,000/month | $0.006 |
| Scale | $50/month | 65,000/month | $0.004 |
Workflows keep running past the allowance, and extra runs bill at the overage rate. GHL says the agency pays these charges, depending on account setup.
To pass costs to the client, turn on rebilling for each existing sub-account. Go to Agency View > Sub-Accounts, open More Options > Manage Client, then Rebilling > Workflow - Premium Features.
If the URL leaks, delete the trigger and add a new one. GHL generates a new URL, and the old one stops feeding the workflow.
The GHL API
The API gives you full control, but you build and host the code. Our GoHighLevel API guide goes deeper.
Auth. Use a Private Integration Token for internal tools on one sub-account. Use OAuth 2.0 for Marketplace apps that install across accounts.
Calls send a Bearer token. Many endpoints also need a Version header, so check each endpoint's docs. This request follows GHL's example:
curl https://services.leadconnectorhq.com/locations/YOUR_LOCATION_ID \
-H "Authorization: Bearer $GHL_PIT" \
-H "Version: 2021-07-28"This matches GHL's Private Integrations example. GHL released a v3 Version header on June 11, 2026, and supported endpoints now list Version: v3. Older values like 2021-07-28 still work with no end date yet, so use v3 for new builds where the endpoint lists it.
Rate limits. GHL allows 100 requests per 10 seconds and 200,000 requests per day. Limits count per Marketplace app, per sub-account or agency. Installing on more sub-accounts doesn't split the allowance. Watch the X-RateLimit-Remaining and X-RateLimit-Daily-Remaining headers, and slow down before they hit zero.
GHL's rate-limit page covers OAuth calls to API v2. It doesn't say whether Private Integration Tokens share those limits.
App webhooks. Marketplace apps can subscribe to events like ContactCreate. Verify the X-GHL-Signature header. GHL set September 1, 2026 as the deprecation date for the older X-WH-Signature header.
Plans and versions. API v1 reached end of support on December 31, 2025. GHL's API article says Starter and Unlimited include basic API access, but its pricing page lists it only on Unlimited. It ties OAuth 2.0 to Agency Pro, so check your plan before you build.
Decision table: Zapier vs webhooks vs API
| Zapier (LeadConnector) | GHL workflow webhooks | GHL API (custom build) | |
|---|---|---|---|
| Best for | Quick links to apps GHL doesn't connect to | Pushing GHL events out or taking data in | High volume, two-way sync, custom logic |
| Volume | Each completed action uses a task. GHL's API rate limits still apply | Premium steps bill per run | 100 requests per 10 seconds and 200,000 per day, per app, per sub-account or agency |
| Cost | Free: 100 tasks/month. Professional from $19.99/month | 100 free lifetime runs per sub-account, then $0.01 each, or Workflow Pro from $10/month | Hosting and developer time |
| Reliability | Autoreplay reruns errored Zap runs on paid plans | GHL's auto-retries cover Marketplace app webhooks only | You control retries, logs and dedupe |
| Two-way sync | Limited: one trigger, no searches | One direction per webhook; pair inbound and outbound | Yes, with your own conflict rules |
| Who maintains it | Your ops team, in Zapier | Your GHL builder, plus the other system's owner | A developer |
Common failure points and fixes
Duplicate contacts
Use Zapier's Add/Update Contact action, and map email or phone. Then open Settings > Business Profile > Contact Deduplication Preferences.
With Allow Duplicate Contact off, a matching email or phone updates the existing contact. Pick the field you collect most reliably as the primary search, and set a secondary one.
GHL's help article covers forms and Zapier. Its Upsert Contact API follows the same setting. Test inbound webhooks in a test sub-account.
Missing fields
- Inbound webhooks need a JSON body, keys without spaces, and an email or phone.
- Reselect the mapping reference after any payload change.
- Outbound webhooks include trigger-specific data only with the matching trigger.
- In Zapier, test with realistic data so every field you need appears for mapping.
Retries and repeat events
- Zapier's Autoreplay reruns errored runs on paid plans. Free plans can replay errored runs by hand.
- GHL's automatic retries cover Marketplace app webhooks only. Apps that post to your Inbound Webhook must handle their own retries.
- GHL's workflow webhook docs don't describe retries. Check Execution Logs for failed steps.
- Retried app webhooks can deliver the same event twice. Store each event's ID and skip repeats.
- Return a 200 response fast, and do heavy work in the background.
Auth expiry
- GHL calls Private Integration Tokens static. They change only when you rotate them.
- "Rotate and expire this token later" keeps the old token working for 7 days. Update every tool inside that window.
- OAuth access tokens last about 24 hours. Each refresh token works once, so save the new one every time.
- API v1 is past end of support. Legacy API keys unused for 90 days can be marked Expired or deleted.
When to move from Zapier to a custom build
Move off Zapier when one of these is true:
- You need GHL events or lookups the LeadConnector app doesn't offer.
- Task volume makes Zapier your biggest integration cost.
- You need two-way sync with rules for conflicts.
- You run the same Zaps across many sub-accounts, one connection each.
- You need logs, alerts, dedupe and retries you control.
A middle step works too. Keep GHL webhooks for events, and swap Zapier for a small service that calls the GHL API.
AI tools are a separate path. See how to connect AI tools to GoHighLevel with MCP.