We Built a PLG Engine That Turns AI-Generated Websites Into Leads
TL;DR: We build websites for businesses before they pay. A “claim bar” on free-tier sites captures emails. Immediate + 3-day follow-up emails create urgency with a 30-day expiration. Server-side conversation debouncing catches abandoned onboarding chats. And an AI-powered chatbot lets our admin team query event logs in natural language. This is our full PLG stack.
The Model: Build First, Sell Second
Most website builders follow the same flow: sign up → pick a template → customize → pay → publish. The user does work before they see value.
We flip it. Our AI generates a complete website from a single sentence—research, content, design, SEO, domain—before the user pays anything. The site goes live on a preview URL. Google starts indexing it. Visitors can see it.
Now we have leverage. The user has a website that’s already live, already indexed, already accumulating SEO momentum. Walking away means losing all of that.
The question is: how do you convert that leverage into revenue?
Layer 1: The Claim Bar
Every free-tier website displays a subtle footer bar: “This could be your website. Make it yours.” with a “Make It Mine” button.
The State Machine
Bar visible → User clicks "Make It Mine" → Email form appears →
User submits email → "We'll be in touch!" confirmation
The bar only appears on:
- Free-tier websites (not paid subscribers)
- Non-sample/non-featured sites
- Direct visits (not iframes, not editor mode, not search bots)
Tracked Events
Every state transition is an event:
| Event | What It Means |
|---|---|
visitor.claim_bar_shown |
Bar rendered (visitor saw the CTA) |
visitor.claim_bar_clicked |
User engaged (clicked “Make It Mine”) |
visitor.claim_email_form_shown |
Email form displayed (high intent) |
visitor.claim_lead_captured |
Email submitted (lead acquired) |
This gives us a classic funnel: impressions → clicks → form views → captures. We measure drop-off at each stage.
Layer 2: The Email Sequence
When someone submits their email, two things happen immediately:
Email 1: Welcome (Instant)
Subject: "{businessName} — your site is live"
Your site is live and showing up in search results.
Built using publicly available info about your business.
- Your own URL
- Full editing access
- SEO optimized
- Customer leads
Starts at $19/mo. Takes 60 seconds.
Expires {deadlineDate} — Google ranking goes with it.
[Claim your site →]
Key decisions:
- Urgency: 30-day expiration. The site and its Google ranking disappear if unclaimed.
- Value framing: “Your site is already live.” Not “sign up to build a site.”
- Low friction: “$19/mo, takes 60 seconds.” Remove objections before they form.
Email 2: Follow-Up (3 Days Later)
Subject: "{businessName} — still unclaimed"
Your site is still live and unclaimed.
Getting traffic and building Google ranking.
That momentum disappears if no one claims it.
{daysLeft} days left.
[Claim it now →]
The follow-up is queued by an email scheduling service with timezone-aware timing. We extract the business’s state from their address and schedule delivery during business hours in their timezone.
Deduplication
The API checks for existing queued emails before sending. Same email + same business = no duplicate sends. The response always returns success to avoid leaking internal state.
Layer 3: Abandoned Conversation Tracking
Not everyone who starts the onboarding chat finishes it. Some get distracted. Some aren’t sure. Some hit a confusing step.
We built server-side debounce timers for two conversation flows:
Chatbot Widget Conversations
When a visitor chats with the AI chatbot on a generated website:
- Timer starts on every message
- Timer resets on each new message
- After 5 minutes idle: Admin gets the full transcript via email
This tells us: what are visitors asking? Where do they get stuck? What questions does the chatbot fail to answer?
Create-Website Conversations
When a user starts building a website but doesn’t click “Build”:
- Timer starts on every message in the onboarding chat
- Timer resets on each new message
- After 10 minutes idle: Admin gets an “abandoned conversation” email
// Server-side debounce — in-memory, resets per message
scheduleCreateConversationEmail(
key, // clientIp:businessName (dedup key)
businessName,
conversationHistory
);
Why server-side? Client-side timers die when users close the tab—which is exactly when abandonment happens. Server-side timers survive tab closure.
Trade-off: In-memory timers don’t survive server restarts. We accept this. Losing a few notifications during deploys is better than adding Redis/DynamoDB complexity for a notification system.
Layer 4: The Events Chatbot
Every user action—claim bar clicks, email captures, chatbot conversations, build starts, errors—is logged to a DynamoDB events table. That’s thousands of events per day.
Reading raw event logs is painful. So we built an AI-powered chatbot that lets admins query events in natural language.
How It Works
- Admin selects a time range (1h, 3h, Today, 7d)
- Frontend fetches events and compresses them into a structured summary:
[2026-03-07 14:23:15] visitor.claim_lead_captured biz=joes-pizza {email="joe@..."}
[2026-03-07 14:24:22] chat.error [FAILED] error=TIMEOUT {businessName="Acme Corp"}
- Admin asks a question: “Any error patterns today?”
- Claude Sonnet analyzes the events context and responds with a structured answer
Example Queries
- “Summarize today’s activity”
- “Which businesses had failed builds?”
- “Show me the claim funnel conversion rate this week”
- “Any chatbot conversations that went badly?”
- “Which referrers drove the most traffic?”
The chatbot knows WebZum’s event schema, understands our funnel stages, and can calculate metrics on the fly. It’s faster than writing DynamoDB queries and more flexible than a fixed dashboard.
Context Truncation
Events data can be massive. We cap at 120k characters (~30k tokens) and track token usage per message so we know when we’re approaching limits.
The Full Loop
Business discovered (web search, directory, referral)
↓
AI generates website (preview, free tier)
↓
Google indexes site → organic traffic arrives
↓
Visitor sees claim bar → clicks "Make It Mine"
↓
Email captured → welcome email (30-day deadline)
↓
3-day follow-up email → urgency builds
↓
User claims site → paid subscription
↓
Events tracked → admin chatbot analyzes patterns
↓
Insights → improve claim bar, emails, onboarding
Every stage feeds data back into the system. Abandoned conversations tell us where onboarding fails. Claim funnel metrics tell us where the CTA underperforms. The events chatbot surfaces patterns we’d miss in raw logs.
What We Learned
-
“Your site is already live” is the strongest CTA we’ve ever used. It’s not hypothetical. The user can see it. Google can see it. Visitors can see it. Walking away means losing something real.
-
Server-side debouncing is underrated. Every abandoned conversation is a learning opportunity. Client-side timers miss the most important case: when users leave.
-
AI-on-AI analytics works. Using Claude to analyze event logs from AI-generated websites feels recursive, but it’s genuinely useful. Natural language queries are faster than SQL for exploratory analysis.
-
30-day deadlines convert. The expiration isn’t artificial—we actually take down unclaimed preview sites. Real scarcity drives real urgency.
-
Track the full funnel, not just conversions. Knowing that 80% of claim bar viewers click but only 30% submit email tells us the form is the bottleneck, not the CTA.
What’s Next
- Personalized follow-ups: The 3-day email is generic. It should reference the specific traffic and rankings the site has accumulated.
- Re-engagement sequences: After 30 days, the site goes down. A “we rebuilt your site” email 60 days later could recapture churned leads.
- Automated claim bar A/B testing: Test different CTAs, colors, and copy per business type.
Try It
Search for any local business on WebZum. If we’ve built a preview site for them, you’ll see the claim bar in action. If you’re a business owner, type your business name and watch the AI build your site in 5 minutes. It goes live immediately—no credit card required.