Meta Conversions API with GoHighLevel: how to recover attribution after iOS 14
Meta's Conversions API (CAPI) sends ad events server-to-server from GoHighLevel to Facebook, so an iOS user who blocks the Pixel still shows up as a conversion when they book a call or become a qualified lead. The setup pairs each CAPI event with a browser Pixel event using the same event_id for deduplication, requires domain verification for iOS attribution, and only moves ROAS numbers when you send real pipeline stages (lead, qualified, booked) instead of generic page views.
Published · Last updated · By M. Ali, GoHighLevel Implementation Specialist, LogixLevel
Why the Pixel alone is not enough any more
Apple’s App Tracking Transparency, launched with iOS 14.5 in April 2021, lets users block tracking by third-party scripts. The Meta (Facebook) Pixel is one of those scripts. When a prospect clicks a Facebook ad on an iPhone with tracking blocked, the Pixel fires in the browser but the event is dropped before it reaches Meta. Reported return on ad spend dropped roughly 30 to 60% across Meta accounts through 2021 and 2022, not because campaigns performed worse but because Meta could not see most of the conversions.1
The Conversions API is Meta’s answer. Instead of (or in addition to) the browser Pixel, your server sends events directly to Meta’s Graph API over HTTPS. iOS tracking blocks do not apply to a server-to-server call, so the event is delivered. If Meta can match the event back to a user who saw an ad, the conversion counts and the algorithm optimises on it.
What GoHighLevel actually does with CAPI
HighLevel can send server-side events to Meta from a sub-account. The native integration maps a short list of CRM events to Meta events:
- A new contact is created becomes a
Leadevent. - An opportunity moves to a stage you choose becomes a
LeadorCompleteRegistrationevent. - A booking on a HighLevel calendar becomes a
ScheduleorLeadevent, depending on the mapping. - A payment or invoice paid becomes a
Purchaseevent.
HighLevel sends the server-side event with the user’s email, phone and (if captured) the Facebook click ID (fbclid). Meta hashes those fields and matches them against the ad audience. In our setups, email plus phone matches about 60 to 80% of iOS leads back to an ad.2
The three failure modes we see most
Any CAPI setup, HighLevel or otherwise, tends to fail in one of three ways. If your reported ROAS has not moved after you “turned on CAPI”, one of these is almost always the reason.
1. No deduplication. When CAPI and Pixel both fire for the same conversion, Meta needs an event_id on both so it can drop the duplicate. HighLevel generates the ID server-side; the Pixel on the thank-you page or booking confirmation must send the same ID. Without this, Meta double-counts and then de-weights the account.
2. Domain not verified. iOS 14+ attribution requires domain verification in Meta Business Manager and the Aggregated Event Measurement setup. Without verification, your account is capped at eight conversion events per domain, and server events are deprioritised. For GHL funnels on a custom domain, verify the root domain and the funnel sub-domain.
3. Sending the wrong events. Sending Lead on every form submission (including every “download the brochure”) tells Meta’s algorithm to optimise for brochure requests. If what you want is booked calls, send Lead only when the contact tag is qualified or when they land on the thank-you page after booking. Fewer, higher-quality events outperform more, lower-quality events every time.
A clean CAPI setup from a HighLevel sub-account
The order below is what we run on a new sub-account. It takes roughly two hours when the Meta Business Manager and the Facebook page are already configured, and about half a day when they are not.
- Verify the domain in Meta Business Manager. Pick the DNS method and add the TXT record at the root domain. Verify again after DNS propagation.
- Prioritise your eight events in Aggregated Event Measurement. Put the business-outcome event (booked call, qualified lead, or purchase) at the top. Put page views and content views at the bottom. The top event is the one that wins attribution for iOS users.
- Create a Pixel and an access token. The access token is the credential HighLevel uses to post events to the Graph API.
- In HighLevel, open the sub-account, go to Settings, Integrations, Facebook, and connect the ad account. Add the Pixel and the access token. Map the HighLevel events (contact created, opportunity stage, calendar booking, payment) to Meta events.
- Turn on
event_idon both sides. HighLevel sends a server event_id by default; add the matching ID to the Pixel on the thank-you page using the GHL field merge tag. - Test in the Events Manager. Submit a test form, book a test call, mark a test opportunity. Watch the Pixel, Server, and Deduplicated columns. All three should move. If “Server” moves but “Deduplicated” shows 0, your event_id is not matching.
- Wait two weeks and re-read ROAS. CAPI needs about 14 days of data for Meta’s algorithm to re-learn. Short-horizon comparisons are noise.
What a correctly set-up account should look like
In the HighLevel accounts we run, after a clean CAPI setup:
- Event Match Quality (EMQ) in Meta Events Manager sits at 7.0 or higher on
LeadandScheduleevents. - Deduplication rate is above 90% on events that fire both client and server.
- Reported cost per lead drops roughly 20 to 40%, not because leads got cheaper but because Meta can now see the leads it was already generating.
If any of those numbers are low, the setup has one of the three failure modes above, not a Meta bug.
Three mistakes that waste the integration
A clean technical setup can still waste money if the strategy behind the events is wrong.
- Optimising for
Leadwhen the business sells on a call. Meta’s algorithm will find people who fill out forms. If “won” conversion lives on a call that happens two days later, send aPurchaseor custom event for the booked call and optimise on that instead. - Sending the same event from multiple sources. If HighLevel sends
Leadand your website also sendsLeadon form submit through a separate script, deduplication will not catch cross-source duplicates. Pick one source for each event. - Changing the event mapping during a campaign. Each change restarts Meta’s learning phase. Stabilise the event list before you spend meaningfully, not during.
When CAPI alone is not the answer
CAPI improves attribution but it does not improve the underlying funnel. We have reviewed HighLevel accounts where CAPI was set up correctly, the EMQ was 8.0, and the ads still lost money. The real problem was that the business was answering the Facebook leads in two hours when the benchmark is five minutes.3 If the lead response is slow, the Meta algorithm learns to find leads that do not convert, because none of them convert.
The honest sequence is: fix response time, then wire CAPI. CAPI amplifies a working funnel. It does not create one.
If you want a 30-minute review of your HighLevel plus Meta setup and a one-page list of what to fix first, book a free audit. We will tell you whether the issue is the pixel, the events, the funnel, or the follow-up, and in what order to fix them.
Footnotes
-
Meta Conversions API (CAPI) and iOS 14 Attribution Playbook, 2026. https://aknigam.com/insights/meta-capi-ios-playbook/ ↩
-
HelloConversions, How to Track GoHighLevel Conversions in Facebook Ads. https://helloconversions.com/blog/track-gohighlevel-conversions-facebook-ads ↩
-
Lead Response Management Study (Oldroyd, MIT / InsideSales, 2007); summarised in our speed-to-lead post. ↩
