This workflow corresponds to n8n.io template #15247 — we link there as the canonical source.
This workflow follows the Airtable → OpenAI 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": "qFFPoauu8ecC8Yuq",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Enrich new CRM Leads with LinkedIn Data via Bright Data",
"tags": [],
"nodes": [
{
"id": "d1495a05-d870-46d7-a767-8372e353b9ff",
"name": "Scrape LinkedIn Profile",
"type": "@brightdata/n8n-nodes-brightdata.brightData",
"position": [
-496,
1280
],
"parameters": {
"urls": "=[{\"url\": \"{{ $json.fields[\"LinkedIn URL\"] }}\"}]",
"resource": "webScrapper",
"dataset_id": {
"__rl": true,
"mode": "list",
"value": "gd_l1viktl72bvl7bjuj0",
"cachedResultName": "LinkedIn people profiles"
},
"requestOptions": {}
},
"typeVersion": 1
},
{
"id": "ca3c95e3-9a88-47ff-a011-81b899ca8f05",
"name": "Extract Structured Data",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
-176,
1520
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-5-mini",
"cachedResultName": "GPT-5-MINI"
},
"options": {
"textFormat": {
"textOptions": {
"type": "json_object"
}
}
},
"responses": {
"values": [
{
"role": "system",
"content": "You are a LinkedIn profile data extractor. Extract structured data from the LinkedIn profile JSON provided and return ONLY a valid JSON object matching this exact schema. No prose, no commentary, no markdown fences.\n\nSchema:\n{\n \"current_title\": \"string or null\",\n \"current_company\": \"string or null\",\n \"seniority_level\": \"IC | Manager | Director | VP | C-level | Founder | Unknown\",\n \"years_experience_estimate\": \"number or null\",\n \"industry\": \"string or null\",\n \"location_city\": \"string or null\",\n \"location_country\": \"string or null\",\n \"tech_stack\": [\"array of technologies, tools, programming languages, or domain skills\"],\n \"top_certifications\": [\"array of max 3 most relevant certifications\"],\n \"one_line_summary\": \"string, 1 sentence professional summary\"\n}\n\nRules:\n- Infer seniority from title, experience, and position\n- Infer tech_stack from experience, activity posts, and about sections\n- Use country codes from country_code field or infer from city\n- If a field cannot be determined, return null or empty array\n- Return valid JSON only, no code blocks"
},
{
"content": "=LinkedIn profile data:\n\n{{ JSON.stringify($json) }}"
}
]
},
"builtInTools": {}
},
"typeVersion": 2.1
},
{
"id": "99e5dbfb-d992-4b72-893f-c0f90d20f2a8",
"name": "Update Airtable Record",
"type": "n8n-nodes-base.airtable",
"position": [
304,
1696
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "YOUR_AIRTABLE_BASE_ID",
"cachedResultUrl": "",
"cachedResultName": "Lead Enrichment"
},
"table": {
"__rl": true,
"mode": "list",
"value": "YOUR_AIRTABLE_TABLE_ID",
"cachedResultUrl": "",
"cachedResultName": "Leads"
},
"columns": {
"value": {
"id": "={{ $('Airtable Trigger1').item.json.id }}",
"Status": "Enriched",
"Industry": "={{ $json.output[0].content[0].text.industry }}",
"Job Title": "={{ $json.output[0].content[0].text.current_title }}",
"AI Summary": "={{ $json.output[0].content[0].text.one_line_summary }}",
"Tech Stack": "={{ $json.output[0].content[0].text.tech_stack.join(\", \") }}",
"Enriched At": "={{ $now.toISO() }}",
"Location City": "={{ $json.output[0].content[0].text.location_city }}",
"Current Company": "={{ $json.output[0].content[0].text.current_company }}",
"Seniority Level": "={{ $json.output[0].content[0].text.seniority_level }}",
"Location Country": "={{ $json.output[0].content[0].text.location_country }}",
"Years Experience": "={{ Math.round($json.output[0].content[0].text.years_experience_estimate) }}",
"Top Certifications": "={{ $json.output[0].content[0].text.top_certifications.join(\", \") }}"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "LinkedIn URL",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "LinkedIn URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Source",
"type": "options",
"display": true,
"options": [
{
"name": "Manual",
"value": "Manual"
},
{
"name": "Import",
"value": "Import"
},
{
"name": "Webform",
"value": "Webform"
},
{
"name": "API",
"value": "API"
},
{
"name": "Other",
"value": "Other"
},
{
"name": "LinkedIn",
"value": "LinkedIn"
},
{
"name": "Referral",
"value": "Referral"
},
{
"name": "Website",
"value": "Website"
},
{
"name": "Event",
"value": "Event"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Source",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "options",
"display": true,
"options": [
{
"name": "To enrich",
"value": "To enrich"
},
{
"name": "Enriching",
"value": "Enriching"
},
{
"name": "Enriched",
"value": "Enriched"
},
{
"name": "Failed",
"value": "Failed"
},
{
"name": "Skipped",
"value": "Skipped"
},
{
"name": "Contacted",
"value": "Contacted"
},
{
"name": "New",
"value": "New"
},
{
"name": "Qualified",
"value": "Qualified"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Job Title",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Job Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Current Company",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Current Company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Seniority Level",
"type": "options",
"display": true,
"options": [
{
"name": "IC",
"value": "IC"
},
{
"name": "Manager",
"value": "Manager"
},
{
"name": "Director",
"value": "Director"
},
{
"name": "VP",
"value": "VP"
},
{
"name": "C-level",
"value": "C-level"
},
{
"name": "Founder",
"value": "Founder"
},
{
"name": "Unknown",
"value": "Unknown"
},
{
"name": "Mid-level",
"value": "Mid-level"
},
{
"name": "Senior",
"value": "Senior"
},
{
"name": "Entry-level",
"value": "Entry-level"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Seniority Level",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Years Experience",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Years Experience",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Industry",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Industry",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Location City",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Location City",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Location Country",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Location Country",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Tech Stack",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Tech Stack",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Top Certifications",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Top Certifications",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "AI Summary",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "AI Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Enriched At",
"type": "dateTime",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Enriched At",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Enrichment Error",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Enrichment Error",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update"
},
"typeVersion": 2.2
},
{
"id": "b3d02c84-889b-43b3-a9ff-a59b412bf7ee",
"name": "Notify Slack",
"type": "n8n-nodes-base.slack",
"position": [
672,
1808
],
"parameters": {
"text": "=:sparkles: *New enriched lead in Airtable*\n\n*{{ $('Airtable Trigger1').item.json.fields.Name }}*\n{{ $('Extract Structured Data').item.json.output[0].content[0].text.current_title }} at {{ $('Extract Structured Data').item.json.output[0].content[0].text.current_company }}\n\n*Seniority:* {{ $('Extract Structured Data').item.json.output[0].content[0].text.seniority_level }}\n*Location:* {{ $('Extract Structured Data').item.json.output[0].content[0].text.location_country }}\n*Industry:* {{ $('Extract Structured Data').item.json.output[0].content[0].text.industry }}\n*Tech stack:* {{ $('Extract Structured Data').item.json.output[0].content[0].text.tech_stack }}\n\n> {{ $('Extract Structured Data').item.json.output[0].content[0].text.one_line_summary }}\n\n<{{ $('Airtable Trigger1').item.json.fields[\"LinkedIn URL\"] }}|View LinkedIn profile>",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "YOUR_SLACK_CHANNEL_ID",
"cachedResultName": "leads"
},
"otherOptions": {},
"authentication": "oAuth2"
},
"typeVersion": 2.4
},
{
"id": "d4e1ab5f-7479-4417-8317-8679cd24b6f5",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1504,
272
],
"parameters": {
"color": 7,
"width": 460,
"height": 820,
"content": "## \ud83e\udd16 AI Lead Enrichment with LinkedIn, BrightData, OpenAI & Slack\n\nAutomatically enrich every new LinkedIn lead with AI-structured data and notify your team in Slack.\n\n### What it does\n1. **Detects** new leads in your CRM\n2. **Scrapes** the LinkedIn profile via BrightData\n3. **Extracts** structured data (title, company, seniority, tech stack\u2026) with GPT-5-mini\n4. **Updates** the CRM record with enriched fields\n5. **Notifies** your team in Slack with a beautiful summary\n\n### \ud83d\udd04 CRM-agnostic\nThis template uses **Airtable** as a reference, but you can easily swap it for:\n- HubSpot, Salesforce, Pipedrive, Attio, Close\n- Notion, Google Sheets, Monday.com, ClickUp\n- Any database (Postgres, MySQL, MongoDB, Supabase\u2026)\n\nJust replace the **Airtable Trigger** and **Update Airtable Record** nodes with the equivalent for your stack. The rest of the flow stays identical.\n\n### Prerequisites\n- A CRM or database with a \"Leads\" collection containing a `LinkedIn URL` field\n- A [BrightData](https://brightdata.com) account with the *LinkedIn people profiles* dataset enabled\n- An [OpenAI](https://platform.openai.com) API key (GPT-5-mini or any model)\n- A [Slack](https://slack.com) workspace with a channel for notifications\n\n### Setup\n1. Connect your **CRM**, **BrightData**, **OpenAI** and **Slack** credentials\n2. If using a different CRM: replace the trigger and update nodes\n3. Select your Slack **channel** in the notification node\n4. Activate the workflow"
},
"typeVersion": 1
},
{
"id": "f1b6c3a7-c497-4b8c-bebe-6c7e24cc7a39",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-976,
880
],
"parameters": {
"color": 4,
"width": 300,
"height": 212,
"content": "## 1\ufe0f\u20e3 New Lead Trigger\nPolls **Airtable** every minute for new records via the `Created Time` field.\n\n\ud83d\udd04 **Swap for any CRM:** replace this node with a HubSpot, Salesforce, Notion, Pipedrive, Google Sheets\u2026 trigger. Just make sure the output contains a **LinkedIn URL** field."
},
"typeVersion": 1
},
{
"id": "bdcfc13b-028f-4d4d-9719-861de2d48c2c",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-576,
1040
],
"parameters": {
"color": 3,
"width": 284,
"height": 228,
"content": "## 2\ufe0f\u20e3 Scrape LinkedIn\nCalls **BrightData**'s *LinkedIn people profiles* dataset with the lead's LinkedIn URL.\n\nReturns the full public profile as JSON:\n- experience, education, skills\n- about, activity, certifications\n- location & company info"
},
"typeVersion": 1
},
{
"id": "1c91a8cf-dc3c-4c83-95ea-66f8ee057139",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-208,
1168
],
"parameters": {
"color": 5,
"width": 300,
"height": 324,
"content": "## 3\ufe0f\u20e3 AI Structured Extraction\nUses **GPT-5-mini** to turn the raw profile JSON into a clean, structured schema:\n- title, company, seniority\n- years of experience\n- industry, location\n- tech stack & certifications\n- 1-line professional summary\n\nReturns strict JSON (no prose, no markdown). Feel free to swap for any LLM (Claude, Gemini, Mistral\u2026)."
},
"typeVersion": 1
},
{
"id": "06c40226-b39b-43e4-aef8-655635522b12",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
208,
1392
],
"parameters": {
"color": 6,
"width": 300,
"height": 284,
"content": "## 4\ufe0f\u20e3 Update CRM Record\nWrites the enriched data back to **Airtable**:\n- sets **Status** = `Enriched`\n- fills all enrichment fields\n- stamps **Enriched At** with the current ISO date\n\n\ud83d\udd04 **Swap for any CRM:** replace with the HubSpot, Salesforce, Notion, Pipedrive\u2026 update node. The mapping stays the same."
},
"typeVersion": 1
},
{
"id": "9c301acc-cee2-4166-803e-62513457d503",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
576,
1520
],
"parameters": {
"color": 2,
"width": 300,
"height": 284,
"content": "## 5\ufe0f\u20e3 Team Notification\nPosts a nicely formatted message in **Slack** with:\n- Name, title, company\n- Seniority, location, industry, tech stack\n- 1-line AI summary\n- Link to the LinkedIn profile\n\n\ud83d\udd04 **Swap for any channel:** Discord, Microsoft Teams, Telegram, email, SMS\u2026"
},
"typeVersion": 1
},
{
"id": "8dc419e0-5a6f-468f-abde-e756bd9b820c",
"name": "Airtable Trigger1",
"type": "n8n-nodes-base.airtableTrigger",
"position": [
-864,
1104
],
"parameters": {
"baseId": {
"__rl": true,
"mode": "id",
"value": "YOUR_AIRTABLE_BASE_ID"
},
"tableId": {
"__rl": true,
"mode": "id",
"value": "YOUR_AIRTABLE_TABLE_ID"
},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"triggerField": "Created Time",
"authentication": "airtableTokenApi",
"additionalFields": {}
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "c46f864d-f315-456b-a9c2-c9cb30c3b769",
"connections": {
"Airtable Trigger1": {
"main": [
[
{
"node": "Scrape LinkedIn Profile",
"type": "main",
"index": 0
}
]
]
},
"Update Airtable Record": {
"main": [
[
{
"node": "Notify Slack",
"type": "main",
"index": 0
}
]
]
},
"Extract Structured Data": {
"main": [
[
{
"node": "Update Airtable Record",
"type": "main",
"index": 0
}
]
]
},
"Scrape LinkedIn Profile": {
"main": [
[
{
"node": "Extract Structured Data",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Automatically enriches every new LinkedIn lead added to your Airtable base with AI-structured data and notifies your team in Slack. Airtable Trigger polls for new leads every minute BrightData scrapes the LinkedIn profile OpenAI GPT-5-mini extracts a clean structured schema…
Source: https://n8n.io/workflows/15247/ — 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.
Automatically qualify, score, and route new leads using a hybrid AI + rule-based scoring engine. This workflow analyzes incoming leads from Airtable, enriches them with OpenAI-powered qualification, a
This workflow automatically turns any audio file uploaded to Google Drive into a complete podcast episode. It handles transcription, content generation, blog drafting, social copy creation, thumbnail
Some use cases: Sales follow-ups, auto-qualifying leads based on budget, monetizing low-budget leads, and automatic data entry. Ingestion: When a call recording is uploaded to a specific Google Drive
This workflow automatically monitors new Zendesk support tickets, identifies VIP customers, generates AI-based ticket summaries, alerts available support agents on Slack and sends a consolidated email
Some use cases: "Speed-to-Lead" optimization, lead enrichment, automated prospect research. Ingestion: A lead submits their details (Name, Email, Website) via a form. Intelligent scraping: The workflo