AI CEO Lab← All free guides
Growth ยท Landing pages

The Landing Page I Build To Generate Leads

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.

Written from the clinic landing pages shipped in 2026 and their analytics setup. Autocapture and session recording are off on those pages on purpose; the reason is in the setup section. Client names and numbers removed.

The three levels

Level 1 · Manual

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.

Level 2 · AI + connections

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.

Level 3 · Agents on cadence

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.

Connections for this guide: A place to host the page (Vercel for me), your CRM's inbound webhook or API for the tag on submit, PostHog for events, and the ad platform's UTMs on every link in. No pixel talks about treatments; that rule is separate and it does not move.

The mental model

Wrong

A pretty page about the clinic.

Right

One audience, one offer, one action, every number matching the ad, a tag on submit, and events that tell you what she did.

RoleTalks to youJob
Message matchAbove the foldSame offer, same number, same words as the ad
The formTwo fieldsFirst name, phone, consent line, tag on submit
Proof and objectionsBelowReal providers, real reviews, the FAQ that pre-frames the deposit
MeasurementInvisiblePage views, a few explicit events, attribution forwarded with the lead

The build, in order

1. Write the brief before the page

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.

2. The structure, top to bottom

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.

3. The congruency rule

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.

4. Tag the lead on submit

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.

5. Capture attribution on first touch

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.

6. PostHog, configured for a medical page

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.

7. Test the whole chain

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.

8. Read it weekly

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.

One page, one week

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.

Day 1

Brief and structure

  • Four line brief
  • Offer math and the anchor price
  • Section order written before design
Done when: A stranger reading the brief knows who the page is for and what she is asked to do.
Days 2 to 3

Build and tag

  • Page built in the structure
  • Form posts to the webhook, tag lands
  • Attribution captured and forwarded
Done when: A test submit creates a tagged contact with the campaign on it.
Day 4

Measure

  • PostHog with autocapture and recording off
  • Explicit events on form, CTA, call
  • Mobile check at 375 pixels
Done when: You can see page views, form starts and submits by campaign.
Week 2 onward

One change a week

  • Read the funnel
  • Change the biggest drop
  • Keep every number matched to the ad
Done when: Conversion moved and you know which change moved it.

Operating principles

  1. One audience, one offer, one action.
  2. Every number matches the ad. Same price, same words.
  3. Concrete math in the hero, never a vague bundle.
  4. Two fields. Name and phone. Ask for more later.
  5. Tag on submit, so the follow-up knows what she asked for.
  6. Attribution rides with the lead, allowlisted.
  7. Autocapture off on a medical page. Clicked text is a treatment.
  8. No session recording where a form is typed.
  9. Nothing about a body in any event or pixel.
  10. Test the chain with a throwaway, then delete it.
  11. One change a week, one variable.

Starter prompts

Paste these as written. They are short on purpose, because the long ones drift.

The prompt: page brief and event plan

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.

The congruency check

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.

The analytics prompt

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.

Failure modes

Every one of these has happened to me or to someone I set this up for.

FailureFix
Page says $149, ad said $99One anchor price, changed the same hour as the ad
Five field formTwo fields; ask the rest on the call
Lead arrived with no tag, follow-up did not know the offerTag on submit, verified with a test contact
Autocapture on, treatment names in the analytics vendorAutocapture off, explicit events only
Session recording captured phone numbers as typedRecording off where a form exists
No idea where people leavePage view, form start, submit, by campaign
Google CDN hero image expiredSelf-host, crop, blur, overlay

The free skill

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.

How to use it: copy the whole thing, paste it into your bot (or save it as a skill file if you use Claude Code), and say “build my landing page”. It walks you through the rest. Works with any agent that can read your files.
lead-landing-page.md
---
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.

What done looks like at thirty days

Want the page, the tag and the follow-up built as one system?

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.

Pick a side.

Most people read this and forget it by Friday.

The other kind builds the thing that week. They stop needing free guides, because they are too busy running actual systems.

Free guides stay free. The room is where the builds happen.