Conversion tracking guide

GoHighLevel embedded form inside an iframe? The outer page cannot see everything.

An embedded form often runs in a different document or domain from the landing page. That boundary affects form listeners, browser cookies, attribution fields, and where the tracking code must run.

Updated July 2026 7 min read Practical setup guide
Quick answer

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.
Before you publish

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

Frequently asked questions

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.

Keep learning

Related conversion tracking guides

Simple CAPI workspace

Turn the answer into a working Meta conversion.

Choose Lead or Schedule, paste one protected script on the intended page, and verify the real conversion.

Create your script