AutomationFlowsAI & RAG › Score Linkedin Leads in Google Sheets with Bright Data and Claude

Score Linkedin Leads in Google Sheets with Bright Data and Claude

ByToolMonsters @toolmonsters on n8n.io

This workflow watches a Google Sheets leads sheet, enriches each new lead with LinkedIn person and company data from Bright Data, then uses Anthropic Claude to generate a 0–100 lead score and reason and updates the sheet status to HOT or DONE. Triggers when a new row is added to…

Event trigger★★★★☆ complexityAI-powered17 nodesGoogle Sheets TriggerGoogle Sheets@Brightdata/N8N Nodes BrightdataAnthropic
AI & RAG Trigger: Event Nodes: 17 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Google Sheets → Googlesheetstrigger 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": "",
  "name": "AI Lead Scoring with LinkedIn Data via Bright Data",
  "tags": [],
  "nodes": [
    {
      "id": "a1f12087-d1d0-45f7-aebd-3aa8f652bf35",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -608,
        -144
      ],
      "parameters": {
        "width": 480,
        "height": 864,
        "content": "## AI Lead Scoring with LinkedIn Data via Bright Data\n\n### How it works\n\nThis workflow monitors a Google Sheet of leads, retrieves the lead list, and processes each row in a loop. For every lead, it enriches the record with LinkedIn profile and company data using Bright Data, then asks Claude to produce a lead score. The score is parsed and used to update the Google Sheet with either a HOT status for high-scoring leads or DONE for the rest.\n\n### Setup steps\n\n- Connect Google Sheets credentials and configure the trigger and read/update nodes to use the correct spreadsheet, sheet, and lead identifier columns.\n- Connect Bright Data credentials and configure the profile and company scraping nodes to use the LinkedIn URL fields from each lead row.\n- Connect Anthropic credentials and verify the Claude prompt returns a predictable JSON structure containing the lead score.\n- Confirm the wait durations match Bright Data and LinkedIn scraping rate-limit requirements, then test with a small batch of leads.\n\n### Customization\n\nAdjust the scoring prompt, JSON parsing logic, and the hot-lead threshold in the \u201cScore >= 70?\u201d node to match your ideal customer profile and sales process."
      },
      "typeVersion": 1
    },
    {
      "id": "d1bcdb4a-cc04-43d2-a5d3-a774878bebbb",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 608,
        "height": 304,
        "content": "## Load lead batch\n\nStarts when the Google Sheet changes, reads all lead rows, and feeds them one at a time through the batch loop for processing."
      },
      "typeVersion": 1
    },
    {
      "id": "bb3b8bf1-72e2-4948-8d86-f16de2c6a2d0",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        688,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 896,
        "height": 304,
        "content": "## Scrape LinkedIn data\n\nEnriches each lead by scraping the person\u2019s LinkedIn profile and company data through Bright Data, with wait steps inserted to respect rate limits."
      },
      "typeVersion": 1
    },
    {
      "id": "bdda8dd3-2f8c-452d-91e3-490b08e51c6b",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1616,
        -144
      ],
      "parameters": {
        "color": 7,
        "width": 640,
        "height": 320,
        "content": "## Score lead with AI\n\nSends the enriched LinkedIn profile and company information to Claude for lead scoring, then parses the AI response into structured JSON for downstream decisions."
      },
      "typeVersion": 1
    },
    {
      "id": "400be4ac-82d2-4ba8-995d-50857de0c475",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2288,
        0
      ],
      "parameters": {
        "color": 7,
        "width": 480,
        "height": 560,
        "content": "## Update lead status\n\nChecks whether the parsed score is at least 70, marks qualified leads as hot, marks the rest as done, and routes both branches back to the lead loop."
      },
      "typeVersion": 1
    },
    {
      "id": "f9cdc771-9921-4db1-b7ed-b9f2f733b520",
      "name": "When Leads Sheet Updated",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "position": [
        0,
        0
      ],
      "parameters": {
        "event": "rowAdded",
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "",
          "cachedResultName": "Leads Sheet"
        }
      },
      "credentials": {
        "googleSheetsTriggerOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8d8ce7bb-09b7-4bab-9b35-d4a647e53b64",
      "name": "Read Leads from Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        208,
        0
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupColumn": "Status"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "",
          "cachedResultName": "Leads Sheet"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "92281250-e2cd-49e4-930a-c62e2291feb1",
      "name": "Batch Process Leads",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        416,
        0
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "68c1bcf6-e1fd-4dca-80e3-e7aab63451dc",
      "name": "Scrape LinkedIn Profiles",
      "type": "@brightdata/n8n-nodes-brightdata.brightData",
      "position": [
        736,
        16
      ],
      "parameters": {
        "urls": "=[{\"url\":\"{{ $json[\"Linkedin URL\"] }}\"}]",
        "resource": "webScrapper",
        "dataset_id": {
          "__rl": true,
          "mode": "list",
          "value": "gd_l1viktl72bvl7bjuj0",
          "cachedResultName": "LinkedIn people profiles"
        },
        "requestOptions": {}
      },
      "credentials": {
        "brightdataApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a44f4bfc-6c4c-443a-ba5b-daf96bc19b90",
      "name": "Wait 30 Seconds",
      "type": "n8n-nodes-base.wait",
      "position": [
        976,
        16
      ],
      "parameters": {
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "e71e686e-64bd-4564-a292-32fce5865512",
      "name": "Extract LinkedIn Companies",
      "type": "@brightdata/n8n-nodes-brightdata.brightData",
      "position": [
        1200,
        16
      ],
      "parameters": {
        "urls": "=[{\"url\":\"{{ $json.experience[0].url }}\"}]",
        "resource": "webScrapper",
        "dataset_id": {
          "__rl": true,
          "mode": "list",
          "value": "gd_l1vikfnt1wgvvqz95w",
          "cachedResultName": "LinkedIn company information"
        },
        "requestOptions": {}
      },
      "credentials": {
        "brightdataApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "2ff812a6-1687-4f4e-bd86-b1a8214905d1",
      "name": "Pause for 30 Seconds",
      "type": "n8n-nodes-base.wait",
      "position": [
        1440,
        16
      ],
      "parameters": {
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "c9764626-33bd-43a5-9baf-af5f1e103a51",
      "name": "AI Analyze Lead Score",
      "type": "@n8n/n8n-nodes-langchain.anthropic",
      "position": [
        1664,
        16
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "claude-opus-4-8",
          "cachedResultName": "claude-opus-4-8"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "=You are a B2B lead qualification assistant for [YOUR COMPANY].\n\nWE SELL: [your product, e.g. \"AI automation tools and data enrichment APIs for sales and growth teams\"]\nOUR IDEAL CUSTOMER: [e.g. \"founders, heads of sales, growth, or RevOps at B2B SaaS companies with 10-500 employees who do outbound and care about lead data quality\"]\n\nScore this lead from 0 to 100 based on how well they match OUR ideal customer profile above. A high score means they are likely a buyer or decision-maker for what we sell.\n\nPERSON:\n- Name: {{ $('Scrape LinkedIn Profiles').item.json.name }}\n- Title: {{ $('Scrape LinkedIn Profiles').item.json.current_company.title }}\n- Location: {{ $('Scrape LinkedIn Profiles').item.json.city }}\n- Connections: {{ $('Scrape LinkedIn Profiles').item.json.connections }}\n\nCOMPANY:\n- Company: {{ $('Extract LinkedIn Companies').item.json.name }}\n- Size: {{ $('Extract LinkedIn Companies').item.json.company_size }}\n- Industry: {{ $('Extract LinkedIn Companies').item.json.industries }}\n\nRespond with ONLY valid JSON, no markdown:\n{\"score\": <0-100>, \"reason\": \"<one sentence on fit vs our ICP>\"}"
            }
          ]
        }
      },
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "7f807d2a-cbfc-4ff1-b6a7-b9b1f1fe6ddc",
      "name": "Parse Lead Score JSON",
      "type": "n8n-nodes-base.code",
      "position": [
        2112,
        16
      ],
      "parameters": {
        "jsCode": "let raw = $json.content[0].text;\nraw = raw.replace(/```json|```/g, \"\").trim();\nconst parsed = JSON.parse(raw);\nreturn {\n  score: parsed.score,\n  reason: parsed.reason\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "0e181817-315b-4af1-9b65-ec4ed1754ff0",
      "name": "Check If Score \u2265 70",
      "type": "n8n-nodes-base.if",
      "position": [
        2336,
        272
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "3c501d1b-3bc5-48c3-8bb1-ad606983482d",
              "operator": {
                "type": "number",
                "operation": "gte"
              },
              "leftValue": "={{ $json.score }}",
              "rightValue": 70
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.3
    },
    {
      "id": "6da33c08-58b8-4548-b184-b59aaa3daada",
      "name": "Update Hot Leads in Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2624,
        160
      ],
      "parameters": {
        "columns": {
          "value": {
            "Reason": "={{ $('Parse Lead Score JSON').item.json.reason }}",
            "Status": "HOT \ud83d\udd25",
            "Title ": "={{ $('Scrape LinkedIn Profiles').item.json.current_company.title }}",
            "Company": "={{ $('Extract LinkedIn Companies').item.json.name }}",
            "Location": "={{ $('Scrape LinkedIn Profiles').item.json.city }}",
            "Lead Score": "={{ $('Parse Lead Score JSON').item.json.score }}",
            "Company Size": "={{ $('Extract LinkedIn Companies').item.json.company_size }}",
            "Connections ": "={{ $('Scrape LinkedIn Profiles').item.json.connections }}"
          },
          "schema": [
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Linkedin URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Linkedin URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Title ",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Title ",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Company",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company Size",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Company Size",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Location",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Location",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Connections ",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Connections ",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Lead Score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Lead Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Reason",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Reason",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "",
          "cachedResultName": "Leads Sheet"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "299c148a-8648-4b6c-bd79-6dca03706ee5",
      "name": "Mark Lead as Processed in Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2624,
        400
      ],
      "parameters": {
        "columns": {
          "value": {
            "Reason": "={{ $('Parse Lead Score JSON').item.json.reason }}",
            "Status": "DONE",
            "Title ": "={{ $('Scrape LinkedIn Profiles').item.json.current_company.title }}",
            "Company": "={{ $('Extract LinkedIn Companies').item.json.name }}",
            "Location": "={{ $('Scrape LinkedIn Profiles').item.json.city }}",
            "Lead Score": "={{ $('Parse Lead Score JSON').item.json.score }}",
            "Company Size": "={{ $('Extract LinkedIn Companies').item.json.company_size }}",
            "Connections ": "={{ $('Scrape LinkedIn Profiles').item.json.connections }}"
          },
          "schema": [
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Linkedin URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Linkedin URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Title ",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Title ",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Company",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company Size",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Company Size",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Location",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Location",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Connections ",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Connections ",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Lead Score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Lead Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Reason",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Reason",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "",
          "cachedResultName": "Leads Sheet"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "",
  "nodeGroups": [],
  "connections": {
    "Wait 30 Seconds": {
      "main": [
        [
          {
            "node": "Extract LinkedIn Companies",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Batch Process Leads": {
      "main": [
        [],
        [
          {
            "node": "Scrape LinkedIn Profiles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Pause for 30 Seconds": {
      "main": [
        [
          {
            "node": "AI Analyze Lead Score",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Analyze Lead Score": {
      "main": [
        [
          {
            "node": "Parse Lead Score JSON",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check If Score \u2265 70": {
      "main": [
        [
          {
            "node": "Update Hot Leads in Sheets",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Mark Lead as Processed in Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Lead Score JSON": {
      "main": [
        [
          {
            "node": "Check If Score \u2265 70",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read Leads from Sheets": {
      "main": [
        [
          {
            "node": "Batch Process Leads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape LinkedIn Profiles": {
      "main": [
        [
          {
            "node": "Wait 30 Seconds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When Leads Sheet Updated": {
      "main": [
        [
          {
            "node": "Read Leads from Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract LinkedIn Companies": {
      "main": [
        [
          {
            "node": "Pause for 30 Seconds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Hot Leads in Sheets": {
      "main": [
        [
          {
            "node": "Batch Process Leads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mark Lead as Processed in Sheets": {
      "main": [
        [
          {
            "node": "Batch Process Leads",
            "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

This workflow watches a Google Sheets leads sheet, enriches each new lead with LinkedIn person and company data from Bright Data, then uses Anthropic Claude to generate a 0–100 lead score and reason and updates the sheet status to HOT or DONE. Triggers when a new row is added to…

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

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

Note: Now includes an Apify alternative for Rapid API (Some users can't create new accounts on Rapid API, so I have added an alternative for you. But immediately you are able to get access to Rapid AP

Form Trigger, Google Sheets Trigger, OpenAI +2
AI & RAG

This system automates LinkedIn lead generation and enrichment in six clear stages: Lead Collection (via Apollo.io) Automatically pulls leads based on keywords, roles, or industries using Apollo’s API.

Form Trigger, OpenAI, Google Sheets Trigger +2
AI & RAG

Automated Lead Generation. Uses formTrigger, openAi, googleSheetsTrigger, googleSheets. Event-driven trigger; 55 nodes.

Form Trigger, OpenAI, Google Sheets Trigger +2
AI & RAG

This workflow enriches leads from Google Sheets by finding and validating LinkedIn profile URLs with SerpAPI and Anthropic, then scraping matched profiles with Apify to extract a relevant company and

HTTP Request, Google Sheets, Anthropic
AI & RAG

Content teams scaling blog production with AI SEO agencies creating client content at scale Marketing teams with editorial calendars

@Seranking/N8N Nodes Seranking, Google Sheets, Anthropic +1