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 →
{
"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.
anthropicApibrightdataApigoogleSheetsOAuth2ApigoogleSheetsTriggerOAuth2Api
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
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
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.
Automated Lead Generation. Uses formTrigger, openAi, googleSheetsTrigger, googleSheets. Event-driven trigger; 55 nodes.
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
Content teams scaling blog production with AI SEO agencies creating client content at scale Marketing teams with editorial calendars