Build a Lead-Qualification Webhook in 30 Minutes
Inbound form fires. Lead gets scored. Sales gets a Slack ping with the score and a one-paragraph summary. Cold leads get an auto-decline. Build the whole thing today.
The build: a webhook endpoint that receives lead form submissions, scores the lead with AI, routes hot leads to Slack with summary, and sends an auto-decline to cold leads.
Total time: 30 minutes.
What you'll need
- Any form tool that can POST to a webhook (Tally, Typeform, custom form)
- n8n (or Make / Zapier)
- Slack workspace
- Email sending tool (Resend, Postmark, or Gmail API)
- AI API key
Step 1: Webhook trigger (3 min)
In n8n, create a Webhook trigger node. Copy the production URL. Use it as the webhook URL in your form tool.
Submit a test form to verify the payload comes through.
Step 2: AI scoring (10 min)
Add an AI node after the webhook. Prompt:
You are scoring an inbound sales lead.
Lead's form submission:
- Name: {{ $json.name }}
- Company: {{ $json.company }}
- Role: {{ $json.role }}
- Message: {{ $json.message }}
- Budget hint: {{ $json.budget_hint }}
Score on:
- Fit (1-5): does their problem match what we sell? Our services: {YOUR_SERVICES}
- Authority (1-5): does their role suggest decision power?
- Specificity (1-5): is their message specific or generic?
- Urgency (1-5): do they signal a timeline or pressure?
Disqualifiers (if any present, set fit to 0):
- Company size below {MIN_SIZE}
- Industry not in: {INDUSTRIES_LIST}
- Asking for something outside our scope
Return JSON:
{
"total_score": <0-20>,
"fit": <0-5>,
"authority": <1-5>,
"specificity": <1-5>,
"urgency": <1-5>,
"disqualifier": <string or null>,
"summary": "<one paragraph, max 60 words>",
"recommended_priority": <"hot" / "warm" / "cold" / "decline">,
"specific_question_to_ask": "<one question to advance discovery>"
}Step 3: Branch by priority (3 min)
Add a Switch node. Branches:
- "hot" → Slack + CRM create
- "warm" → CRM create, no Slack ping
- "cold" → CRM create with cold tag, no Slack ping
- "decline" → Auto-decline email + CRM with declined tag
Step 4: Slack ping for hot leads (5 min)
Add a Slack node on the hot branch. Channel: #sales-inbox.
Message:
:fire: *Hot lead: {{ name }} from {{ company }}*
Score: {{ total_score }}/20
{{ summary }}
Suggested next question: _{{ specific_question_to_ask }}_
<{{ crm_link }}|Open in CRM>Step 5: Auto-decline for "decline" leads (5 min)
Add an email node on the decline branch. Template:
Hi {{ name }},
Thanks for reaching out about {{ their_topic }}.
I'm not the right fit for this specific need. We focus on {YOUR_FOCUS}, and what you're describing is better served by {ALTERNATIVE}.
A few firms I'd actually recommend:
- {REFERRAL_1}
- {REFERRAL_2}
- {REFERRAL_3}
Good luck with the project.
— JoshThe personalization is key. Cold, generic auto-declines hurt your brand. Specific, helpful auto-declines build it.
Step 6: Test (4 min)
Submit four test forms covering each priority level. Verify:
- Hot → Slack ping
- Warm → CRM entry only
- Cold → CRM entry with cold tag
- Decline → polite auto-decline email
What I do with this
Every inbound lead gets triaged within 30 seconds of submission. Hot leads hit my Slack while the prospect is still on the form page. I can reply within 2-3 minutes if I want, which is the highest-converting response time in B2B.
Cold leads still get a respectful auto-decline. They walk away thinking well of us. Some come back later.
What to add next
- A 24-hour follow-up sequence for warm leads who don't get a sales reply
- Industry-specific scoring (different criteria for wealth, legal, CPA, etc.)
- Auto-book a calendar slot for hot leads (Cal.com link in the Slack ping)
- A weekly digest of all leads scored, with breakdown
Ship the basic version. Iterate.
Get the next one.
Field notes from real deployments, written the way this one was. No schedule promised and nothing sold to you. Unsubscribe whenever.