LinkedIn 잠재 고객 정보 풍부화 및 AI 개인화 추격
고급
이것은Content Creation, Multimodal AI분야의자동화 워크플로우로, 18개의 노드를 포함합니다.주로 If, Set, Code, Wait, SplitOut 등의 노드를 사용하며. LinkedIn 잠재 고객 정보 풍부화 및 개인화된 콜드 콜, Hunter.io, GPT-4 및 Sheets 통합
사전 요구사항
- •대상 API의 인증 정보가 필요할 수 있음
- •Google Sheets API 인증 정보
- •OpenAI API Key
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "",
"meta": {
"instanceId": "your-instance-id-here",
"templateCredsSetupCompleted": false
},
"name": "LinkedIn Lead Enrichment with AI Personalization for Cold Outreach",
"tags": [
{
"id": "1",
"name": "Sales",
"createdAt": "2025-01-01T00:00:00.000Z",
"updatedAt": "2025-01-01T00:00:00.000Z"
},
{
"id": "2",
"name": "Lead Generation",
"createdAt": "2025-01-01T00:00:00.000Z",
"updatedAt": "2025-01-01T00:00:00.000Z"
},
{
"id": "3",
"name": "AI",
"createdAt": "2025-01-01T00:00:00.000Z",
"updatedAt": "2025-01-01T00:00:00.000Z"
}
],
"nodes": [
{
"id": "workflow-overview-note",
"name": "📋 워크플로우 개요 및 설정 가이드",
"type": "n8n-nodes-base.stickyNote",
"position": [
-420,
240
],
"parameters": {
"color": 4,
"width": 680,
"height": 620,
"content": "## 🎯 LinkedIn Lead Enrichment with AI Personalization\n\n### **Who's it for:**\nSales teams, growth marketers, and business development professionals who want to automate lead research and create personalized outreach at scale.\n\n### **What it does:**\n- Scrapes LinkedIn profiles to extract professional information\n- Enriches leads with email addresses using hunter.io\n- Generates personalized outreach messages using AI\n- Stores enriched data in Google Sheets for easy management\n\n### **How to set up:**\n1. **Configure Google Sheets:** Create a sheet with columns: Name, LinkedIn URL, Email, Company, Title, Personalized Message\n2. **Set up credentials:** Add your OpenAI API key and Hunter.io API key in n8n credentials\n3. **Customize the AI prompt:** Edit the OpenAI node to match your outreach style and value proposition\n4. **Test with sample data:** Start with 2-3 LinkedIn URLs before scaling\n\n### **Requirements:**\n- OpenAI API key (GPT-4 recommended for best personalization)\n- Hunter.io API key for email finding\n- Google Sheets access\n- LinkedIn profile URLs of your target leads\n\n### **How to customize:**\n- **Change AI tone:** Modify the system prompt in the OpenAI node\n- **Add more data sources:** Integrate company website scraping\n- **Filter leads:** Add conditional logic to qualify leads before enrichment\n- **Connect to CRM:** Replace Google Sheets with Salesforce, HubSpot, or Pipedrive\n\n💡 **Pro Tip:** Use the \"Set Fields\" node to easily update your target industry and value proposition without editing multiple nodes.\n\n📺 **Watch Setup Guide:** [Add your Loom video link here]\n\n⚠️ **Important:** This workflow uses community nodes for LinkedIn scraping. Self-hosted n8n instance required."
},
"typeVersion": 1
},
{
"id": "step-1-note",
"name": "Step 1 컨텍스트",
"type": "n8n-nodes-base.stickyNote",
"position": [
140,
240
],
"parameters": {
"color": 7,
"width": 380,
"height": 180,
"content": "## Step 1: Configure Your Campaign\n\nSet your target criteria and personalization variables here.\n\nThis makes it easy to update without touching other nodes."
},
"typeVersion": 1
},
{
"id": "step-2-note",
"name": "Step 2 컨텍스트",
"type": "n8n-nodes-base.stickyNote",
"position": [
660,
240
],
"parameters": {
"color": 7,
"width": 380,
"height": 180,
"content": "## Step 2: Extract LinkedIn Data\n\nScrape professional information from LinkedIn profiles.\n\n⚠️ Rate limit: Max 20 profiles per minute"
},
"typeVersion": 1
},
{
"id": "step-3-note",
"name": "Step 3 컨텍스트",
"type": "n8n-nodes-base.stickyNote",
"position": [
1180,
240
],
"parameters": {
"color": 7,
"width": 380,
"height": 180,
"content": "## Step 3: Find Email Addresses\n\nUse Hunter.io to find verified work emails.\n\nFallback to company domain + name patterns if not found."
},
"typeVersion": 1
},
{
"id": "step-4-note",
"name": "Step 4 컨텍스트",
"type": "n8n-nodes-base.stickyNote",
"position": [
1700,
240
],
"parameters": {
"color": 7,
"width": 380,
"height": 180,
"content": "## Step 4: AI Personalization\n\nGenerate custom outreach messages based on:\n- Job title\n- Company info\n- Recent activity\n- Your value proposition"
},
"typeVersion": 1
},
{
"id": "step-5-note",
"name": "Step 5 컨텍스트",
"type": "n8n-nodes-base.stickyNote",
"position": [
2220,
240
],
"parameters": {
"color": 7,
"width": 380,
"height": 180,
"content": "## Step 5: Store Enriched Leads\n\nSave all enriched data to Google Sheets for review and outreach."
},
"typeVersion": 1
},
{
"id": "campaign-settings-node",
"name": "캠페인 변수 설정",
"type": "n8n-nodes-base.set",
"position": [
180,
480
],
"parameters": {
"mode": "raw",
"options": {},
"jsonOutput": "{\n \"target_industry\": \"SaaS\",\n \"target_role\": \"Head of Sales\",\n \"company_name\": \"YourCompany\",\n \"value_proposition\": \"We help sales teams book 30% more meetings using AI-powered personalization\",\n \"linkedin_urls\": [\n \"https://www.linkedin.com/in/sample-profile-1\",\n \"https://www.linkedin.com/in/sample-profile-2\"\n ]\n}"
},
"typeVersion": 3.4
},
{
"id": "split-urls-node",
"name": "LinkedIn URL 분할",
"type": "n8n-nodes-base.splitOut",
"position": [
380,
480
],
"parameters": {
"options": {},
"fieldToSplitOut": "linkedin_urls"
},
"typeVersion": 1
},
{
"id": "scrape-linkedin-node",
"name": "LinkedIn 프로필 스크래핑",
"type": "n8n-nodes-base.httpRequest",
"position": [
700,
480
],
"parameters": {
"url": "={{ $json.linkedin_urls }}",
"options": {
"timeout": 10000
},
"sendHeaders": true,
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "User-Agent",
"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "parse-linkedin-data-node",
"name": "LinkedIn 데이터 파싱",
"type": "n8n-nodes-base.code",
"position": [
900,
480
],
"parameters": {
"jsCode": "// Extract key information from LinkedIn HTML\nconst html = $input.item.json.data || '';\n\n// Helper function to extract text between patterns\nfunction extractText(pattern, text) {\n const match = text.match(pattern);\n return match ? match[1].trim() : null;\n}\n\n// Extract name\nconst name = extractText(/<title>([^|]+)/, html) || 'Unknown';\n\n// Extract current position\nconst title = extractText(/aria-label=\"Current position[^>]*>([^<]+)/, html) || 'Not specified';\n\n// Extract company\nconst company = extractText(/aria-label=\"Current company[^>]*>([^<]+)/, html) || 'Unknown';\n\n// Extract location\nconst location = extractText(/aria-label=\"Location[^>]*>([^<]+)/, html) || 'Unknown';\n\n// Clean up name\nconst cleanName = name.replace(/[\\|\\-].*$/, '').trim();\nconst nameParts = cleanName.split(' ');\nconst firstName = nameParts[0] || '';\nconst lastName = nameParts.slice(1).join(' ') || '';\n\nreturn {\n full_name: cleanName,\n first_name: firstName,\n last_name: lastName,\n title: title,\n company: company,\n location: location,\n linkedin_url: $json.linkedin_urls,\n raw_html: html.substring(0, 1000) // Keep snippet for debugging\n};"
},
"typeVersion": 2
},
{
"id": "find-email-node",
"name": "Hunter.io로 이메일 찾기",
"type": "n8n-nodes-base.httpRequest",
"position": [
1220,
480
],
"parameters": {
"url": "=https://api.hunter.io/v2/email-finder",
"method": "GET",
"options": {
"response": {
"response": {
"neverError": true
}
}
},
"sendQuery": true,
"authentication": "genericCredentialType",
"genericAuthType": "queryAuth",
"queryParameters": {
"parameters": [
{
"name": "domain",
"value": "={{ $json.company.toLowerCase().replace(/[^a-z0-9]/g, '') }}.com"
},
{
"name": "first_name",
"value": "={{ $json.first_name }}"
},
{
"name": "last_name",
"value": "={{ $json.last_name }}"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "process-email-node",
"name": "이메일 결과 처리",
"type": "n8n-nodes-base.code",
"position": [
1420,
480
],
"parameters": {
"jsCode": "// Extract email from Hunter.io response\nconst hunterData = $input.item.json.data || {};\nconst emailData = hunterData.email || null;\n\n// Get previous node data\nconst leadData = $('Parse LinkedIn Data').item.json;\n\nreturn {\n ...leadData,\n email: emailData,\n email_confidence: hunterData.score || 0,\n email_verified: emailData ? true : false\n};"
},
"typeVersion": 2
},
{
"id": "check-email-exists-node",
"name": "이메일 발견됨?",
"type": "n8n-nodes-base.if",
"position": [
1620,
480
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "email-exists-condition",
"operator": {
"type": "string",
"operation": "isNotEmpty"
},
"leftValue": "={{ $json.email }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "generate-personalization-node",
"name": "AI 개인화 생성",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
1900,
400
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4-turbo-preview",
"cachedResultName": "GPT-4 Turbo"
},
"options": {},
"messages": {
"values": [
{
"content": "=You are an expert sales copywriter. Generate a highly personalized cold outreach message based on the prospect's information.\n\n**Prospect Details:**\n- Name: {{ $json.first_name }} {{ $json.last_name }}\n- Title: {{ $json.title }}\n- Company: {{ $json.company }}\n- Location: {{ $json.location }}\n\n**Our Company:** {{ $('Set Campaign Variables').item.json.company_name }}\n**Value Proposition:** {{ $('Set Campaign Variables').item.json.value_proposition }}\n\n**Instructions:**\n1. Start with a personalized opener that references their role or company\n2. Clearly state the value proposition in one sentence\n3. Include a soft call-to-action\n4. Keep it under 100 words\n5. Professional but conversational tone\n6. No hype or pushy language\n\n**Output Format:**\nProvide ONLY the message body, no subject line or greetings. Return as JSON:\n{\n \"message\": \"your personalized message here\"\n}"
}
]
},
"jsonOutput": true
},
"typeVersion": 1.8
},
{
"id": "save-to-sheets-node",
"name": "Google Sheets에 저장",
"type": "n8n-nodes-base.googleSheets",
"position": [
2260,
480
],
"parameters": {
"columns": {
"value": {
"Email": "={{ $json.email }}",
"Title": "={{ $json.title }}",
"Company": "={{ $json.company }}",
"Location": "={{ $json.location }}",
"Full Name": "={{ $json.full_name }}",
"Last Name": "={{ $json.last_name }}",
"First Name": "={{ $json.first_name }}",
"LinkedIn URL": "={{ $json.linkedin_url }}",
"Enriched Date": "={{ $now.toFormat('yyyy-MM-dd HH:mm:ss') }}",
"Email Confidence": "={{ $json.email_confidence }}",
"Personalized Message": "={{ $json.ai_message }}"
},
"schema": [],
"mappingMode": "defineBelow",
"matchingColumns": []
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_GOOGLE_SHEET_ID",
"cachedResultName": "Lead Enrichment Sheet"
}
},
"typeVersion": 4.5
},
{
"id": "merge-ai-data-node",
"name": "AI 메시지 병합",
"type": "n8n-nodes-base.code",
"position": [
2100,
400
],
"parameters": {
"jsCode": "// Merge AI-generated message with lead data\nconst leadData = $('Process Email Result').item.json;\nconst aiResponse = $input.item.json.message?.content || {};\nconst aiMessage = aiResponse.message || 'Personalization failed - manual review needed';\n\nreturn {\n ...leadData,\n ai_message: aiMessage,\n processing_timestamp: new Date().toISOString()\n};"
},
"typeVersion": 2
},
{
"id": "no-email-found-node",
"name": "이메일 없음 - 건너뛰기",
"type": "n8n-nodes-base.noOp",
"position": [
1900,
560
],
"parameters": {},
"typeVersion": 1
},
{
"id": "rate-limit-wait-node",
"name": "속도 제한 지연",
"type": "n8n-nodes-base.wait",
"position": [
560,
480
],
"webhookId": "rate-limit-webhook-id",
"parameters": {
"unit": "seconds",
"amount": 2
},
"typeVersion": 1.1
}
],
"active": false,
"pinData": {},
"settings": {
"callerPolicy": "workflowsFromSameOwner",
"errorWorkflow": "",
"executionOrder": "v1",
"saveManualExecutions": true
},
"versionId": "",
"connections": {
"check-email-exists-node": {
"main": [
[
{
"node": "generate-personalization-node",
"type": "main",
"index": 0
}
],
[
{
"node": "no-email-found-node",
"type": "main",
"index": 0
}
]
]
},
"merge-ai-data-node": {
"main": [
[
{
"node": "save-to-sheets-node",
"type": "main",
"index": 0
}
]
]
},
"rate-limit-wait-node": {
"main": [
[
{
"node": "scrape-linkedin-node",
"type": "main",
"index": 0
}
]
]
},
"parse-linkedin-data-node": {
"main": [
[
{
"node": "find-email-node",
"type": "main",
"index": 0
}
]
]
},
"split-urls-node": {
"main": [
[
{
"node": "rate-limit-wait-node",
"type": "main",
"index": 0
}
]
]
},
"process-email-node": {
"main": [
[
{
"node": "check-email-exists-node",
"type": "main",
"index": 0
}
]
]
},
"campaign-settings-node": {
"main": [
[
{
"node": "split-urls-node",
"type": "main",
"index": 0
}
]
]
},
"scrape-linkedin-node": {
"main": [
[
{
"node": "parse-linkedin-data-node",
"type": "main",
"index": 0
}
]
]
},
"find-email-node": {
"main": [
[
{
"node": "process-email-node",
"type": "main",
"index": 0
}
]
]
},
"generate-personalization-node": {
"main": [
[
{
"node": "merge-ai-data-node",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 콘텐츠 제작, 멀티모달 AI
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
Groq, Gemini, Slack 승인 시스템을 사용한 RSS에서 Medium 자동 게시
Groq, Gemini 및 Slack 승인 시스템을 통한 RSS에서 Medium 발행 자동화 워크플로
If
Set
Code
+
If
Set
Code
41 노드ObisDev
콘텐츠 제작
批量 SEO 콘텐츠 생성 및 AI 이미지 포함 Webflow 드래그 앤 드롭 생성 (템플릿)
GPT, Gemini 이미지, Webflow 드라フト를 사용하여 대량 SEO 콘텐츠 생성
If
Set
Code
+
If
Set
Code
54 노드Dahiana
콘텐츠 제작
1. 플레이리스트 상세 설정 로봇 복사본
Suno, GPT-4, Runway, Creatomate로 AI 생성 YouTube 음악 플레이리스트 생성
If
Set
Code
+
If
Set
Code
203 노드Joseph
콘텐츠 제작
매일 WhatsApp 그룹 지능형 분석: GPT-4.1 분석 및 음성 메시지 변환
매일 WhatsApp 그룹 지능 분석: GPT-4.1 분석 및 음성 메시지 트랜스크립션
If
Set
Code
+
If
Set
Code
52 노드Daniel Lianes
기타
AI 기반 동영상 제작 및 Instagram, TikTok, YouTube 업로드
클라우드 드라이브 기반 AI 기반 비디오 제작 및 Instagram, TikTok, YouTube 업로드
If
Set
Code
+
If
Set
Code
53 노드DevCode Journey
콘텐츠 제작
Printify 자동화 - 제목 및 설명 업데이트 - AlexK1919
GPT-4o-mini를 사용하여 Printify용 SEO 제품 제목 및 설명 자동 생성
If
Set
Code
+
If
Set
Code
26 노드Amit Mehta
콘텐츠 제작
워크플로우 정보
난이도
고급
노드 수18
카테고리2
노드 유형10
저자
Amirul Hakimi
@amirulhaaakimiCS Student Specializing in Artificial Intelligence @UNITEN | Certified in CRO & Copywriting for High-Impact Digital Growth
외부 링크
n8n.io에서 보기 →
이 워크플로우 공유