Read-only local campaign artifact
ghl-conversion-tracking-input-gate.md
direct-measurement-wave-1/ghl-conversion-tracking-input-gate.md
# GHL conversion tracking: input gate
**State:** `PARTIAL`
**Target:** `https://flatfeehousecleanerssarasota.com/`
## What was actually checked
The retained Flat Fee homepage text was searched for `leadconnector`, `gohighlevel`, `locationId`, `__NUXT_DATA__`, iframe markup, and a GHL origin domain. None is present in that text capture. This does **not** prove the current site lacks a GHL form. The text capture is not the original DOM and cannot expose an iframe that was not retained.
## Inputs needed for a real target-specific implementation
| Required input | Why it is needed |
|---|---|
| Exact GHL embed HTML or the current page DOM | Extract the actual `locationId` and permitted origin domain |
| Read-only GTM container evidence | Confirm the real GA4 measurement-ID variable and avoid duplicate tags |
| Read-only GA4 DebugView or Realtime evidence | Verify the event reaches the intended property |
| Owner approval to modify and publish GTM | Required before any production tag change |
## Implementation contract once inputs exist
Use a Custom HTML listener that only accepts the supplied GHL origin or approved GHL domains and only accepts the supplied location ID. On a verified submission, it may push:
```javascript
window.dataLayer.push({
event: 'lead_form_submission',
form_name: 'ghl_form',
page_path: window.location.pathname
});
```
Then a `lead_form_submission` custom-event trigger may fire a GA4 event tag. This snippet is a generic template, not installed code, and deliberately contains no invented GHL domain, location ID, or GA4 ID.
## Completion test
GTM Preview must show exactly one listener event and exactly one GA4 event after a controlled non-production test submission. GA4 DebugView must receive the event with the approved non-PII parameters. This wave made no form submission and no GTM or GA4 change.