---
name: ghl-funnel-landing-pages
description: Build GHL funnel landing pages for Rob's offers via the proven "Claude design spec → GHL funnel step" workflow. Covers GHL page-builder constraints (native Countdown is fixed-date-only, no custom JS clocks, purchase-stop = page swap not timer halt, AI Studio ≠ page builder), the match-the-live-site brand rule with CSS token extraction, honest-scarcity three-state offer pages, single-CTA scope discipline, and the free-site tripwire funnel archetype (dual CTA, file-delivery workflow, deploy-fee ladder). Trigger when Rob asks for a landing page, funnel page, or offer page built in GHL, or when converting print-flyer offers to web. Also trigger when designing a "claim your free site" funnel, a free-tripwire → paid-hosting revenue ladder, or any page with multiple offer tiers hosted in GHL.
---

# GHL Funnel Landing Pages

How Rob's landing pages get built: **Claude (or an LLM) produces a build-ready design spec → Rob builds the page inside a GHL Funnel step** using the native page builder. Proven twice: "Missed Call Diagnostic" (2026-07) and the "One Town. One Agency." page (2026-08-09). Do not reinvent this workflow — extend it.

## The workflow

1. **Write the LLM a build-spec prompt** that asks for a section-by-section blueprint (which GHL elements, in what order, with what copy and style settings) — NOT a standalone HTML app. See `references/rrr-premium-line-page-2026-08-09.md` for a full worked example of the spec shape.
2. **Rob builds in GHL:** Sites → Funnels → the funnel → the step's page builder. Native elements only: Sections/Rows/Columns, Headline, Paragraph, Button, Countdown, Form, Image, Divider, Spacer.
3. **Review the returned spec against the offer's copy rules before Rob builds** (Rob's collateral bar: verifiable claims only, banned-vocabulary lists are per-offer and live in the offer's own docs).

## GHL platform constraints (verified by reasoning through builds — treat as stable)

- **Native Countdown element = fixed date only.** It cannot be stopped or frozen by a purchase, form submit, or workflow trigger. There is no "stop the clock when someone buys" in the element itself.
- **"Clock shuts down on purchase" is achieved by page swap, not timer halt:** the countdown lives only on the UNCLAIMED page; a purchase/order-form workflow redirects to (or the operator manually publishes) a CLAIMED variant page with NO clock. Same visitor-visible effect, natively buildable.
- **GHL AI Studio ≠ the funnel page builder.** Do not paste HTML into AI Studio expecting a funnel page. Funnel landing pages are built in the funnel step's page builder; AI assist (where present) works from text descriptions, not pasted HTML.
- **Custom self-ticking JS clocks** are not speccable from a text prompt in the native builder. A standalone HTML file (custom JS) is a DIFFERENT artifact — host it outside GHL or embed via Custom Code element (not visually editable, form wiring is manual). Pick one artifact per launch; don't try to get both editable-native and custom-JS behavior on one page.
- **Native Form element** wires submissions straight to GHL contacts/workflows — this is the main reason to build native rather than embed HTML.

## The match-the-live-site brand rule (Rob's call, 2026-08-09)

Web pages under a brand must inherit the LIVE SITE's design system, even when the matching print collateral has its own palette. Print flyers can carry a vertical-native look (e.g. the bail flyers' "bail office at night" navy+amber) because they survive inkjets and live on counters; a funnel page is reached THROUGH the website and must read as the same company.

**Before speccing any page design, extract the site's real tokens from production CSS** — never guess from memory:
- Fetch the homepage HTML; if it's a JS app shell (small HTML, no inline styles), find the linked CSS bundle (`/assets/index-*.css`) and fetch that.
- Look for CSS custom properties first (`--primary`, `--gold`, `--gradient-cta` — shadcn/Tailwind sites expose the whole palette as HSL triplets like `221 83% 53%`), then `@import` Google Fonts lines and `font-family` decls.
- Convert HSL triplets to hex for the spec. Example extraction for realresultsready.com is in the reference file.
- Then hard-code those tokens into the LLM prompt's STYLE section with "MATCH THE LIVE SITE" instructions.

## Honest-scarcity offer pages (Rob's claim-discipline bar)

Rob's scarcity is REAL (one slot per town, he physically walks the towns), so the page must never fake it:
- Countdown points at a real, operator-set deadline with a comment saying never reset it. No evergreen fake timers — a repeat visitor catching a reset destroys credibility with this audience.
- Three states: UNCLAIMED (live clock) → EXPIRED (clock at zero, honest "window closed but slot still open until signed" copy, CTA stays live) → CLAIMED (frozen tombstone page, screenshot-worthy — it's the proof-of-scarcity asset that sells the NEXT town). In GHL, state flips are manual page swaps/duplicates, not auto-wired.
- "Form submit ≠ claim." If the CTA is an info form, the microcopy must say submitting doesn't lock the town — a signature/purchase does. If the CTA is a checkout, the purchase workflow drives the CLAIMED swap.

## Pitfalls

1. **Scope discipline (Rob corrected this 2026-08-09):** when the night's build is narrow, do NOT drag adjacent assets into it. He asked about a landing page; I pulled in the demo-line readiness, the junk-filter wiring, the handoff workflow — his reply: "why muddy the water." Keep the page's CTA single and the conversation on the page. Adjacent assets get flagged in one line at most, not investigated.
2. **Don't spec print-flyer design onto web pages** without checking the live site first (see brand rule). Rob caught that the original prompt had no site design input at all — the fix is the CSS token extraction, every time.
3. **Two-artifact confusion:** standalone HTML (custom JS, self-flipping states) and GHL-native build (editable, native form/countdown) are mutually exclusive per page. Present the trade-off, get Rob's pick, THEN write the prompt — don't write both and let them drift out of sync (keep one marked reference-only).
4. **Countdown timezone:** Denver is MDT (-06:00) in summer, MST (-07:00) in winter — hard-coding the wrong offset shifts the deadline an hour. Check the date's DST status when writing the deadline constant.
5. **Billing-date promises in checkout copy (burned 2026-08-10):** GHL trial products take a day COUNT only — there is no "bill on the 1st of the month" calendar anchor. So footer copy like "your first $497 bills on the 1st of next month" cannot be honored for every signup date (22 days from Aug 10 = Sept 1, but from Aug 20 = Sept 11). When the copy promises a calendar date and the product can only do day counts, change the COPY to match the product ("your first $497 bills in 22 days") — don't contort the product. Audit every billing-date claim in checkout/footer copy against what the trial field can actually express. Same class of check as the price-matches-copy audit (a "$479 Physical" product under "$497/mo" copy).
6. **Editor canvas lies about order-form products (2026-08-10):** after attaching a product at the funnel-step level, the page-editor canvas can keep showing the "Dynamic Item $99" placeholder indefinitely — even after save + refresh. The truth check is the PUBLISHED page: Publishing tab → publish → open the URL (incognito). Editor preview 404s until first publish (no route exists). Publishing an unknown URL is safe verification; unpublish anytime. Don't debug "the form still shows Dynamic Item" in the editor — publish and look.
7. **Checkout-form sub-headline audit:** GHL's order-form default copy includes an "Upgrade Your Order & Save!" sub-headline — a false promise when no upgrade/order-bump exists (Rob's claim bar). Blank it on every build. Also blank "Shipping & Your Info" → "Your Info" when shipping fields are hidden (digital product).
8. **Native order form = fixed field set, NO custom fields (verified 2026-08-10):** the One Step Order element exposes only Full Name / Email / Phone / Company Name toggles. Custom fields (e.g. a Town dropdown) cannot be added — not in element settings, not anywhere; the builder AI confirms the same limit. Workaround for launch: toggle ON "Company Name", mark Mandatory, and RELABEL it — the label/placeholder text boxes sit to the RIGHT of the "Company Name" / "Company Name.." rows in Form Options (editable even when it looks like static text). Proper fix later: two-step flow — native Form page (supports custom fields) → order-form page.
9. **Products attach at the FUNNEL-STEP level, not in the page editor:** funnel step view → step → Products tab → Add Product. The page editor has no product picker anywhere (checked element settings, page settings, top toolbar). "Main Product Options" in the element settings is a dead end — no selector inside.
10. **Button scroll-to-section: SOLVED 2026-08-10.** Use Button Actions → "Scroll to element" (built-in action) — sections don't reliably expose a CSS ID field (General/Styles/Animations tabs only; "Element name" is an internal label, not an ID). The failure mode seen live: the setting sticks in the editor (shows "Scroll to Element" + target pill) but the LIVE page doesn't scroll. Root cause = **editor saves don't push live** — after saving you MUST republish (funnel step → Publishing tab) and hard-refresh the test window (Ctrl+Shift+R — cached JS serves the old button behavior). Verify sequence: editor shows the setting → republish → fresh incognito → click.
11. **GHL trial = day count only, part 2:** when the buyer-facing copy wants "1st of next month" simplicity but the product can't anchor, the honest phrasing that keeps it simple AND accurate: "Your first $497 bills after your 22-day trial." Rob prefers calendar-simple language — offer that phrasing instead of "bills in 22 days" when he pushes back. (Shipped 2026-08-10 as "bills after your 22-day trial".)
12. **Rob's direction-style bar for click-path walkthroughs (his words: "you need to be better giving direction...section, field, etc"):** name the EXACT UI object at every step — sidebar item → screen → tab → section → row label → which side the text box is on. Never say "find the product selector" — say "funnel step view → Products tab → + Add Product." When he reports what he sees ("Object and folder name"), answer with just those values (Object → Contact, Folder → General Details), nothing else.
13. **No test-mode toggle at funnel level (2026-08-10):** the funnel's "Payments & checkout → Payment mode" toggle is a label — the order form kept charging against LIVE Stripe keys in "test" (a 4242 test card got declined as live-mode). Both live AND test Stripe modes can be connected simultaneously (Payments → Integrations shows both checkmarks). Reliable end-to-end test path: leave Live ON, run a REAL card with the $0-trial product, verify the confirmation page, then IMMEDIATELY cancel the subscription (Payments → Subscriptions). $0 today = zero financial risk; the only risk is forgetting the cancel — tell Rob to set a phone reminder BEFORE he clicks buy.
14. **Onboarding-email workflow recipe (shipped 2026-08-10):** Automation → Workflows (main left sidebar — Rob navigates to Sites/Funnels first; correct him) → Create from scratch → Trigger: "Order form submission" + filter "In funnel/website" = the funnel → Action 1: Send Email → Action 2: "Add Contact Tag" as a SEPARATE canvas action (the tag field inside email settings is interaction-based — opens/clicks — not a purchase tag; don't use it). Test emails show placeholder names ("Guest Visitor 004") because no real contact is attached — NOT a merge-field bug; warn Rob before he sends the test so he doesn't think {{contact.first_name}} broke. Merge fields: use the editor's {{ }} picker, never hand-type the syntax.
15. **Confirmation page promise-loop:** the confirmation page copy promises "check your email" — so the onboarding-email workflow is a shipped-commitment dependency, not optional polish. Build page + email workflow in the same session, or the first real buyer hits a broken promise. Also: any "second email within one business day" the onboarding email promises is a MANUAL send until the onboarding form exists — flag that explicitly.
16. **CLAIMED-page mechanics (built 2026-08-10):** separate funnel step (e.g. /bail-bonds-claimed), headline "This Town Is Claimed." + CTA = email/call Rob (human filter for redirecting demand to open towns — no checkout on it). Flip when a town sells: (A) swap step paths so the public URL serves CLAIMED, or (B) faster — Landing Page settings → redirect to the claimed path. Countdown expiry: countdown element → expire action → redirect URL = the CLAIMED step URL. Rob's reopen play when the timer expires with no sale: flip the page back + reset the timer manually (30s), and the prospect story is the TRUE one — "the charter window closed, but I can reopen it for you — one-time extension" — NOT an invented cancelled buyer (two bondsmen comparing notes in one small town kills the fake version).
17. **AI builder wipes sections on large prompts (2026-08-10):** a big multi-part prompt ground the builder to a halt and deleted half the page. One small atomic section per AI prompt, Save before EVERY prompt, close the panel and edit manually for anything structural. Full failure modes + the curl-based outside-in verification recipe (page 200s, content grep, `expireAction` check, test-card/live-card purchase procedure) live in `ghl-order-form-quirks` — load it for any order-form or publish-verify work.
18. **Custom-field capture is deferrable at launch (Rob's call 2026-08-10):** when page context already implies the value (town-specific page → town), skip the Town-dropdown workaround entirely and capture it in onboarding. Don't push the two-step flow when it adds checkout friction for information the buyer obviously already has.

## Free-Site Tripwire Funnel Archetype

When the offer is a free one-page site with paid deploy/hosting upsells, use this structure:

**Page structure:**
1. Hero: headline + subhead + two CTAs stacked vertically
2. Trust strip: "No credit card required for free option | Cancel hosting anytime | Site is yours to keep"
3. Three-tier option cards: Free (download), Hosted ($67/mo), Chatbot upgrade ($127/mo)

**CTA wiring:**
- "Send me the free site files" → GHL native Form (captures name, phone, email, business name, service, town) → tag `free-site-download` → workflow emails zip file
- "Host it for me — $67/mo" → GHL Order Form with $67/mo subscription product → tag `hosting-client` → workflow triggers deployment

**Workflow sequence:**
- Free path: form submit → immediate email with zip + deploy pitch ($200 flat) → 3-day follow-up with domain offer → 7-day social proof
- Paid path: purchase → deployment notification to you → 24-hr "your site is live" email → 14-day chatbot upsell email

**Copy rules for this archetype:**
- Lead with the free deliverable, not the price
- "Flat $200" and "pass domain cost through at no markup" are trust signals — include them verbatim
- The site template itself is the proof of work; the funnel's job is just to get the contact

## References

- `references/rrr-premium-line-page-2026-08-09.md` — the "One Town. One Agency." page: RRR site brand tokens (extracted), offer terms, verticals/towns lists, the two prompt files' locations, GHL constraint notes, and the open checkout-vs-form decision.
