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.
— Josh ```
The 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.
Want the full guide? Check out our deep-dive page for more context, FAQs, and resources.
read the full guide