Your brief describes a small, well-defined job: a new landing page, a four-field callback form, the contact created or updated with a campaign tag and pipeline entry, source information preserved, you notified, the prospect acknowledged, a thank-you shown, the pixel confirmed, and nothing in the existing funnel touched. Rather than describe that, I built it against my own GoHighLevel sub-account so you can submit the form yourself and see every step land.
The landing page opened from a UTM-tagged link, the four fields filled, the receipt in place of the form, the Worker's response behind it, then the contact in GoHighLevel with its tag, and the card on the new pipeline. This one was a live write, so the contact and card you see are real.
“The new campaign must remain completely separate from an existing lead-magnet page and its automations. Nothing in the existing funnel or workflow should be changed.”
That sentence decides the method. Every object the campaign needs gets its own prefixed name, its own tag, its own pipeline and its own fields; nothing existing is edited, reused or re-pointed. And instead of promising that, the sub-account is snapshotted before the build and again after, and the diff is the deliverable: the only changes are additions.
| Scope item | Built as | Verified |
|---|---|---|
| New landing page, desktop and mobile | A separate page with placeholder copy (yours replaces it), responsive two-column to single-column | live |
| Short callback form: name, phone, email, optional summary | Four fields plus a consent line and a honeypot for bots. Phone and email validated before anything is sent | live |
| Create or update the contact correctly | Match by email first, then phone; create only when neither matches. A returning prospect is updated, never duplicated | proven twice |
| Campaign-specific tag | tax-2026-callback, applied on create and on match, used nowhere else | read back |
| Pipeline and stage | New pipeline Tax Season 2026 — Callbacks, entry stage Callback requested. A second request from the same person updates the open card and adds a note rather than opening a second card | read back |
| Preserve Facebook / UTM source | utm_source, medium, campaign, content, term, fbclid, landing page and referrer captured on first landing, kept for the session, stored in ten campaign-prefixed fields | read back |
| Immediate internal notification with the submitted information | Email to you within a second, every field plus a direct link to the contact | in inbox |
| Brief acknowledgment to the prospect | Plain email: we got it, we'll call this number, reply if another is better. Sent through an authenticated domain, and noted on the contact | in inbox |
| Clear thank-you after submission | The form is replaced in place by a receipt: who we'll call, at what number, logged when, with a reference | live |
| Meta Pixel and conversion tracking working | Pixel fires PageView and Lead in the browser; the server sends the same Lead to the Conversions API with a shared event id so Meta counts one lead, not two | pixel live · CAPI needs your token |
| Test the complete process | Live submissions from the page through to the inbox, plus 14 automated tests for the failure cases | done |
| Verify existing page, form and automations unchanged | Before and after snapshot of every pipeline, field, workflow, form, funnel, calendar and tag, diffed | 0 changed |
{
"name": "Jordan Alvarez", "phone": "(517) 555-0142",
"email": "jordan@…", "summary": "First year self-employed and I got a CP2000 letter for 2024.",
"utm_source": "facebook", "utm_medium": "paid_social",
"utm_campaign": "tax-2026-video", "utm_content": "cp2000-hook", "fbclid": "IwAR0…"
}
HTTP 201 matched false · contact 0D055NUA00Ben5WieLJN · opportunity LFz4IdZuadd18XkoOtxf
tag tax-2026-callback · pipeline "Tax Season 2026 — Callbacks" · stage "Callback requested"
notified true · acknowledged true · 1.4 s
Read back from GoHighLevel: name split correctly, phone stored as +15175550142, source “Tax Season 2026 landing page”, the one tag, and all ten attribution fields populated, including the click id and the exact landing URL. The notification was in the inbox at 21:40:22, one second after the request.
This is where lead forms quietly go wrong: a second submission becomes a second contact, the history splits, and you ring the same person twice. Here the email is matched case-insensitively, the existing card is kept, and the new request lands as a note.
{ "email": "HelpPeople411+Jordan@…", "phone": "517-555-0199", "summary": "Also need last year amended." }
HTTP 200 matched true · contact 0D055NUA00Ben5WieLJN // the same contact
opportunity LFz4IdZuadd18XkoOtxf "existing" // the same card, plus a note
notified true · acknowledged true · 1.6 s
pipelines 15 -> 16 +1 -0 ~0 + Tax Season 2026 — Callbacks [Callback requested, Reached, No answer — retry, Closed] customFields 55 -> 65 +10 -0 ~0 + Tax — UTM Source … Tax — Callback requested at workflows 75 -> 75 +0 -0 ~0 forms 8 -> 8 +0 -0 ~0 funnels 16 -> 16 +0 -0 ~0 calendars 8 -> 8 +0 -0 ~0 tags 443 -> 443 +0 -0 ~0 Existing objects: UNCHANGED (only additions).
The sub-account already holds 75 workflows, 16 funnels and 443 tags from other work, which is a fair stand-in for a live account with an existing lead magnet. The snapshot script runs again at handoff, so you get the same table for your account.
✔ every field spelling the form could send produces one shape ✔ (517) 555-0142, 517-555-0142 and 15175550142 converge to +15175550142 ✔ a bad email with a good phone is flagged, and still recorded ✔ no email and no phone is the only rejection ✔ the same request twice is held as a duplicate, not a second contact ✔ the CRM being unreachable returns 202 with the lead intact, and still notifies you ✔ a malformed body is a 400, not a stack trace ✔ a browser on the landing page is allowed; any other origin is not
The one that matters most is the sixth. If the CRM is down for ten minutes on the morning your ads go live, the form still says thank you, you still get the email with the details, and nothing is lost.
In your account the work is native GoHighLevel: a funnel page built from your copy and page order, a GHL form with hidden UTM fields, and one workflow, triggered by that form only, that tags, moves the contact into the new pipeline, emails you, emails the prospect, and redirects to the thank-you step. No custom code is required for what you described.
What you are looking at here runs the same steps through a small service on Cloudflare instead, for one reason: a demo cannot show your account, and a GHL form in my sandbox would prove nothing to you. The service exists so you can press the button and watch the contact, tag, card, attribution and both emails land. It also happens to be the fallback I would recommend if your existing lead magnet uses a broad “any form submitted” trigger that cannot safely be narrowed.
I have not seen your sub-account. These are the things that most often break the “keep it separate” requirement, listed so you can tell me which apply.
| Risk | Why it matters | What I do about it |
|---|---|---|
| Existing workflow triggers on any form or a shared tag | Your new form would enrol prospects in the lead-magnet sequence | Read the trigger first; filter to the new form; test the old form after |
| Hidden UTM fields not mapped on the form | Facebook source arrives blank and you cannot tell which ad worked | Campaign-prefixed fields, populated from the URL, checked on a real contact |
| Sender domain not authenticated | The acknowledgment is “sent” but lands in spam or fails silently, which I saw in this build | Verify the domain in GHL email settings; send to a real inbox and look |
| Pixel already on the site header plus a pixel in the funnel page | Double PageViews and inflated Lead counts | One pixel, one Lead event, event id shared with the server |
| Double-clicked submit button | Two contacts, two cards, two notifications | Disable on submit; dedupe the same request within ten minutes |
| Thank-you page shared with the lead magnet | Wrong message, and the wrong pixel event, after your form | Separate thank-you step in the new funnel |