If your business has a contact form, you're probably losing leads every day.
Not because people don't fill it out â they do. But because follow-up is slow, hot prospects go cold while you're manually copy-pasting data into spreadsheets, and you have no way to know which leads are worth calling back today.
Here's a 7-node n8n workflow that fixes all three problems automatically:
- Captures every form submission via webhook
- Scores each lead (HIGH / MEDIUM / LOW) based on their data
- Logs everything to a Google Sheets CRM
- Sends a personalized welcome email to the lead instantly
- Pings your Slack (or email) immediately when a HIGH priority lead comes in
Zero manual data entry. Zero cold leads slipping through. Runs 24/7.
What the workflow does
Node 1 â Webhook trigger
Your form submits a POST request to an n8n webhook URL. Works with any form builder: Typeform, Gravity Forms, Webflow forms, a custom HTML form, or even a Zapier/Make zap sending data over.
Node 2 â Extract and score the lead
A Code node parses and normalizes the incoming data (handles name, full_name, email, phone, company, utm_source, message â whatever your form sends). Then it scores the lead:
| Signal | Points |
|---|---|
| Has a company name | +20 |
| Provided phone number | +15 |
| Message longer than 50 chars | +15 |
| Message contains "budget", "enterprise", "urgent", "team", "employees" | +30 |
Score 50+ = HIGH. Score 25+ = MEDIUM. Below 25 = LOW.
Node 3 â Google Sheets CRM
Appends the lead (name, email, company, score, priority, source, message, timestamp) to a "Leads" sheet. You now have a full CRM with zero extra tools or subscriptions.
Node 4 â Welcome email
Sends a personalized HTML email to the lead immediately. Uses their first name, references their message if they left one. Turns a cold form submit into a warm conversation opener.
Node 5 â Priority check (IF node)
Routes HIGH priority leads differently from medium/low.
Node 6 â Slack alert (HIGH priority only)
Posts to #sales-alerts with full lead details: name, email, company, score, message. Your sales team sees it instantly.
Node 7 â Webhook response
Returns { "success": true } to the form so it can show a thank-you message.
Setup (10 minutes)
- Import the JSON into n8n (New Workflow, Import from clipboard)
- Create a Google Sheet with a tab called "Leads" â the node will auto-create columns
- Connect your Google account in the Sheets node credentials
- Set up Gmail or SMTP in the Email Send node
- Connect Slack in the Slack node (or swap for an email node)
- Copy the webhook URL from Node 1 and add it as your form POST endpoint
- Activate â you're live
Full workflow JSON
{
"name": "Lead Capture to CRM",
"nodes": [
{"parameters":{"httpMethod":"POST","path":"lead-capture","responseMode":"responseNode","options":{}},"id":"l1","name":"Webhook - New Lead","type":"n8n-nodes-base.webhook","typeVersion":2,"position":[240,300],"webhookId":"lead-capture-webhook"},
{"parameters":{"jsCode":"const data = $input.first().json;\nconst lead = {\n name: data.name || data.full_name || 'Unknown',\n email: (data.email || '').toLowerCase().trim(),\n phone: data.phone || data.telephone || '',\n company: data.company || data.organization || '',\n source: data.source || data.utm_source || 'website',\n message: data.message || data.notes || '',\n score: 0,\n created_at: new Date().toISOString()\n};\nif (lead.company) lead.score += 20;\nif (lead.phone) lead.score += 15;\nif (lead.message && lead.message.length > 50) lead.score += 15;\nconst kw = ['budget','enterprise','urgent','asap','team','employees'];\nif (kw.some(k => lead.message.toLowerCase().includes(k))) lead.score += 30;\nlead.priority = lead.score >= 50 ? 'HIGH' : lead.score >= 25 ? 'MEDIUM' : 'LOW';\nreturn [{ json: lead }];"},"id":"l2","name":"Extract & Score Lead","type":"n8n-nodes-base.code","typeVersion":2,"position":[480,300]},
{"parameters":{"operation":"append","documentId":{"__rl":true,"value":"YOUR_GOOGLE_SHEET_ID","mode":"id"},"sheetName":{"__rl":true,"value":"Leads","mode":"name"},"columns":{"mappingMode":"autoMapInputData","value":{},"matchingColumns":[],"schema":[]},"options":{}},"id":"l3","name":"Add to Google Sheets CRM","type":"n8n-nodes-base.googleSheets","typeVersion":4,"position":[720,200]},
{"parameters":{"fromEmail":"hello@yourcompany.com","toEmail":"={{ $json.email }}","subject":"Thanks for reaching out!","emailType":"html","message":"<h2>Thanks for getting in touch!</h2><p>We received your message and will reply within 24 hours.</p>"},"id":"l4","name":"Send Welcome Email","type":"n8n-nodes-base.emailSend","typeVersion":2,"position":[720,400]},
{"parameters":{"conditions":{"conditions":[{"id":"c1","leftValue":"={{ $json.priority }}","rightValue":"HIGH","operator":{"type":"string","operation":"equals"}}],"combinator":"and"},"options":{}},"id":"l5","name":"Is High Priority?","type":"n8n-nodes-base.if","typeVersion":2,"position":[960,300]},
{"parameters":{"authentication":"oAuth2","channel":"#sales-alerts","text":"HIGH PRIORITY LEAD\nName: {{ $json.name }}\nEmail: {{ $json.email }}\nCompany: {{ $json.company }}\nScore: {{ $json.score }}/80","otherOptions":{}},"id":"l6","name":"Slack - Alert Sales Team","type":"n8n-nodes-base.slack","typeVersion":2.2,"position":[1200,200]},
{"parameters":{"respondWith":"json","responseBody":"={ \"success\": true }"},"id":"l7","name":"Respond to Webhook","type":"n8n-nodes-base.respondToWebhook","typeVersion":1,"position":[1200,400]}
],
"connections": {
"Webhook - New Lead":{"main":[[{"node":"Extract & Score Lead","type":"main","index":0}]]},
"Extract & Score Lead":{"main":[[{"node":"Add to Google Sheets CRM","type":"main","index":0},{"node":"Send Welcome Email","type":"main","index":0}]]},
"Add to Google Sheets CRM":{"main":[[{"node":"Is High Priority?","type":"main","index":0}]]},
"Is High Priority?":{"main":[[{"node":"Slack - Alert Sales Team","type":"main","index":0}],[{"node":"Respond to Webhook","type":"main","index":0}]]},
"Slack - Alert Sales Team":{"main":[[{"node":"Respond to Webhook","type":"main","index":0}]]}
},
"settings":{"executionOrder":"v1"},
"tags":["lead generation","crm","sales","automation"]
}
Pro tips
Swap Slack for email if you don't use Slack
Replace Node 6 with a second Email Send node. Same logic, different transport.
Add HubSpot, Pipedrive, or Airtable
Replace Node 3 with the HubSpot or Pipedrive node. Google Sheets is the zero-cost option; real CRMs need an API key but are just a credential swap.
Multi-step scoring
Add company size, industry, or job title to your form and extend the Code node scoring logic. Or fetch enriched data from Clearbit via HTTP Request.
Daily digest instead of per-lead Slack
If lead volume is high, swap the Slack node for a Schedule Trigger that aggregates HIGH priority leads from the sheet each morning and sends one digest email.
Connect to your booking tool
Add a Calendly or Cal.com step after scoring HIGH leads â they get a direct booking link instead of a generic "we'll reply in 24h."
Get the full template bundle
If you want all 15 of our n8n automation templates â Lead Capture to CRM, AI Customer Support Bot, Invoice Generator, Social Media Cross-Poster, Price Monitor, and 10 more â we've packaged them up.
Grab the full bundle at stripeai.gumroad.com â each template is pre-tested, documented, and ready to activate.
Built with n8n. No vendor lock-in, self-hostable, open source.
Top comments (0)