🐇 Rabbithole ← All lessons Work with us →
Lead Catcher Day 4 of 30   01 / 06
Learn by clicking · ~12 min

Lead Catcher

A new lead comes in — your bot replies in seconds, qualifies them, logs it, and pings you. The whole point is simple: be the one who answers first.

New lead
web form · email · DM
webhook
Claude reads it
drafts a reply · scores hot/warm/cold · explains why
then
Log + ping
your own sheet · a ping to you
🛠️ Home services — plumbing, HVAC, roofing 🏠 Real estate 🛡️ Insurance 🚗 Auto 📣 Agencies — marketing & recruiting

Most leads go cold because nobody got back to them fast enough. When you respond in seconds instead of hours, you're the one who answers first — and the one who answers first usually wins the job. This kit is industry-agnostic; it just pays off fastest for the businesses above. You'll watch it work in a second — nothing you type here is sent or saved.

02 / 06 · The one connection

One webhook. Every lead source.

You don't wire up five different inboxes. Every lead source points at a single web address your catcher listens on — that address is the webhook.

What's happening: A "webhook" is just a URL that something calls the instant an event happens. When a visitor submits your contact form, your form provider POSTs the details to your catcher's URL — and the catcher wakes up. Your form, your email-to-webhook service, or a DM forwarder all aim at the same spot.

In the free kit, that endpoint is a tiny Node server (src/server.js, built on Node's own http — no heavy framework). It exposes two routes:

  • POST /lead — a new lead arrives here. This is the URL you point your form at.
  • GET /health — a heartbeat so you can check it's alive.

Point a web form, an email-to-webhook rule (a Zapier/Make catch hook or a forwarding rule), or a DM forwarder at POST /lead and you're catching leads.

No new account for your data: the catcher runs on your machine, with your API key. The lead never travels to Rabbithole — it goes straight from your form to your catcher to your own sheet.
03 / 06 · Live dry-run

Paste a lead. Watch it get handled.

This is the heart of it. Drop in a lead message and run it. You'll see the score, the reason, the drafted reply, the exact row it would write to your sheet, and the ping it would send you — all in your browser. It sends nothing and charges nothing.

What's happening: In the real kit, the lead goes to Claude in one structured call that returns a reply, a score, and a plain-English reason together. This page can't call Claude (no key, no charge), so it runs a small look-alike scorer right here so you can feel the shape of the output. The real brain is smarter — this is the live preview.
Try one:
Nothing is sent. Nothing is charged. This is a dry-run.
04 / 06 · The speed tradeoff

Instant reply, or draft first? You choose.

The first reply is the only action this kit can fire on its own — because speed is the entire point. Everything else just logs and pings. Here's the one honest decision, and the switch that controls it.

Auto-reply is OFF — draft first (default)

The reply is drafted and shown to you for approval. Nothing goes out until you say so. You trade a little speed for full control.

ModeWhat happensThe tradeoff
Draft first
AUTO_REPLY=false
(default)
The reply is drafted and shown to you. It is not sent until you approve it. Full control — you read every reply before it goes. You lose a little speed.
Auto
AUTO_REPLY=true
The reply is sent the instant the lead arrives — you're the one who answers first. Maximum conversion. Small risk: an occasional off reply goes out unreviewed.

It ships draft-first on purpose. When you trust the drafts, you flip exactly one line in your .env:

AUTO_REPLY=true
There's a safety net even then: with auto-reply on, the default REPLY_TRANSPORT=log still sends nothing — it prints exactly what it would have sent. Turn the switch on, watch it behave for a day, then wire a real email/SMS transport once you'd have hit "send" every time anyway. The honest recommendation: run draft-first for a few days first.

Logging to your sheet/CRM and pinging you are always informational — they never contact a customer. And there's no charging anywhere in this kit: money is never moved.

05 / 06 · Build it yourself

Catch real leads in four commands.

The free kit is a real, runnable, MIT-licensed project — its own repo, its own package.json, README, and sample leads. It runs on your machine with your API key. Your lead data goes to your own CSV or Google Sheet, never to us.

Quickstart

git clone https://github.com/0xJRP/lead-catcher-kit.git
cd lead-catcher-kit
npm install
npm run setup     # interactive wizard — writes your .env
npm run dryrun    # full pipeline on 3 sample leads. Sends nothing. Charges nothing.

The dry-run calls Claude for real (so you'll need an API key) and runs three sample leads — a storm-damage emergency, a plan-ahead replacement, and a low-intent DM — so you can watch the scoring and the drafted replies. Every write and send path is forced off. When you're happy, npm start launches the live webhook server.

What the wizard sets up

  • Your Claude API key & model — defaults to claude-opus-4-8 (smartest). For high-volume, set ANTHROPIC_MODEL=claude-haiku-4-5 — cheaper and faster.
  • The lead source / webhook — the port and an optional shared secret.
  • Where lead data lands — a local CSV (zero setup, the default) or your own Google Sheet. Your data, your file.
  • How you get pingedconsole, Telegram, or Slack.
  • The auto-reply switch — left off, exactly like Step 4.
Under the hood: src/server.js catches the lead, src/lead.js normalizes it, and src/pipeline.js runs the Claude brain (src/brain/index.js) — one structured call via the official @anthropic-ai/sdk that returns a validated reply + score + reason. Then src/destinations/index.js logs the row and src/channels/notify.js pings you. It's explainable by design — the score always comes with a one-sentence reason you can audit.

→ Get the free Lead Catcher kit on GitHub  ·  new to this? Start with what an MCP is or build your AI secretary.

06 / 06 · Go live for real

You just built a first responder.

You've seen a lead get scored, a reply drafted, a row logged, and a ping fired — without sending a thing. The free kit gets you running today. When you want it production-grade, that's what we do.

We'll connect it to the tools you actually run on.

We wire it into your real CRM, your forms, and your phone system, route each lead by territory or rep, add SMS, and put guardrails on the whole thing — production-ready, end to end.

Keep going: next up in the series, the Job Quote & Invoice Bot turns a hot lead into a priced quote. Or revisit your AI secretary to book the call this lead just asked for.

Built by rabbithole.consulting — custom-built infrastructure that runs your business. Runs entirely on your computer · Free under MIT · Day 4 of 30.