What to do
Do not assume a script on the outer page can read a cross-origin GoHighLevel iframe submission. Track inside the form context when possible, or use the GoHighLevel form-submitted workflow and pass attribution values into the contact before submission.
Understand the iframe boundary
A script on the parent page can see the iframe element, but browser security usually prevents it from reading a cross-origin form inside that iframe. A generic submit listener on the outer page may never fire.
This is normal browser behavior, not a GoHighLevel bug. The implementation must respect where the form actually runs.
- Parent-page script may not access form fields.
- Parent-page cookies may not be available inside the iframe.
- The iframe URL may not contain the original campaign query string.
- A thank-you redirect may occur inside the iframe only.
Choose the tracking point that can see the conversion
The cleanest options are a tracker installed inside the form page, a controlled postMessage integration between the iframe and parent, or a server event from the GoHighLevel form-submitted workflow.
For most teams, the CRM workflow is simpler. The tradeoff is that the contact record must already contain the useful landing-page information.
- Install the form tracker inside the embedded document.
- Use a supported message from iframe to parent.
- Send the event from the GHL workflow.
- Use a dedicated success page outside the iframe only when the redirect is reliable.
Preserve the parent-page attribution
Capture campaign values on the outer landing page before the visitor interacts with the iframe. Then pass them into hidden fields, a supported form value, or another controlled handoff that reaches GoHighLevel.
Do not claim attribution fields were captured merely because they exist on the parent URL. The final contact or event payload must contain them.
- Capture first landing URL and UTMs.
- Preserve FBCLID, FBC, and FBP when available.
- Verify hidden fields actually reach the contact.
- Inspect the final CAPI event rather than the parent page only.
GoHighLevel Meta CAPI check
01Confirm whether the form is cross-origin
02Choose an inside-form or workflow tracking point
03Capture parent-page attribution before submission
04Verify values reach the GoHighLevel contact
05Test the exact embedded version used in production
Common questions about this setup
Why does my JavaScript submit listener not detect the GHL form?+
The form may be inside a cross-origin iframe, which prevents the parent page from reading its internal DOM events.
Can I put the tracker on the parent page anyway?+
You can capture the visit there, but the parent still needs a reliable signal that the form succeeded.
Is a GoHighLevel workflow enough?+
It can reliably see the form submission, but it only has the attribution data that reached the contact record.
Should I use a thank-you page?+
A dedicated success page can work when every successful submission reaches it and failed or abandoned submissions do not.
Official references
Use these official references when checking the current Meta setup and account screens.