Twenty One Media
automationMay 6, 2026

We Built Our Own Inbound Lead Funnel in an Afternoon

We needed inbound leads from our own site, not just referrals and outbound. So we built it: a landing page at /ai, a lead form, a capture API, and a downstream automation that logs the lead, delivers the PDF, and pings us in Slack. The whole thing took an afternoon.

Here's exactly how it works.

The page

The /ai route is a dedicated landing page. The headline is blunt: "5 AI workflows making thousands for other businesses. None of them are yours yet." Below that, five numbered workflows with specific outcomes: the cold email engine that books 5-10 sales calls a week, the content machine that turns one video into thirty pieces across every platform, the proposal draft that lands in your inbox before competitors have typed a sentence.

Every workflow has a real number attached. That's intentional. Vague promises don't convert. "Save time" doesn't convert. "$40k of stale invoices recovered in a weekend" converts.

The form asks for name and email. That's it. One action, one click, deliver the guide.

The API

The form posts to /api/lead-capture, a Next.js route handler. Its job is narrow: validate the input, then forward to n8n.

const forwardPayload = {
  email,
  name,
  source: body.source ?? "direct",
  path: body.path ?? "/ai",
  submitted_at: body.submitted_at ?? new Date().toISOString(),
  lead_magnet: "5-ai-automations-v1",
};

await fetch(process.env.LEAD_CAPTURE_WEBHOOK_URL, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify(forwardPayload),
});

The client sends source (the referrer, or "direct") and path so we know where the lead came from. We tag every submission with a lead_magnet version string. When we update the PDF, we bump the version. Airtable keeps a clean record of which leads got which version.

The API does zero downstream work itself. If we want to add a drip sequence, a CRM sync, or a webhook to a different tool, we touch n8n, not the Next.js route. The API stays thin on purpose.

The n8n workflow

One webhook trigger, three branches.

First: Airtable. Name, email, source, path, submitted_at, lead_magnet version, all logged to a "Leads" base. We can sort, filter, and follow up from there without touching the code.

Second: Gmail. A templated email goes out immediately with the PDF attached. Not a link to the PDF, the actual file. Fewer clicks between the lead and the thing they asked for.

Third: Slack. A message drops into our leads channel with the name, email, and source. We see every submission in real time and can respond the same day.

The whole chain runs in under two seconds.

Why not a form tool

We looked at Typeform, ConvertKit, and a few others. Every one of them requires their embed script, their branding (unless you pay more), and their routing logic. We'd still need n8n for Airtable and Slack anyway.

Building our own route took less time than setting up the integrations. We own the payload shape, the validation, and the error messages. If something breaks, we know exactly where to look.

The PDF lives at /downloads/5-ai-automations.pdf and is served statically. No presigned URLs, no CDN gymnastics. It's a file.

The result

The funnel is live. Leads come in, the PDF goes out, Slack pings us, Airtable grows. The page converts because the copy is specific and the offer is immediate. The backend is boring, which is exactly how it should be.

If you want to see the page, it's at twenty1-media.com/ai.