One audience, one offer, one action, every number matching the ad. Then PostHog on it so you know what people actually did before they left. The structure, the tag on submit, and the event plan.
Most landing pages are a website with the menu removed. They talk about the clinic. The visitor came from an ad about her problem, and the page changes the subject.
The page I build has one job: the next click. One audience, one offer, one action. Every number on it matches the ad she clicked, to the dollar. If the ad said ninety nine, the page says ninety nine, in the same place, in the same words.
Then it does two things a normal page does not. It tags the lead the moment the form submits, so the follow-up knows what she asked for. And it tells me what people did on it: how far they scrolled, which button they touched, whether the form started and stopped. Without that I am guessing why a page converts at two percent instead of eight.
This is the structure I ship for clinics, and the analytics setup written for a medical page, which is different from a SaaS page in one important way: it must never record what part of her body she clicked on.
The homepage with the nav hidden. No offer math, no form above the fold, nothing tracked, leads land in an inbox someone checks on Thursday.
One audience, one offer, one action. Concrete math in the hero, a two field form, a tag on submit that routes the lead, every number matching the ad.
Attribution captured on first touch and forwarded with the lead. PostHog page views and a handful of explicit events. A weekly read of where people stop, and a change based on it.
A pretty page about the clinic.
One audience, one offer, one action, every number matching the ad, a tag on submit, and events that tell you what she did.
| Role | Talks to you | Job |
|---|---|---|
| Message match | Above the fold | Same offer, same number, same words as the ad |
| The form | Two fields | First name, phone, consent line, tag on submit |
| Proof and objections | Below | Real providers, real reviews, the FAQ that pre-frames the deposit |
| Measurement | Invisible | Page views, a few explicit events, attribution forwarded with the lead |
Who is arriving, why she clicked, what she must understand, and the one next step. One audience. One offer. One action. If you cannot write it in four lines, the page will not convert.
Sticky CTA bar that appears after the form scrolls off. Scarcity line only if it is true. Hero with concrete offer math: unit price, not a vague bundle. Two field form with a consent line. One before and after photo where it is legally cleared. Benefits. A price or savings calculator if the offer has options. A comparison table that mirrors the ad's numbers. Named providers with photos and credentials. Testimonials headlined by the benefit. How it works. FAQ that pre-frames the deposit and the "is it real" question. Map. Footer disclaimer.
Every number on the page equals the number in the ad. One canonical anchor price. If the ad changes, the page changes the same hour. Message mismatch is the silent killer; people do not complain, they leave.
Preferred: the CRM's inbound webhook, no secrets in the page. The form posts name, phone, source and offer; the workflow creates the contact and adds the routing tag. Fallback: a small serverless function with the API key in an environment variable that upserts the contact and adds the tag explicitly, because upsert alone can drop tags. Confirm which tag actually lands with a real test.
On page load, read utm_source, medium, campaign, content, term, and the click ids (fbclid, gclid). Store the first touch for the visit. Send it with the lead. Forward only an allowlist of fields so a crafted request cannot smuggle extra data into the CRM.
Autocapture off. It records the text of whatever was clicked, and on a clinic page that text is a treatment. Session recording off, it would capture the form as typed. Mask personal data properties on. Capture page views plus a short list of explicit events: lead_submitted, cta_click, call_click, form_started, each carrying the campaign and nothing about anyone's body. Page leave on, so scroll depth and time on page exist.
Submit the form with a throwaway name. Confirm the contact in the CRM with the tag and the attribution fields. Confirm the events in PostHog with the campaign attached. Delete the test contact. Then check the page on a phone at 375 pixels, because that is where the traffic is.
Page views to form starts to submits, by campaign. Where the drop is, is what you change. One change a week, one variable, then read again.
Each phase has a done-when. If you have not hit it, do not start the next one. Every failure I have seen came from skipping ahead.
Paste these as written. They are short on purpose, because the long ones drift.
Act as my landing page strategist. Here is the ad I am running: [paste primary text and headline]. Offer: [price and what is included]. Audience: [who]. Produce: (1) a four line brief: who is arriving, why she clicked, what she must understand, the one next step; (2) the page in section order using this structure: sticky CTA, scarcity only if true, hero with the exact offer math from the ad, two field form with a consent line, proof, benefits, comparison table mirroring the ad numbers, named providers, testimonials headlined by benefit, how it works, FAQ that pre-frames the deposit, map, disclaimer; (3) the exact copy for the hero and the form; (4) an event plan for PostHog with autocapture off: page view, form_started, lead_submitted, cta_click, call_click, and the attribution fields to carry on each; (5) the end to end test with a throwaway contact. Flag any number on the page that does not appear in the ad. No em dashes.
Compare this ad copy and this page copy. List every number, price, timeframe and claim that appears in one and not the other, or differs between them.
Configure PostHog for a medical landing page: autocapture off, session recording off, mask personal data, page views and page leave on, and these explicit events with campaign attribution and no treatment names: form_started, lead_submitted, cta_click, call_click. Give me the init config and the capture calls.
Every one of these has happened to me or to someone I set this up for.
| Failure | Fix |
|---|---|
| Page says $149, ad said $99 | One anchor price, changed the same hour as the ad |
| Five field form | Two fields; ask the rest on the call |
| Lead arrived with no tag, follow-up did not know the offer | Tag on submit, verified with a test contact |
| Autocapture on, treatment names in the analytics vendor | Autocapture off, explicit events only |
| Session recording captured phone numbers as typed | Recording off where a form exists |
| No idea where people leave | Page view, form start, submit, by campaign |
| Google CDN hero image expired | Self-host, crop, blur, overlay |
It carries the page structure in order, the congruency rule, the two-field form with consent copy, the tag-on-submit pattern (webhook first, serverless fallback), the end-to-end test, and the PostHog configuration for a page where clicked text is sensitive. Give it your offer and your ad copy and it produces the page brief and the event plan.
---
name: lead-landing-page
description: Builds a cold-traffic landing page that generates leads, one audience, one offer, one action with every number matching the ad, tags the lead on submit through the CRM webhook, captures attribution on first touch, and instruments it with PostHog configured for a medical page (autocapture and recording off, explicit events only). Trigger on "build my landing page", "why isn't my page converting", "track my landing page", "set up posthog on my page".
---
# Lead Landing Page
One audience. One offer. One action. Every number matches the ad.
## Brief first (four lines)
Who is arriving. Why she clicked. What she must understand. The one next step.
## Structure, top to bottom
1. Sticky CTA bar that appears once the form scrolls off
2. Scarcity line, only if true
3. Hero with concrete offer math (unit price, not a bundle)
4. Two field form: first name, phone, consent line
5. One before and after, only where cleared
6. Benefits
7. Price or savings calculator when the offer has options
8. Comparison table mirroring the ad's numbers
9. Named providers with photos and credentials
10. Testimonials headlined by the benefit
11. How it works
12. FAQ that pre-frames the deposit and "is it real"
13. Map
14. Footer disclaimer
## Congruency rule
One canonical anchor price. Every number on the page appears in the ad. When the ad
changes, the page changes the same hour.
## Tag on submit
Preferred: the CRM's inbound webhook. The form posts `first_name, phone, source, offer`;
the workflow creates the contact and adds the routing tag. Fallback: a serverless function
with the API key in an environment variable that upserts and then adds the tag
explicitly, because upsert alone can drop tags. Confirm the tag that actually lands with a
real test. Phone normalized to +1XXXXXXXXXX.
## Attribution
On load capture utm_source, utm_medium, utm_campaign, utm_content, utm_term, fbclid,
gclid, msclkid, gbraid, wbraid, landing page, referrer. Hold the first touch for the
visit. Send it with the lead. Forward an allowlist only.
## PostHog for a medical page
```
posthog.init(KEY, {
autocapture: false, // clicked text is a treatment name
disable_session_recording: true, // would capture the form as typed
capture_pageview: false, // captured manually with attribution
capture_pageleave: true,
mask_personal_data_properties: true,
});
posthog.capture("$pageview", { route, ...attribution });
track("form_started" | "lead_submitted" | "cta_click" | "call_click", { location, ...attribution });
```
Events carry a location and the campaign, never a treatment. No treatment name in any
pixel or conversions API event either; that rule is separate and does not move.
## Test the chain
Submit with a throwaway name. Confirm the contact, the tag and the attribution fields in
the CRM. Confirm the events in PostHog with the campaign attached. Delete the test contact.
Check the page at 375 pixels wide.
## Read weekly
Page views, form starts, submits, by campaign. Change the biggest drop. One variable a
week.
The page is step three of the Predictable Patient Pipeline. Inside the AI CEO Lab, Demand Engine walks from ad to page to booked call with your offer.