Facebook Lead Ads to GoHighLevel Webhook: Setup & Fix (2026)
How do you connect Facebook Lead Ads to GoHighLevel, or fix leads that don’t arrive?
Quick answer: Start with the native GoHighLevel connection. Check Page access, Lead Access, the selected form and field mapping. If you need custom routing, several sub-accounts, data cleanup or execution logs, use Make’s Facebook Lead Ads trigger and send the lead to HighLevel with a scoped Private Integration Token and the v3 Contacts API. Use a direct Meta webhook only if you control a Meta developer app.
Which route fits your setup?
Pick your situation, then tap any step to see what breaks there and how to fix it.
1. Facebook Lead Ads to GoHighLevel via Webhook: What Actually Happens
Meta’s lead webhook does not deliver the full form. It sends a short notification with a lead ID, and your system then fetches the answers from Meta’s Graph API.
- Create a Meta app and subscribe the Page to lead notifications.
- Verify your callback URL when Meta sends its verification request.
- On each notification, fetch the lead by its ID using a token with lead-retrieval permission.
- Map the answers and send them to HighLevel with the v3 Upsert Contact call (section 5).
No developer app? Skip steps 1–3. Make’s Facebook Lead Ads trigger handles them, and the native HighLevel connection needs no build. See the advanced webhook section.
2. Why Facebook Lead Ads Do Not Reach GoHighLevel
A lead ad can submit successfully while the CRM receives nothing. The cause is usually the link between the Meta Page, lead permissions, the selected form and the CRM integration, not the campaign.
HighLevel’s own troubleshooting guide points to four checks before you replace anything:
The user connecting the integration needs the required Page access.
In Meta Business settings, confirm LeadConnector can access leads for the Page.
The form in the ad must be the one enabled and mapped in HighLevel.
Standard and custom questions must map to the intended contact fields.
Don’t disconnect a working native integration just to get more control. For one Page to one sub-account, native is enough. Make pays off when you need routing, transformation, extra destinations or external logs.
Official steps: HighLevel’s Facebook Lead Ads integration guide.
3. Make Architecture and API v3 That Work in 2026
Make offers a Facebook Lead Ads integration with a New Lead trigger, a Get Lead Details action and a webhook-management action. You don’t need a Meta developer app for ordinary lead automation. See Make’s Facebook Lead Ads integration.
A Make Custom Webhook is not the same as Make’s Lead Ads trigger. Pasting a generic Make webhook URL into Ads Manager will not make Meta send lead events to it. Use Make’s own trigger for the no-code route, or build the developer route in section 8.
The flow: Meta Lead Ad → Make trigger → Get Lead Details → Router (optional) → HighLevel API v3 upsert.
Private Integration Tokens and v3
Older tutorials use the legacy API key or call the 2021-07-28 Contacts API “V2”. For a new build, HighLevel’s versioning documentation lists v3 as supported, with v3 Create and Upsert Contact at services.leadconnectorhq.com.
Mental model: legacy API key → avoid. Private Integration Token → scoped Bearer credential. Contacts API v3 → what this guide uses.
Private Integration Tokens can be created per agency or sub-account, are used as Bearer tokens and can be rotated in HighLevel. Give them only the scopes the workflow needs, and never put them in public code, screenshots or templates. References: Private Integrations · API Versioning
Why Upsert, not Create: retries and reconnects can run a workflow twice. HighLevel’s v3 Upsert Contact follows the location’s duplicate-contact settings, so a repeat run updates the contact instead of duplicating it.
4. Build the Make.com Workflow
Step 1: Connect Facebook Lead Ads
Create a scenario, pick the Facebook Lead Ads app and use the New Lead trigger. Select the Page and lead form, complete the permission flow, then send a real test lead and confirm the scenario receives it.
If leads stop arriving after a few weeks: some Make users report the real-time Facebook trigger going silent while ads keep generating leads. Reported fixes are recreating the webhook and connection, or switching to Make’s Watch Lead module.
This comes from user reports in Make’s community, not official documentation. Test it in your own scenario before relying on it.
Step 2: Retrieve the lead details
Use Get Lead Details to read the submitted answers instead of assuming every lead arrives as a flat object. If the data contains arrays, use Make’s Iterator to process each item.
Step 3: Normalize the data
Build a clean mapping before the HighLevel call: first name, last name, email, phone, campaign or form ID, custom answers, lead source and optional owner or routing value.
Step 4: Create the HighLevel connection
In HighLevel, create a Private Integration with minimum scopes, copy the token and store it securely in Make. Send it as:
Authorization: Bearer YOUR_PRIVATE_INTEGRATION_TOKENStep 5: Send the lead to API v3
In Make’s HTTP module, POST to the v3 Upsert Contact endpoint:
POST https://services.leadconnectorhq.com/contacts/upsert
Authorization: Bearer YOUR_PRIVATE_INTEGRATION_TOKEN
Content-Type: application/json
Accept: application/json
Version: v3
{
"firstName": "{{first_name}}",
"lastName": "{{last_name}}",
"email": "{{email}}",
"phone": "{{phone}}",
"locationId": "YOUR_LOCATION_ID",
"source": "Meta Lead Ad",
"customFields": [
{ "key": "monthly_ad_spend", "fieldValue": "{{monthly_ad_spend}}" },
{ "key": "business_type", "fieldValue": "{{business_type}}" }
]
}The v3 Contacts documentation uses customFields objects with fieldValue. Don’t copy older examples that use field_value. Your Make variable names depend on what your Facebook connection returns, so treat this as an API-shape example.
Step 6: Read the response
The v3 Upsert response says whether a contact was created and returns the contact object and a trace ID. Log failed HTTP responses, because a successful trigger doesn’t mean the CRM call worked. Check each stage in order: Meta lead exists, Make received it, HighLevel accepted it, the CRM record is correct.
5. Mapping, Routing and Duplicates
| Incoming value | Normalized field | HighLevel target |
|---|---|---|
| Full name | first_name / last_name | Contact name fields |
| Email, phone | email, phone | Contact email and phone |
| Custom answers | monthly_ad_spend, business_type | customFields |
| Campaign or form | source or routing variable | Source, tag, owner or Router branch |
If a form question changes wording, you update the mapping layer instead of rebuilding the CRM request.
Route leads to multiple sub-accounts
This is where Make beats point-to-point sync. A Router can read a campaign, form, ad set or geography value and send the lead to a different HighLevel location ID.
Make the routing rule explicit. Store the mapping (Campaign A → Location A, Campaign B → Location B) and test every branch before sending live traffic.
HighLevel’s contact API supports assignedTo when you already know the user ID. For complex ownership rules, send the contact to the right location and let HighLevel’s workflows assign the rep.
Prevent duplicate contacts
Recommended pattern: receive lead → normalize → route → Upsert Contact → inspect response → log trace ID.
6. Troubleshooting and Current Rate Limits
| Symptom | Check first | Likely fix |
|---|---|---|
| No leads ever arrived | Page access, Lead Access, selected form | Fix permissions and form selection before rebuilding. |
| Worked, then stopped | Facebook authorization and Page permissions | Reconnect the native connection or recreate the Make connection. |
| Make receives nothing | Facebook connection inside Make | Reconnect and verify the Page and form. |
| HighLevel returns 401/403 | Bearer token, scope, Version header | Use a valid scoped token and Version: v3. |
| HighLevel returns 429 | API request rate | Throttle, serialize and retry using the rate-limit headers. |
| Duplicate contacts | Two live routes or Create Contact | Run one production path and use Upsert. |
| Custom answers missing | Normalization and mapping | Build the customFields array explicitly. |
Native fix didn’t solve it, or you need to route leads by campaign? Make’s Lead Ads trigger plus a Router covers that without a custom Meta app, and the Free plan is enough to test it.
HighLevel API rate limits
HighLevel documents a burst limit of 100 requests per 10 seconds and 200,000 requests per day, counted per Marketplace app and resource such as a Location or Company. Treat the response headers as the authority instead of a fixed sleep value:
X-RateLimit-Limit-Daily
X-RateLimit-Daily-Remaining
X-RateLimit-Interval-Milliseconds
X-RateLimit-Max
X-RateLimit-RemainingFor bulk migrations, control concurrency and retry failures. See the current rate-limit documentation.
7. Advanced Meta Webhook Setup
This route is for developers who want Meta’s Page webhook to call their own endpoint. It normally needs a Meta developer app, webhook verification, a leadgen subscription for the Page and the permissions required to retrieve lead data. It is different from adding Make’s Custom Webhook module.
Use this only when you need it. For a normal no-code workflow, Make’s Lead Ads trigger is simpler and needs less maintenance.
Keep these stages separate so a failure is easy to locate: webhook delivery, lead-detail retrieval, normalization and validation, HighLevel delivery, error handling and replay.
8. Production Test Checklist
Don’t switch a live campaign from native sync to Make until each layer is verified.
Use a unique email and phone.
The lead appears in the execution.
Standard and custom values are present.
The right location branch was chosen.
Inspect the HTTP response and Upsert result.
Email, phone, custom fields and owner.
Replay the lead and confirm Upsert behavior.
Only one live route creates contacts.
9. What Make Costs in 2026
Make bills in credits. Its pricing page lists a Free plan with 1,000 credits per month and a Core plan at $12 per month for 10,000 credits. Usage depends on modules and processing, and arrays that create extra bundles consume extra credits, so don’t price this by module count alone. Check Make’s current pricing before you model production cost.
Use native GoHighLevel
One Facebook Page to one location with standard CRM processing.
Use Make + GoHighLevel
Conditional routing, transformations, extra systems or execution logs.
Frequently Asked Questions
Why are my Facebook Lead Ads not syncing to GoHighLevel?
Check Page access, Lead Access, the correct lead form and Facebook form-field mapping before replacing the integration.
Do I need Make.com to connect Facebook Lead Ads to GoHighLevel?
No. One Page to one location can use the native integration. Make helps with routing, transformation and multiple destinations.
What is the current GoHighLevel API version?
HighLevel’s versioning documentation lists v3 as a supported named version, which this guide uses.
Is the old GoHighLevel API v1 still supported?
HighLevel states API v1 reached end-of-support on December 31, 2025. New builds should use the current API and authentication model.
Why use Upsert Contact instead of Create Contact?
Upsert follows the location’s duplicate-contact settings, so retries update a contact instead of duplicating it.
Can one Facebook Page send leads to multiple GoHighLevel sub-accounts?
Yes. A middleware workflow such as Make’s Router can send leads to different HighLevel locations based on a routing value.
Do I need a Meta developer app to use Make with Facebook Lead Ads?
Not for Make’s standard Facebook Lead Ads trigger. A Meta developer app is only needed for a direct custom webhook architecture.
What should I do when HighLevel returns 429?
Check the documented rate limits and response headers, reduce concurrency and retry instead of relying on a fixed delay.
Do HighLevel Private Integration Tokens expire like access tokens?
They are static credentials that do not refresh automatically and can be rotated manually in Private Integrations.
Official Documentation Used for This Guide
Build the workflow when you actually need the extra control
For a basic one-account setup, fix the native connection first. When you need routing, normalization, duplicate protection or a multi-step automation layer, Make + GoHighLevel gives you a workflow you can inspect and maintain.
Related: GoHighLevel + Make
Routing, conditional logic and multi-location automation.
Open the integration guide →Related: Make token errors
Fix invalid refresh tokens and reconnection problems.
Open the troubleshooting guide →Related: No-Code Blueprint
Reusable Make workflow structures and webhook patterns.
Open the blueprint →Affiliate disclosure: Some links on CreatorOpsMatrix may be affiliate links. If you purchase through one, we may earn a commission at no additional cost to you. Editorial content is not determined by whether a company offers an affiliate program.
Technical disclaimer: APIs, authentication, permissions, pricing and interfaces change. This guide reflects the documentation reviewed for the October 15, 2026 update. Test the workflow in your own environment before using it with production lead traffic.