AutomationFlowsMarketing & Ads › Lead Scoring (execute Workflow Trigger)

Lead Scoring (execute Workflow Trigger)

2 - Lead Scoring. Uses executeWorkflowTrigger, httpRequest. Event-driven trigger; 8 nodes.

Event trigger★★★★☆ complexity8 nodesExecute Workflow TriggerHTTP Request
Marketing & Ads Trigger: Event Nodes: 8 Complexity: ★★★★☆ Added:

This workflow follows the Execute Workflow Trigger → 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
{
  "name": "2 - Lead Scoring",
  "nodes": [
    {
      "parameters": {
        "inputSource": "passthrough"
      },
      "id": "a1b2c3d4-1111-4372-a567-0e02b2c3d479",
      "name": "Execute Workflow Trigger",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "typeVersion": 1.1,
      "position": [
        240,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "// Get data directly from trigger - no need for extra API call\nconst triggerData = $input.first().json;\n\n// Extract contact_id from multiple possible locations\nconst contactId = triggerData.contact_id || triggerData.id || '';\n\nif (!contactId) {\n  throw new Error('Missing contact_id in trigger data: ' + JSON.stringify(triggerData));\n}\n\n// Extract lead data - handle both direct lead_data and flat structure\nlet lead = {};\n\nif (triggerData.lead_data) {\n  // Data passed via lead_data object\n  lead = {\n    name: triggerData.lead_data.name || triggerData.contact_name || '',\n    phone: triggerData.lead_data.phone || '',\n    email: triggerData.lead_data.email || '',\n    source: triggerData.lead_data.source || 'Unknown',\n    message: triggerData.lead_data.message || '',\n    interactions: triggerData.lead_data.interaction_count || 1\n  };\n} else {\n  // Flat structure fallback\n  lead = {\n    name: triggerData.name || triggerData.contact_name || '',\n    phone: triggerData.phone || '',\n    email: triggerData.email || '',\n    source: triggerData.source || 'Unknown',\n    message: triggerData.message || '',\n    interactions: triggerData.interaction_count || 1\n  };\n}\n\nlet score = 0;\nlet reasons = [];\n\n// Phone scoring (clean phone number)\nconst cleanPhone = (lead.phone || '').toString().replace(/\\D/g, '');\nif (cleanPhone.length >= 10) {\n  score += 2;\n  reasons.push('has phone');\n}\n\n// Email scoring\nif (lead.email && lead.email.includes('@')) {\n  score += 1;\n  reasons.push('has email');\n}\n\n// Message intent scoring\nconst msg = (lead.message || '').toLowerCase();\nconst buyingKeywords = ['buy', 'price', 'cost', 'interested', 'want', 'need', 'purchase', 'quote'];\nconst serviceKeywords = ['website', 'build', 'develop', 'product', 'service', 'demo', 'appointment', 'meeting', 'call'];\n\nif (buyingKeywords.some(k => msg.includes(k))) {\n  score += 3;\n  reasons.push('buying intent');\n}\n\nif (serviceKeywords.some(k => msg.includes(k))) {\n  score += 2;\n  reasons.push('specific inquiry');\n}\n\n// Engagement scoring\nif (lead.interactions > 1) {\n  score += 1;\n  reasons.push('returning');\n}\n\nif ((lead.message || '').length > 50) {\n  score += 1;\n  reasons.push('detailed');\n}\n\n// Normalize score between 1-10\nscore = Math.min(10, Math.max(1, score));\n\n// Determine tier and action\nconst tier = score >= 8 ? 'Hot' : score >= 5 ? 'Warm' : 'Cold';\nconst action = tier === 'Hot' ? 'Call immediately' : tier === 'Warm' ? 'Send follow-up within 24h' : 'Add to nurture sequence';\n\nreturn {\n  json: {\n    contact_id: contactId,\n    score: score,\n    tier: tier,\n    reason: reasons.join(', ') || 'New lead',\n    suggested_action: action,\n    lead_data: lead\n  }\n};"
      },
      "id": "score-lead-rule-based-1111-111111",
      "name": "Score Lead",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        480,
        300
      ]
    },
    {
      "parameters": {
        "method": "PATCH",
        "url": "=https://api.airtable.com/v0/YOUR_AIRTABLE_BASE_ID/Contacts/{{ $json.contact_id }}",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "airtableTokenApi",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ fields: { LeadScore: $json.score, Tier: $json.tier, ScoringReason: $json.reason, SuggestedAction: $json.suggested_action } }) }}"
      },
      "id": "b8c9d0e1-8888-4567-bcde-890123456789",
      "name": "Update Score",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        720,
        300
      ],
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "leftValue": "={{ $('Score Lead').item.json.score }}",
              "rightValue": 8,
              "operator": {
                "type": "number",
                "operation": "gte"
              }
            }
          ]
        }
      },
      "id": "c9d0e1f2-9999-5678-cdef-901234567890",
      "name": "Is Hot?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        960,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "const data = $('Score Lead').item.json;\nreturn {\n  json: {\n    alert_type: 'hot_lead',\n    contact_data: {\n      contact_id: data.contact_id,\n      name: data.lead_data.name,\n      phone: data.lead_data.phone,\n      email: data.lead_data.email,\n      interest: data.lead_data.message,\n      score: data.score,\n      suggested_action: data.suggested_action\n    }\n  }\n};"
      },
      "id": "e1f2a3b4-bbbb-7890-efab-123456789012",
      "name": "Prepare Alert",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1200,
        200
      ]
    },
    {
      "parameters": {
        "workflowId": {
          "__rl": true,
          "mode": "name",
          "value": "4 - Owner Alerts"
        },
        "options": {
          "waitForSubWorkflow": false
        }
      },
      "id": "d0e1f2a3-aaaa-6789-defa-012345678901",
      "name": "Send Alert",
      "type": "n8n-nodes-base.executeWorkflow",
      "typeVersion": 1.1,
      "position": [
        1440,
        200
      ]
    },
    {
      "parameters": {
        "jsCode": "const data = $('Score Lead').item.json;\nreturn {\n  json: {\n    contact_id: data.contact_id,\n    tier: data.tier.toLowerCase(),\n    name: data.lead_data.name,\n    phone: data.lead_data.phone,\n    email: data.lead_data.email,\n    interest: data.lead_data.message,\n    score: data.score,\n    suggested_action: data.suggested_action\n  }\n};"
      },
      "id": "a3b4c5d6-dddd-9012-abcd-345678901234",
      "name": "Prepare Follow-up",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1200,
        400
      ]
    },
    {
      "parameters": {
        "workflowId": {
          "__rl": true,
          "mode": "name",
          "value": "3 - Follow-up Sequences"
        },
        "options": {
          "waitForSubWorkflow": false
        }
      },
      "id": "f2a3b4c5-cccc-8901-fabc-234567890123",
      "name": "Start Follow-up",
      "type": "n8n-nodes-base.executeWorkflow",
      "typeVersion": 1.1,
      "position": [
        1440,
        400
      ]
    }
  ],
  "connections": {
    "Execute Workflow Trigger": {
      "main": [
        [
          {
            "node": "Score Lead",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Score Lead": {
      "main": [
        [
          {
            "node": "Update Score",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Score": {
      "main": [
        [
          {
            "node": "Is Hot?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is Hot?": {
      "main": [
        [
          {
            "node": "Prepare Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Prepare Follow-up",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Alert": {
      "main": [
        [
          {
            "node": "Send Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Alert": {
      "main": [
        [
          {
            "node": "Prepare Follow-up",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Follow-up": {
      "main": [
        [
          {
            "node": "Start Follow-up",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "staticData": null,
  "tags": [],
  "triggerCount": 0,
  "versionId": "5"
}

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

2 - Lead Scoring. Uses executeWorkflowTrigger, httpRequest. Event-driven trigger; 8 nodes.

Source: https://github.com/YogiHarshil/crm-automation/blob/main/workflows/2-lead-scoring.json — original creator credit. Request a take-down →

More Marketing & Ads workflows → · Browse all categories →

Related workflows

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

Marketing & Ads

This workflow is designed to take user inputs in order to generate an image using the Riverflow 2.0 model through the Replicate API. It can handle both image generation as well as image editing. Addit

Form Trigger, Data Table, HTTP Request +1
Marketing & Ads

Local Business Lead Finder - Google Places API. Uses executeWorkflowTrigger, googleSheets, httpRequest. Event-driven trigger; 26 nodes.

Execute Workflow Trigger, Google Sheets, HTTP Request
Marketing & Ads

Edit Image. Uses executeWorkflowTrigger, httpRequest, convertToFile, googleSheets. Event-driven trigger; 12 nodes.

Execute Workflow Trigger, HTTP Request, Google Sheets +2
Marketing & Ads

org-ai Dept Marketing. Uses executeWorkflowTrigger, httpRequest, gmail. Event-driven trigger; 9 nodes.

Execute Workflow Trigger, HTTP Request, Gmail
Marketing & Ads

The Recap AI - Insurance Lawyer Lead Gen. Uses executeWorkflowTrigger, formTrigger, @mendable/n8n-nodes-firecrawl, googleSheets. Event-driven trigger; 33 nodes.

Execute Workflow Trigger, Form Trigger, @Mendable/N8N Nodes Firecrawl +4