TLDR: I built a lead gate for a cancer clinic finder that turned the AI into a bouncer. 71% of users hit one sentence and left. The fix was three words: lead with value.

The Setup

I've been building a cancer education business — a chat-first app that helps patients find cancer treatment centers and book consultations.

The business model is simple: clinic gets a lead, clinic pays. So naturally I built a lead gate.

The AI would chat with you — but the moment you asked anything useful, it would say: "Once you share your details below, I can help you book a consultation."

Seemed reasonable. Classic email-wall logic.

I was wrong.

The Numbers Were Brutal

291 conversations in the first real-traffic window.

207 of them — 71% — hit that one sentence and left.

9 leads. 3 consultations.

I stared at those numbers for a long time.

What I Diagnosed First (And Got Wrong)

I ran a browser-test subagent to observe the funnel.

It came back with a clear finding: "Message textbox and 'Send message' button are disabled while the form is pending — expected behavior (AI is gated behind lead capture)."

So my first instinct was to unlock the chat input. The form was blocking the chat. Obvious fix, right?

Except… I went back and read src/app/page.tsx.

The input is only disabled={isLoading} — disabled while the AI is mid-stream. Not because of the form. Never because of the form.

The agent had seen the form rendering at the same moment the AI was still streaming, noticed the input was disabled, and connected those two dots into a conclusion that wasn't true.

If I'd shipped the "unlock the chat" change, it would've been a complete no-op. A phantom fix for a phantom problem.

The real wall wasn't in the code at all. It was in the system prompt.

The Actual Problem

The leadGate block I'd written told the AI:

  • You MUST NOT share contact info
  • Reference the form: "Once you share your details below, I can help you book a consultation."
  • 2-3 sentence cap, then stop

The AI was doing exactly what I told it to do.

I had written a bouncer. Then I was surprised people bounced.

The chat input was never locked. Users weren't stuck — they were told to go fill a form before the AI would help them. So they left.

The Fix

One commit. One prompt rewrite. Three rules that changed everything:

  1. Lead with value. First response: 2-3 specific, useful things. Facility names, treatments, what patients love about them.
  2. Never mention the form. Let it stand on its own. The AI's job is to be helpful, not to usher people toward a field.
  3. Soft offer, not a gate. "Happy to help connect you whenever you're ready." Not: "Fill this out first."

The data TakeShape (the GraphQL CMS) was serving still gatekept contact info server-side — phone numbers, websites, booking links stripped from the prompt until a lead exists. Defense in depth, still intact. But the experience went from interrogation to conversation.

Why This Actually Matters

These are cancer patients.

They're scared. They're looking for a reason to trust you, not a form to fill out before you'll talk to them.

Every one of those 207 bounces was a real person who didn't get connected to a treatment center.

I keep thinking about that.

The lesson for any builder doing AI + lead capture: the form is not the gate. Your prompt is. If your AI is trained to withhold value until a user performs some action, you haven't built a helpful product — you've built a very polite wall.

Lead with value. The form takes care of itself.

P.S. The subagent misdiagnosis was a good reminder: a symptom an agent observes is not a diagnosis of the cause. Always check the source before you ship the fix.