AutomationFlowsCRM & Sales › Auto-schedule Demos for High-intent Leads with Clearbit, Slack, and Calendly

Auto-schedule Demos for High-intent Leads with Clearbit, Slack, and Calendly

ByOmer Fayyaz @omerfayyaz on n8n.io

Real-Time Lead Processing - Captures and processes leads instantly from website forms with zero delay Intelligent Fit Scoring - Automatically scores leads 0-100 based on company size, seniority, and revenue Dual-Track Routing - High-intent leads (60+) get fast-track treatment,…

Webhook trigger★★★★☆ complexity28 nodesClearbitHubSpotHTTP RequestSlackSendGridGoogle Sheets
CRM & Sales Trigger: Webhook Nodes: 28 Complexity: ★★★★☆ Added:
Auto-schedule Demos for High-intent Leads with Clearbit, Slack, and Calendly — n8n workflow card showing Clearbit, HubSpot, HTTP Request integration

This workflow corresponds to n8n.io template #11200 — we link there as the canonical source.

This workflow follows the Google Sheets → HTTP Request recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "xIkWbq0d9okxJcNL",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Instant Demo Booker for High Intent Leads",
  "tags": [],
  "nodes": [
    {
      "id": "2c0c576e-c4b9-417b-810a-e39b92f24604",
      "name": "Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2736,
        -192
      ],
      "parameters": {
        "width": 640,
        "height": 888,
        "content": "## Instant Demo Booker for High-Intent Leads\n\n### How it works  \n- **Lead Capture**: Collects form submissions via webhook (e.g., email, name, company).  \n- **Data Enrichment**: Uses Clearbit to enrich lead data (company size, revenue, industry, etc.).  \n- **Fit Scoring**: Calculates a fit score based on company size, revenue, and job title (0\u2013100).  \n- **Lead Routing**: \n   - **High-Intent Leads (score \u2265 60)**: Routed to a fast track for immediate action.  \n   - **Standard Leads (score < 60)**: Routed for standard follow-up.  \n- **Demo Scheduling**: Fetches available demo slots from Calendly and sends them to sales team in Slack.  \n- **Sales Alerts**: Sends Slack notifications to sales with lead details and available demo slots.  \n- **Follow-Up**: If no response from sales within 10 minutes, an automatic email is sent to the lead.  \n- **Logging**: Logs all data to Google Sheets for analytics and tracking.\n\n\n### Setup Requirements  \n1. **Clearbit**: API key for lead enrichment.  \n2. **HubSpot**: App token for CRM integration (create/update contacts & deals).  \n3. **Calendly**: OAuth2 token & user URI for demo scheduling.  \n4. **Slack**: Bot token for channel notifications, configure channels for hot leads & standard leads.  \n5. **SendGrid**: API key for sending fallback emails.  \n6. **Google Sheets**: OAuth2 connection and sheet ID for lead & demo logs.\n\n\n### Customize\n\u2022 Fit score logic (Calculate Fit Score node)\n\u2022 Slack channel names\n\u2022 Email template\n\u2022 Calendar event name filter"
      },
      "typeVersion": 1
    },
    {
      "id": "20280207-e88f-4dca-8e45-70a2914912b2",
      "name": "High-Intent Flow",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -816,
        -192
      ],
      "parameters": {
        "color": 5,
        "width": 3212,
        "height": 536,
        "content": "## High-Intent Path (Score \u226560)\n"
      },
      "typeVersion": 1
    },
    {
      "id": "2b5e5e41-6449-4d32-a0c3-d5f12564f87f",
      "name": "Standard Flow",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -816,
        368
      ],
      "parameters": {
        "color": 6,
        "width": 392,
        "height": 324,
        "content": "## Standard Path (Score <60)\nPosts to #leads Slack channel\nNo automated follow-up\nStandard nurture workflow"
      },
      "typeVersion": 1
    },
    {
      "id": "2ead105b-92f4-4f51-98be-f3ff5fe55324",
      "name": "Lead Form Webhook",
      "type": "n8n-nodes-base.webhook",
      "notes": "Receives lead submissions via POST request",
      "onError": "continueRegularOutput",
      "position": [
        -1984,
        144
      ],
      "parameters": {
        "path": "demo-request",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "notesInFlow": true,
      "typeVersion": 2.1
    },
    {
      "id": "f3b76dd2-b228-4200-bd11-e400cfb6b935",
      "name": "Normalize Lead Data",
      "type": "n8n-nodes-base.set",
      "notes": "Standardizes field names from different form providers",
      "position": [
        -1760,
        144
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "email",
              "name": "email",
              "type": "string",
              "value": "={{ $json.body.email || $json.body.contact_email }}"
            },
            {
              "id": "fullName",
              "name": "fullName",
              "type": "string",
              "value": "={{ $json.body.name || $json.body.full_name }}"
            },
            {
              "id": "company",
              "name": "company",
              "type": "string",
              "value": "={{ $json.body.company || $json.body.company_name || '' }}"
            },
            {
              "id": "phone",
              "name": "phone",
              "type": "string",
              "value": "={{ $json.body.phone || '' }}"
            },
            {
              "id": "utmSource",
              "name": "utmSource",
              "type": "string",
              "value": "={{ $json.body.utm_source || '' }}"
            },
            {
              "id": "utmCampaign",
              "name": "utmCampaign",
              "type": "string",
              "value": "={{ $json.body.utm_campaign || '' }}"
            },
            {
              "id": "pageUrl",
              "name": "pageUrl",
              "type": "string",
              "value": "={{ $json.body.page_url || $json.body.referrer || '' }}"
            },
            {
              "id": "message",
              "name": "message",
              "type": "string",
              "value": "={{ $json.body.message || $json.body.notes || '' }}"
            },
            {
              "id": "timestamp",
              "name": "submittedAt",
              "type": "string",
              "value": "={{ $now.toISO() }}"
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 3.4
    },
    {
      "id": "afed81f7-9ddf-4195-97e2-e3ea38021415",
      "name": "Enrich with Clearbit",
      "type": "n8n-nodes-base.clearbit",
      "notes": "Enriches contact with company data (size, revenue, industry, job title)",
      "onError": "continueRegularOutput",
      "position": [
        -1536,
        144
      ],
      "parameters": {
        "email": "={{ $json.email }}",
        "resource": "person",
        "additionalFields": {}
      },
      "credentials": {
        "clearbitApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "625bcc5e-5ae9-4b14-a77c-d8cbf7632bb6",
      "name": "Calculate Fit Score",
      "type": "n8n-nodes-base.set",
      "notes": "Scores 0-100 based on company size (40), seniority (30), revenue (30)",
      "position": [
        -1312,
        144
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "enrichedCompany",
              "name": "enrichedCompany",
              "type": "string",
              "value": "={{ $json.company && $json.company.name ? $json.company.name : $('Normalize Lead Data').item.json.company }}"
            },
            {
              "id": "companySize",
              "name": "companySize",
              "type": "number",
              "value": "={{ $json.company && $json.company.metrics && $json.company.metrics.employees ? $json.company.metrics.employees : 0 }}"
            },
            {
              "id": "industry",
              "name": "industry",
              "type": "string",
              "value": "={{ $json.company && $json.company.category && $json.company.category.industry ? $json.company.category.industry : 'Unknown' }}"
            },
            {
              "id": "annualRevenue",
              "name": "annualRevenue",
              "type": "number",
              "value": "={{ $json.company && $json.company.metrics && $json.company.metrics.annualRevenue ? $json.company.metrics.annualRevenue : 0 }}"
            },
            {
              "id": "jobTitle",
              "name": "jobTitle",
              "type": "string",
              "value": "={{ $json.person && $json.person.employment && $json.person.employment.title ? $json.person.employment.title : '' }}"
            },
            {
              "id": "seniority",
              "name": "seniority",
              "type": "string",
              "value": "={{ $json.person && $json.person.employment && $json.person.employment.seniority ? $json.person.employment.seniority : '' }}"
            },
            {
              "id": "fitScore",
              "name": "fitScore",
              "type": "number",
              "value": "={{ ($json.company && $json.company.metrics && $json.company.metrics.employees >= 50 && $json.company.metrics.employees <= 5000 ? 40 : 0) + ($json.person && $json.person.employment && ($json.person.employment.seniority === 'executive' || $json.person.employment.seniority === 'director') ? 30 : 0) + ($json.company && $json.company.metrics && $json.company.metrics.annualRevenue >= 1000000 ? 30 : 0) }}"
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 3.4
    },
    {
      "id": "03a8939e-1e58-4798-9273-e7848264b8d1",
      "name": "High Intent Lead?",
      "type": "n8n-nodes-base.if",
      "notes": "Routes leads with score \u226560 to fast track, others to standard",
      "position": [
        -1088,
        144
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "fit-check",
              "operator": {
                "type": "number",
                "operation": "gte"
              },
              "leftValue": "={{ $json.fitScore }}",
              "rightValue": 60
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 2.2
    },
    {
      "id": "bef98f70-efb1-4a15-b732-655f9c952b08",
      "name": "Create HubSpot Contact",
      "type": "n8n-nodes-base.hubspot",
      "notes": "Creates or updates contact in HubSpot CRM",
      "onError": "continueRegularOutput",
      "maxTries": 3,
      "position": [
        -736,
        32
      ],
      "parameters": {
        "email": "={{ $('Normalize Lead Data').item.json.email }}",
        "options": {},
        "authentication": "appToken",
        "additionalFields": {
          "jobTitle": "={{ $json.jobTitle }}",
          "lastName": "={{ $('Normalize Lead Data').item.json.fullName.split(' ').slice(1).join(' ') }}",
          "firstName": "={{ $('Normalize Lead Data').item.json.fullName.split(' ')[0] }}",
          "companyName": "={{ $json.enrichedCompany }}",
          "phoneNumber": "={{ $('Normalize Lead Data').item.json.phone }}"
        }
      },
      "credentials": {
        "hubspotAppToken": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 2.2,
      "waitBetweenTries": 2000
    },
    {
      "id": "be4256a3-6f78-45b2-a3f7-3ef8bec480a8",
      "name": "Create HubSpot Deal",
      "type": "n8n-nodes-base.hubspot",
      "notes": "Creates deal in 'Appointment Scheduled' stage",
      "onError": "continueRegularOutput",
      "maxTries": 3,
      "position": [
        -496,
        32
      ],
      "parameters": {
        "stage": "appointmentscheduled",
        "resource": "deal",
        "authentication": "appToken",
        "additionalFields": {
          "amount": "0",
          "dealName": "=Demo Request - {{ $json.enrichedCompany }}",
          "pipeline": "=default",
          "closeDate": "={{ $now.plus({ days: 30 }).toISO() }}"
        }
      },
      "credentials": {
        "hubspotAppToken": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 2.2,
      "waitBetweenTries": 2000
    },
    {
      "id": "0b4ee4ba-f453-4e9e-9030-712bf2e2dbaa",
      "name": "Get Calendly Event Types",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Fetches your Calendly event types to find Demo events",
      "onError": "continueRegularOutput",
      "position": [
        -272,
        32
      ],
      "parameters": {
        "url": "https://api.calendly.com/event_types",
        "options": {},
        "sendQuery": true,
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "user",
              "value": "Your user URI"
            }
          ]
        },
        "nodeCredentialType": "calendlyOAuth2Api"
      },
      "credentials": {
        "calendlyOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 4.3
    },
    {
      "id": "4e3a9a46-8170-4188-8286-5c6d005c2d2f",
      "name": "Prepare Availability Params",
      "type": "n8n-nodes-base.code",
      "notes": "Finds Demo event and prepares 7-day availability window",
      "onError": "continueRegularOutput",
      "position": [
        -48,
        32
      ],
      "parameters": {
        "jsCode": "const eventTypes = $input.first().json.collection || [];\nconst demoEventType = eventTypes.find(e => e.name.toLowerCase().includes('demo'));\n\nif (!demoEventType) {\n  return [{\n    json: {\n      error: 'No demo event type found',\n      fallbackUrl: 'https://calendly.com/your-team/demo'\n    }\n  }];\n}\n\nconst startTime = new Date();\nconst endTime = new Date();\nendTime.setDate(endTime.getDate() + 7);\n\nreturn [{\n  json: {\n    eventTypeUri: demoEventType.uri,\n    startTime: startTime.toISOString(),\n    endTime: endTime.toISOString(),\n    schedulingUrl: demoEventType.scheduling_url\n  }\n}];"
      },
      "notesInFlow": true,
      "typeVersion": 2
    },
    {
      "id": "a9ccbc19-252e-4059-a305-b852bb67e2d3",
      "name": "Get Available Demo Slots",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Fetches real available time slots from Calendly API",
      "onError": "continueRegularOutput",
      "maxTries": 2,
      "position": [
        176,
        32
      ],
      "parameters": {
        "url": "https://api.calendly.com/event_type_available_times",
        "options": {},
        "sendQuery": true,
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "event_type",
              "value": "={{ $json.eventTypeUri }}"
            },
            {
              "name": "start_time",
              "value": "={{ $json.startTime }}"
            },
            {
              "name": "end_time",
              "value": "={{ $json.endTime }}"
            }
          ]
        },
        "nodeCredentialType": "calendlyOAuth2Api"
      },
      "credentials": {
        "calendlyOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "retryOnFail": true,
      "typeVersion": 4.3,
      "waitBetweenTries": 1000
    },
    {
      "id": "110b29c4-7c1f-42e9-b6d4-6682e0417361",
      "name": "Format Demo Slots",
      "type": "n8n-nodes-base.code",
      "notes": "Formats next 2 available slots with booking URLs",
      "onError": "continueRegularOutput",
      "position": [
        400,
        32
      ],
      "parameters": {
        "jsCode": "const availableTimes = $input.first().json.collection || [];\nconst fallbackUrl = $('Prepare Availability Params').first().json.schedulingUrl || 'https://calendly.com/your-team/demo';\n\nif (availableTimes.length === 0) {\n  return [{\n    json: {\n      bookingUrl: fallbackUrl,\n      nextSlots: ['No slots in next 7 days', 'Check calendar'],\n      slotCount: 0\n    }\n  }];\n}\n\nconst formattedSlots = availableTimes.slice(0, 2).map(slot => {\n  const date = new Date(slot.start_time);\n  return date.toLocaleString('en-US', {\n    weekday: 'short',\n    month: 'short',\n    day: 'numeric',\n    hour: 'numeric',\n    minute: '2-digit',\n    timeZoneName: 'short'\n  });\n});\n\nconst firstSlotUrl = availableTimes[0].scheduling_url || fallbackUrl;\n\nreturn [{\n  json: {\n    bookingUrl: firstSlotUrl,\n    nextSlots: formattedSlots,\n    slotCount: availableTimes.length,\n    allSlots: availableTimes.slice(0, 5).map(s => ({\n      time: s.start_time,\n      url: s.scheduling_url\n    }))\n  }\n}];"
      },
      "notesInFlow": true,
      "typeVersion": 2
    },
    {
      "id": "4e1451f4-6646-4c37-85bc-892cea0c15e3",
      "name": "Alert Sales (High Intent)",
      "type": "n8n-nodes-base.slack",
      "notes": "Posts to #hot-leads with full lead details and booking links",
      "onError": "continueRegularOutput",
      "position": [
        704,
        32
      ],
      "parameters": {
        "text": "=\ud83d\udd25 HIGH INTENT LEAD\n\n\ud83d\udc64 {{ $('Normalize Lead Data').item.json.fullName }}\n\ud83d\udce7 {{ $('Normalize Lead Data').item.json.email }}\n\ud83c\udfe2 {{ $('Calculate Fit Score').item.json.enrichedCompany }} ({{ $('Calculate Fit Score').item.json.companySize }} employees)\n\ud83d\udcbc {{ $('Calculate Fit Score').item.json.jobTitle }}\n\ud83d\udcca Fit Score: {{ $('Calculate Fit Score').item.json.fitScore }}/100\n\n\ud83c\udfaf Source: {{ $('Normalize Lead Data').item.json.utmSource || 'Direct' }}\n\ud83c\udf10 Page: {{ $('Normalize Lead Data').item.json.pageUrl }}\n\ud83d\udcac Message: {{ $('Normalize Lead Data').item.json.message || 'None' }}\n\n\ud83d\udcc5 Available Slots ({{ $('Format Demo Slots').item.json.slotCount }} total):\n\u2022 {{ $('Format Demo Slots').item.json.nextSlots[0] }}\n\u2022 {{ $('Format Demo Slots').item.json.nextSlots[1] }}\n\n\ud83d\udd17 Book: {{ $('Format Demo Slots').item.json.bookingUrl }}\n\n\u26a1 Respond in 10min or auto-email sends!",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "hot-leads"
        },
        "otherOptions": {
          "mrkdwn": true
        }
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 2.3
    },
    {
      "id": "50c42a60-8b79-409f-9876-b97a2278a0d0",
      "name": "Alert Sales (Standard)",
      "type": "n8n-nodes-base.slack",
      "notes": "Posts to #leads channel for standard priority",
      "onError": "continueRegularOutput",
      "position": [
        -672,
        512
      ],
      "parameters": {
        "text": "=\ud83d\udccb New Lead\n\n\ud83d\udc64 {{ $('Normalize Lead Data').item.json.fullName }}\n\ud83d\udce7 {{ $('Normalize Lead Data').item.json.email }}\n\ud83c\udfe2 {{ $('Calculate Fit Score').item.json.enrichedCompany }}\n\ud83d\udcca Fit: {{ $('Calculate Fit Score').item.json.fitScore }}/100\n\n\ud83d\udd17 Book: {{ $('Format Demo Slots').item.json.bookingUrl }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "leads"
        },
        "otherOptions": {
          "mrkdwn": true
        }
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 2.3
    },
    {
      "id": "66a0f0e0-afc8-4c1f-a02a-65ae586a2f82",
      "name": "Wait 10 Minutes",
      "type": "n8n-nodes-base.wait",
      "notes": "Waits for sales rep to respond in Slack thread",
      "position": [
        1504,
        32
      ],
      "parameters": {
        "unit": "minutes",
        "amount": 10
      },
      "notesInFlow": true,
      "typeVersion": 1.1
    },
    {
      "id": "91a5228c-5072-4159-913f-b549c6ed4936",
      "name": "Check Slack Replies",
      "type": "n8n-nodes-base.slack",
      "notes": "Checks if sales team replied in thread",
      "onError": "continueRegularOutput",
      "position": [
        1696,
        32
      ],
      "parameters": {
        "ts": "={{ $('Alert Sales (High Intent)').first().json.ts }}",
        "filters": {},
        "resource": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Alert Sales (High Intent)').first().json.channel }}"
        },
        "operation": "replies"
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 2.3
    },
    {
      "id": "efef0ae7-7c05-4e42-9e57-c56229bc08ab",
      "name": "No Response?",
      "type": "n8n-nodes-base.if",
      "notes": "Sends email if no Slack reply (message count = 1)",
      "position": [
        1904,
        32
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "reply-check",
              "operator": {
                "type": "number",
                "operation": "equals"
              },
              "leftValue": "={{ $json.messages && $json.messages.length ? $json.messages.length : 1 }}",
              "rightValue": 1
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 2.2
    },
    {
      "id": "423bf560-215a-4f67-8b37-1d63014ae027",
      "name": "Send Fallback Email",
      "type": "n8n-nodes-base.sendGrid",
      "notes": "Auto-sends booking email if sales doesn't respond",
      "maxTries": 2,
      "position": [
        2144,
        32
      ],
      "parameters": {
        "subject": "=Book Your Demo - {{ $('Calculate Fit Score').first().json.enrichedCompany }}",
        "toEmail": "={{ $('Normalize Lead Data').first().json.email }}",
        "fromName": "Demo Team",
        "resource": "mail",
        "fromEmail": "user@example.com",
        "contentType": "text/html",
        "contentValue": "=<h2>Thanks for your interest!</h2><p>Hi {{ $('Normalize Lead Data').first().json.fullName }},</p><p>We received your demo request for {{ $('Calculate Fit Score').first().json.enrichedCompany }}.</p><p><strong>Next available:</strong></p><ul><li>{{ $('Format Demo Slots').first().json.nextSlots[0] }}</li><li>{{ $('Format Demo Slots').first().json.nextSlots[1] }}</li></ul><p><a href='{{ $('Format Demo Slots').first().json.bookingUrl }}' style='background:#0066cc;color:white;padding:12px 24px;text-decoration:none;border-radius:4px;display:inline-block;'>Book Demo Now</a></p><p>Looking forward to connecting!</p>",
        "additionalFields": {}
      },
      "credentials": {
        "sendGridApi": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 1
    },
    {
      "id": "4fc94d27-1dff-4828-9bd6-6f8544c2d59c",
      "name": "Log to Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "Logs all lead data for analytics and reporting",
      "onError": "continueRegularOutput",
      "position": [
        1136,
        -64
      ],
      "parameters": {
        "columns": {
          "value": {
            "Name": "={{ $('Normalize Lead Data').item.json.fullName }}",
            "Email": "={{ $('Normalize Lead Data').item.json.email }}",
            "Company": "={{ $('Calculate Fit Score').item.json.enrichedCompany }}",
            "Page URL": "={{ $('Normalize Lead Data').item.json.pageUrl }}",
            "Priority": "={{ $('Calculate Fit Score').item.json.fitScore >= 60 ? 'High' : 'Standard' }}",
            "Fit Score": "={{ $('Calculate Fit Score').item.json.fitScore }}",
            "Timestamp": "={{ $('Normalize Lead Data').item.json.submittedAt }}",
            "UTM Source": "={{ $('Normalize Lead Data').item.json.utmSource }}",
            "Booking URL": "={{ $('Format Demo Slots').item.json.bookingUrl }}",
            "HubSpot Deal": "={{ $('Create HubSpot Deal').item.json.id || 'Failed' }}",
            "Fallback Email": "={{ $('Check Slack Replies').item.json.messages && $('Check Slack Replies').item.json.messages.length === 1 ? 'Sent' : 'Not Needed' }}",
            "Sales Response": "={{ $('Check Slack Replies').item.json.messages && $('Check Slack Replies').item.json.messages.length > 1 ? 'Yes' : 'No' }}",
            "HubSpot Contact": "={{ $('Create HubSpot Contact').item.json.id || 'Failed' }}",
            "Slots Available": "={{ $('Format Demo Slots').item.json.slotCount }}"
          },
          "mappingMode": "defineBelow"
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Lead Log"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 4.7
    },
    {
      "id": "b2d9ad7d-6a02-4d5a-9088-33a9b9453aeb",
      "name": "Webhook Response",
      "type": "n8n-nodes-base.respondToWebhook",
      "notes": "Returns success message to form with booking details",
      "position": [
        1136,
        128
      ],
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": "={\"success\":true,\"message\":\"Demo request received!\",\"fitScore\":{{$('Calculate Fit Score').item.json.fitScore}},\"priority\":\"{{$('Calculate Fit Score').item.json.fitScore>=60?'high':'standard'}}\",\"availableSlots\":{{$('Format Demo Slots').item.json.slotCount}},\"bookingUrl\":\"{{$('Format Demo Slots').item.json.bookingUrl}}\"}"
      },
      "notesInFlow": true,
      "typeVersion": 1.4
    },
    {
      "id": "e94eb671-7d06-48f2-a282-71a0e200ce05",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -800,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 448,
        "height": 432,
        "content": "## Create HubSpot contact + deal\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8c3fc727-c681-4051-826e-fd71fa75c810",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -336,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 880,
        "height": 432,
        "content": "## Get real Calendly slots\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8f9aa05d-df2e-4800-8dcc-0459d82024c0",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 400,
        "height": 432,
        "content": "## Post to #hot-leads Slack\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "692eceab-17c8-48f2-bea6-0a7446bd1fb4",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        976,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 432,
        "content": "## Log to Google Sheet and Send Response\n"
      },
      "typeVersion": 1
    },
    {
      "id": "a13d737c-0348-40d3-9a80-12f749e7fa00",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1408,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 960,
        "height": 432,
        "content": "## Wait 10 minutes, Check for response. Send email if no reply"
      },
      "typeVersion": 1
    },
    {
      "id": "8bac8fd3-abd1-42c5-bd55-191085c497f5",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1824,
        -16
      ],
      "parameters": {
        "color": 7,
        "width": 944,
        "height": 432,
        "content": "## Enrich the Lead data and calculate the Fit Score"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "8d3ac6ae-89d0-4f0e-b8bb-e399de7da43e",
  "connections": {
    "No Response?": {
      "main": [
        [
          {
            "node": "Send Fallback Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 10 Minutes": {
      "main": [
        [
          {
            "node": "Check Slack Replies",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Demo Slots": {
      "main": [
        [
          {
            "node": "Alert Sales (High Intent)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "High Intent Lead?": {
      "main": [
        [
          {
            "node": "Create HubSpot Contact",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Alert Sales (Standard)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Lead Form Webhook": {
      "main": [
        [
          {
            "node": "Normalize Lead Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Calculate Fit Score": {
      "main": [
        [
          {
            "node": "High Intent Lead?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Slack Replies": {
      "main": [
        [
          {
            "node": "No Response?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create HubSpot Deal": {
      "main": [
        [
          {
            "node": "Get Calendly Event Types",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Lead Data": {
      "main": [
        [
          {
            "node": "Enrich with Clearbit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Enrich with Clearbit": {
      "main": [
        [
          {
            "node": "Calculate Fit Score",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create HubSpot Contact": {
      "main": [
        [
          {
            "node": "Create HubSpot Deal",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Available Demo Slots": {
      "main": [
        [
          {
            "node": "Format Demo Slots",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Calendly Event Types": {
      "main": [
        [
          {
            "node": "Prepare Availability Params",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Alert Sales (High Intent)": {
      "main": [
        [
          {
            "node": "Wait 10 Minutes",
            "type": "main",
            "index": 0
          },
          {
            "node": "Log to Google Sheets",
            "type": "main",
            "index": 0
          },
          {
            "node": "Webhook Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Availability Params": {
      "main": [
        [
          {
            "node": "Get Available Demo Slots",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Real-Time Lead Processing - Captures and processes leads instantly from website forms with zero delay Intelligent Fit Scoring - Automatically scores leads 0-100 based on company size, seniority, and revenue Dual-Track Routing - High-intent leads (60+) get fast-track treatment,…

Source: https://n8n.io/workflows/11200/ — original creator credit. Request a take-down →

More CRM & Sales workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

CRM & Sales

This is ideal for agencies, freelancers, SaaS founders, and small sales teams who want every lead recorded and followed up automatically within seconds. The workflow supports two storage options: HubS

HTTP Request, Google Sheets, Slack +1
CRM & Sales

Monitor CRM accounts for hiring spikes by enriching HubSpot companies with PredictLeads job data and alerting your team via Slack.

HubSpot, HTTP Request, Google Sheets +1
CRM & Sales

A webhook receives a form submission with an email address The email is validated, then Lusha enriches the contact If phone or email is missing, a fallback provider fills the gaps via HTTP request Dat

@Lusha Org/N8N Nodes Lusha, HTTP Request, HubSpot +1
CRM & Sales

SMB sales teams and SaaS companies who want to automatically prioritize and nurture new leads without manual qualification. Perfect for businesses getting 50+ leads per month who need to identify high

HubSpot Trigger, HTTP Request, Chain Llm +5
CRM & Sales

Automate your lead qualification pipeline — capture Typeform Webhook leads, enrich with APIs, score intelligently, and route to HubSpot, Slack, and Sheets in real-time.

HTTP Request, HubSpot, Slack +1