This workflow corresponds to n8n.io template #4794 — we link there as the canonical source.
This workflow follows the Agent → Google Sheets 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": "wAomRf96IfSnpTA7",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Upwork Job Poster Email",
"tags": [],
"nodes": [
{
"id": "aa72ce26-28ae-4dab-982f-be16fa123d87",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
420,
360
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "94fba561-bc7e-4180-9b5d-beb9482b28b6",
"name": "Run Every X Hours",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
0,
140
],
"parameters": {
"rule": {
"interval": [
{
"field": "hours"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "603403fa-6f4b-4124-90ee-f852954e67a4",
"name": "Fetch Latest Upwork Jobs (Apify)",
"type": "n8n-nodes-base.httpRequest",
"position": [
220,
140
],
"parameters": {
"url": "https://api.apify.com/v2/actor-tasks/<TASK_ID>/run-sync-get-dataset-items?token=<API_TOKEN>",
"options": {},
"sendBody": true,
"bodyParameters": {
"parameters": [
{}
]
}
},
"typeVersion": 4.2
},
{
"id": "0ed2ab83-1fcb-459c-aa6d-ef81c8414b45",
"name": "Extract Company or Person Name from Job",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
440,
140
],
"parameters": {
"text": "=Title: {{ $json.title }}\nDescription: {{ $json.description }}",
"options": {
"systemMessage": "\"Extract the client's name or company name if it is mentioned. Return only the name or 'null' if not found.\""
},
"promptType": "define"
},
"typeVersion": 1.9
},
{
"id": "ccd6cf3c-2666-45eb-8dc3-6575180c897b",
"name": "Name is Found?",
"type": "n8n-nodes-base.if",
"position": [
800,
140
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "7366a7c6-e767-4aea-96e1-0cbbcbb26100",
"operator": {
"type": "string",
"operation": "notEquals"
},
"leftValue": "={{ $json.output }}",
"rightValue": "null"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "c9721e93-707d-45c1-a06b-68606157f995",
"name": "No Name Found - End Early",
"type": "n8n-nodes-base.noOp",
"position": [
1240,
320
],
"parameters": {},
"typeVersion": 1
},
{
"id": "4164b6e9-9ba7-4fc6-a1b6-c976f626aea5",
"name": "Is It a Person or Company?",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1180,
40
],
"parameters": {
"text": "={{ $json.output }}",
"options": {
"systemMessage": "\"Extract the client's name or company name. Return only the 'person' if looks like a person's name if not return 'company'.\"\n"
},
"promptType": "define"
},
"typeVersion": 1.9
},
{
"id": "93c7b341-6257-4ee2-a54f-ecbfcdf0f89b",
"name": "Person or Company?",
"type": "n8n-nodes-base.if",
"position": [
1540,
40
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "729e7baa-ae94-4661-a061-7d656faf820f",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.output }}",
"rightValue": "company"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "7dcacf79-eb65-454c-97fd-16ea6aed2f94",
"name": "Search LinkedIn for Company (Phantombuster)",
"type": "n8n-nodes-base.httpRequest",
"position": [
1960,
-120
],
"parameters": {
"url": "https://api.phantombuster.com/api/v2/agents/<AGENT_ID>/launch",
"method": "POST",
"options": {},
"jsonBody": "={\n \"argument\": {\n \"search\": {{ $json.output }},\n \"numberOfProfiles\": 5,\n \"sessionCookie\": \"<LINKEDIN_SESSION_COOKIE>\"\n },\n \"saveArguments\": true\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "X-Phantombuster-Key-1",
"value": "<YOUR_API_KEY>"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "e2f7db77-373e-462a-bc57-57653e067e30",
"name": "Scrape LinkedIn Company Profile",
"type": "n8n-nodes-base.httpRequest",
"position": [
2180,
-120
],
"parameters": {
"url": "https://api.phantombuster.com/api/v2/agents/<AGENT_ID>/launch",
"method": "POST",
"options": {},
"jsonBody": "={\n \"argument\": {\n \"spreadsheetUrl\": {{ $json.profileUrl }},\n \"sessionCookie\": \"<LINKEDIN_SESSION_COOKIE>\"\n },\n \"saveArguments\": true\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "X-Phantombuster-Key-1",
"value": "<YOUR_API_KEY>"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "14d7f669-dbc1-484e-b3c0-3d1e83d4c74f",
"name": "Find Company Email (Hunter.io)",
"type": "n8n-nodes-base.httpRequest",
"position": [
2400,
-120
],
"parameters": {
"url": "=https://api.hunter.io/v2/domain-search?domain{{ $json.website }}=&api_key=<YOUR_API_KEY>",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "4fd05ce5-495e-4d3a-8998-3120c3456e57",
"name": "Search LinkedIn for Person (Phantombuster)",
"type": "n8n-nodes-base.httpRequest",
"position": [
1960,
1280
],
"parameters": {
"url": "https://api.phantombuster.com/api/v2/agents/<AGENT_ID>/launch",
"method": "POST",
"options": {},
"jsonBody": "{\n \"argument\": {\n \"search\": {{ $json.output }},\n \"numberOfProfiles\": 3,\n \"sessionCookie\": \"<LINKEDIN_SESSION_COOKIE>\"\n },\n \"saveArguments\": true\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "X-Phantombuster-Key-1",
"value": "<YOUR_API_KEY>"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "f048e198-cc4b-4739-be7d-d3d885c6d2bb",
"name": "Scrape LinkedIn Person Profile",
"type": "n8n-nodes-base.httpRequest",
"position": [
2180,
1280
],
"parameters": {
"url": "https://api.phantombuster.com/api/v2/agents/<AGENT_ID>/launch",
"method": "POST",
"options": {},
"jsonBody": "={\n \"argument\": {\n \"spreadsheetUrl\": {{ $json.profileUrl }},\n \"sessionCookie\": \"<LINKEDIN_SESSION_COOKIE>\"\n },\n \"saveArguments\": true\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "X-Phantombuster-Key-1",
"value": "<YOUR_API_KEY>"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "dbc8c317-b469-4125-b939-614524a0339b",
"name": "Find Personal Email (Hunter.io)",
"type": "n8n-nodes-base.httpRequest",
"position": [
2400,
1280
],
"parameters": {
"url": "=https://api.hunter.io/v2/email-finder?domain={{ $json.fullName }}=Ali%20Raza&api_key=<YOUR_API_KEY>",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "047146a8-2b02-4098-a0e9-f8366c42aa4f",
"name": "Store Results in Google Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
2760,
20
],
"parameters": {
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": ""
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "1e9dee68-e0c2-4588-b6ca-666534d14dd4",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1820,
-2200
],
"parameters": {
"color": 4,
"width": 1300,
"height": 320,
"content": "=======================================\n WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n - YouTube: https://www.youtube.com/@YaronBeen/videos\n - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"
},
"typeVersion": 1
},
{
"id": "2085a7ca-f68b-490a-9dcb-3c96fc6a739d",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1820,
-1860
],
"parameters": {
"color": 4,
"width": 1289,
"height": 5558,
"content": "# \ud83d\ude80 **Automated Upwork Lead Enrichment Workflow**\n\n> \u2728 *Fetch potential clients from Upwork, extract their info using AI, search them on LinkedIn, gather emails, and store all in Google Sheets* \u2728\n\n---\n\n## \ud83e\udde9 **1. Trigger & Data Collection**\n\n---\n\n### \u23f0 `Trigger - Run Every X Hours`\n\n**\ud83d\udd27 Node Type**: Schedule Trigger\n**\ud83e\udde0 Purpose**:\nThis node starts your automation periodically. You define how often it runs (e.g., every 6 hours, daily, etc.).\n\n**\ud83d\udcda Why It\u2019s Important**:\nYou don\u2019t want to manually check Upwork every few hours. This node automates it for you.\n\n---\n\n### \ud83c\udf10 `Fetch Latest Upwork Jobs (Apify)`\n\n**\ud83d\udd27 Node Type**: HTTP Request\n**\ud83e\udde0 Purpose**:\nFetch the latest Upwork jobs by calling the [Apify Upwork Actor API](https://apify.com/).\n\n**\u2699\ufe0f Tech Behind It**:\nA simple `GET` request pulls in structured job listings (title, description, budget, etc.) as JSON data.\n\n**\ud83d\udca1 Beginner Tip**:\nNo coding needed\u2014just copy your Apify API URL with your token and plug it into the node.\n\n---\n\n## \ud83e\udd16 **2. AI Name Extraction**\n\n---\n\n### \ud83e\udde0 `AI - Extract Company or Person Name from Job`\n\n**\ud83d\udd27 Node Type**: AI Agent / OpenAI Chat\n**\ud83e\udde0 Purpose**:\nUses GPT to scan the job title + description and extract a **company name or client\u2019s full name**, if present.\n\n**\ud83d\udcda Why It\u2019s Smart**:\nClients sometimes mention names like \u201cHi, we at DevSync...\u201d or sign with their name at the bottom. This step grabs that.\n\n**\ud83e\udde0 AI Prompt Tip**:\nUse structured prompts like:\n\n> \u201cExtract a full person or company name from this job description. If not found, say 'none\u2019.\u201d\n\n---\n\n### \ud83e\uddea `IF - Name is Found?`\n\n**\ud83d\udd27 Node Type**: IF\n**\ud83e\udde0 Purpose**:\nChecks whether the AI returned a name. If not, it skips that job.\n\n**\ud83d\uded1 `No Name Found - End Early`**\nStops further processing and prevents wasted API calls or errors.\n\n---\n\n## \ud83e\udded **3. AI Classification \u2013 Person vs Company**\n\n---\n\n### \ud83e\udde0 `AI - Is It a Person or Company?`\n\n**\ud83d\udd27 Node Type**: AI Agent\n**\ud83e\udde0 Purpose**:\nClassifies the extracted name as either a **company** or a **person** using simple AI logic.\n\n**\ud83d\udd0d Why It Matters**:\nDepending on what it is, the next step\u2014searching LinkedIn\u2014will differ.\n\n---\n\n### \ud83d\udd00 `IF - Person or Company?`\n\n**\ud83d\udd27 Node Type**: IF\n**\ud83e\udde0 Purpose**:\nRoutes the flow to two different paths:\n\n* Company \u2192 Search company profile\n* Person \u2192 Search individual profile\n\n---\n\n## \ud83c\udfe2 **4A. Company Path**\n\n---\n\n### \ud83d\udd0d `Search LinkedIn for Company (Phantombuster)`\n\n**\ud83d\udd27 Node Type**: HTTP Request\n**\ud83d\udce1 Purpose**:\nUses [Phantombuster\u2019s LinkedIn Search API](https://phantombuster.com/) to search for the **company name**.\n\n**\ud83d\udce6 Input**: `\"DevSync\"`\n**\ud83d\udce4 Output**: Company\u2019s LinkedIn URL\n\n---\n\n### \ud83c\udfed `Scrape LinkedIn Company Profile`\n\n**\ud83d\udd27 Node Type**: HTTP Request\n**\ud83d\udd0d Purpose**:\nScrapes the company\u2019s LinkedIn page to pull:\n\n* Size\n* Website\n* Industry\n* Location\n* Description\n\n---\n\n### \ud83d\udcec `Find Company Email (Hunter.io)`\n\n**\ud83d\udd27 Node Type**: HTTP Request\n**\ud83d\udd0d Purpose**:\nUses [Hunter.io](https://hunter.io) to find company-level email addresses like `info@devsync.com`, `hello@devsync.com`, etc.\n\n**\ud83d\udce6 Input**: Company\u2019s domain (e.g., `devsync.com`)\n**\ud83d\udce4 Output**: Emails + Confidence Score\n\n---\n\n## \ud83d\udc64 **4B. Person Path**\n\n---\n\n### \ud83d\udd0d `Search LinkedIn for Person (Phantombuster)`\n\n**\ud83d\udd27 Node Type**: HTTP Request\n**\ud83d\udce1 Purpose**:\nSearches for the extracted **person\u2019s name** like \"John Smith\" using Phantombuster.\n\n**\ud83d\udce4 Output**: LinkedIn profile URL(s)\n\n---\n\n### \ud83e\uddd1\u200d\ud83d\udcbc `Scrape LinkedIn Person Profile`\n\n**\ud83d\udd27 Node Type**: HTTP Request\n**\ud83d\udcc4 Purpose**:\nScrapes:\n\n* Name\n* Current Job Title\n* Company\n* Location\n* Education\n* LinkedIn URL\n\n---\n\n### \u2709\ufe0f `Find Personal Email (Hunter.io)`\n\n**\ud83d\udd27 Node Type**: HTTP Request\n**\ud83d\udd0d Purpose**:\nAttempts to find personal emails using the name + company domain.\n\n**\ud83d\udce4 Output**: Email (if public), sometimes with confidence score.\n\n---\n\n## \ud83d\udcd1 **5. Store Everything in Google Sheets**\n\n---\n\n### \ud83e\uddfe `Store Results in Google Sheet`\n\n**\ud83d\udd27 Node Type**: Google Sheets (Append Row)\n**\ud83e\udde0 Purpose**:\nSaves:\n\n* Job title\n* Description\n* Client Name\n* Person/Company\n* LinkedIn Profile\n* Scraped Info\n* Emails\n\n**\ud83d\udcda Why It\u2019s Gold**:\nYou now have a **personal CRM of Upwork clients** to reach out to directly or research further.\n\n---\n\n## \ud83c\udf1f **Summary of Benefits**\n\n| \u2705 Feature | \ud83d\udca1 Benefit |\n| ---------------------- | ------------------------------------- |\n| Fully automated | Save hours of manual research |\n| Uses AI | No need to write complex regex or NLP |\n| Phantombuster scraping | Get verified LinkedIn profiles |\n| Hunter.io | Helps gather email leads |\n| Google Sheets | Easy to filter, review, and manage |\n\n---\n\n## \ud83d\udccc **Beginner Tips**\n\n* \ud83e\uddea Start with dummy job data and test just the first few nodes.\n* \ud83d\udd11 Always **secure your API keys** using environment variables or secrets.\n* \ud83e\udde0 Use **n8n\u2019s execution log** to debug any failures.\n* \ud83e\uddf9 Add rate-limiting or error handling if APIs return errors or limits.\n\n---\n\nWould you like a Notion-ready documentation, downloadable PDF, or HTML guide for your team or clients?\n"
},
"typeVersion": 1
},
{
"id": "5bda85dd-7559-4239-9b38-c887a39dbb54",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-60,
-2180
],
"parameters": {
"color": 3,
"width": 1800,
"height": 2680,
"content": "## \ud83e\udde9 **1. Trigger & Data Collection**\n\n---\n\n### \u23f0 `Trigger - Run Every X Hours`\n\n**\ud83d\udd27 Node Type**: Schedule Trigger\n**\ud83e\udde0 Purpose**:\nThis node starts your automation periodically. You define how often it runs (e.g., every 6 hours, daily, etc.).\n\n**\ud83d\udcda Why It\u2019s Important**:\nYou don\u2019t want to manually check Upwork every few hours. This node automates it for you.\n\n---\n\n### \ud83c\udf10 `Fetch Latest Upwork Jobs (Apify)`\n\n**\ud83d\udd27 Node Type**: HTTP Request\n**\ud83e\udde0 Purpose**:\nFetch the latest Upwork jobs by calling the [Apify Upwork Actor API](https://apify.com/).\n\n**\u2699\ufe0f Tech Behind It**:\nA simple `GET` request pulls in structured job listings (title, description, budget, etc.) as JSON data.\n\n**\ud83d\udca1 Beginner Tip**:\nNo coding needed\u2014just copy your Apify API URL with your token and plug it into the node.\n\n---\n\n## \ud83e\udd16 **2. AI Name Extraction**\n\n---\n\n### \ud83e\udde0 `AI - Extract Company or Person Name from Job`\n\n**\ud83d\udd27 Node Type**: AI Agent / OpenAI Chat\n**\ud83e\udde0 Purpose**:\nUses GPT to scan the job title + description and extract a **company name or client\u2019s full name**, if present.\n\n**\ud83d\udcda Why It\u2019s Smart**:\nClients sometimes mention names like \u201cHi, we at DevSync...\u201d or sign with their name at the bottom. This step grabs that.\n\n**\ud83e\udde0 AI Prompt Tip**:\nUse structured prompts like:\n\n> \u201cExtract a full person or company name from this job description. If not found, say 'none\u2019.\u201d\n\n---\n\n### \ud83e\uddea `IF - Name is Found?`\n\n**\ud83d\udd27 Node Type**: IF\n**\ud83e\udde0 Purpose**:\nChecks whether the AI returned a name. If not, it skips that job.\n\n**\ud83d\uded1 `No Name Found - End Early`**\nStops further processing and prevents wasted API calls or errors.\n\n---\n\n## \ud83e\udded **3. AI Classification \u2013 Person vs Company**\n\n---\n\n### \ud83e\udde0 `AI - Is It a Person or Company?`\n\n**\ud83d\udd27 Node Type**: AI Agent\n**\ud83e\udde0 Purpose**:\nClassifies the extracted name as either a **company** or a **person** using simple AI logic.\n\n**\ud83d\udd0d Why It Matters**:\nDepending on what it is, the next step\u2014searching LinkedIn\u2014will differ.\n\n---\n\n### \ud83d\udd00 `IF - Person or Company?`\n\n**\ud83d\udd27 Node Type**: IF\n**\ud83e\udde0 Purpose**:\nRoutes the flow to two different paths:\n\n* Company \u2192 Search company profile\n* Person \u2192 Search individual profile"
},
"typeVersion": 1
},
{
"id": "aa30a465-97e4-449f-a0b4-07a97a0f3d2c",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1880,
-1300
],
"parameters": {
"color": 5,
"width": 700,
"height": 1420,
"content": "## \ud83c\udfe2 **4A. Company Path**\n\n---\n\n### \ud83d\udd0d `Search LinkedIn for Company (Phantombuster)`\n\n**\ud83d\udd27 Node Type**: HTTP Request\n**\ud83d\udce1 Purpose**:\nUses [Phantombuster\u2019s LinkedIn Search API](https://phantombuster.com/) to search for the **company name**.\n\n**\ud83d\udce6 Input**: `\"DevSync\"`\n**\ud83d\udce4 Output**: Company\u2019s LinkedIn URL\n\n---\n\n### \ud83c\udfed `Scrape LinkedIn Company Profile`\n\n**\ud83d\udd27 Node Type**: HTTP Request\n**\ud83d\udd0d Purpose**:\nScrapes the company\u2019s LinkedIn page to pull:\n\n* Size\n* Website\n* Industry\n* Location\n* Description\n\n---\n\n### \ud83d\udcec `Find Company Email (Hunter.io)`\n\n**\ud83d\udd27 Node Type**: HTTP Request\n**\ud83d\udd0d Purpose**:\nUses [Hunter.io](https://hunter.io) to find company-level email addresses like `info@devsync.com`, `hello@devsync.com`, etc.\n\n**\ud83d\udce6 Input**: Company\u2019s domain (e.g., `devsync.com`)\n**\ud83d\udce4 Output**: Emails + Confidence Score\n\n---\n"
},
"typeVersion": 1
},
{
"id": "7d7ec4da-d52c-4563-94df-3dcf88c85ff0",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1900,
160
],
"parameters": {
"color": 6,
"width": 640,
"height": 1300,
"content": "## \ud83d\udc64 **4B. Person Path**\n\n---\n\n### \ud83d\udd0d `Search LinkedIn for Person (Phantombuster)`\n\n**\ud83d\udd27 Node Type**: HTTP Request\n**\ud83d\udce1 Purpose**:\nSearches for the extracted **person\u2019s name** like \"John Smith\" using Phantombuster.\n\n**\ud83d\udce4 Output**: LinkedIn profile URL(s)\n\n---\n\n### \ud83e\uddd1\u200d\ud83d\udcbc `Scrape LinkedIn Person Profile`\n\n**\ud83d\udd27 Node Type**: HTTP Request\n**\ud83d\udcc4 Purpose**:\nScrapes:\n\n* Name\n* Current Job Title\n* Company\n* Location\n* Education\n* LinkedIn URL\n\n---\n\n### \u2709\ufe0f `Find Personal Email (Hunter.io)`\n\n**\ud83d\udd27 Node Type**: HTTP Request\n**\ud83d\udd0d Purpose**:\nAttempts to find personal emails using the name + company domain.\n\n**\ud83d\udce4 Output**: Email (if public), sometimes with confidence score.\n\n---"
},
"typeVersion": 1
},
{
"id": "46f24197-38da-43a1-ba03-1e394169340a",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
2680,
-520
],
"parameters": {
"color": 6,
"width": 260,
"height": 720,
"content": "## \ud83d\udcd1 **5. Store Everything in Google Sheets**\n\n---\n\n### \ud83e\uddfe `Store Results in Google Sheet`\n\n**\ud83d\udd27 Node Type**: Google Sheets (Append Row)\n**\ud83e\udde0 Purpose**:\nSaves:\n\n* Job title\n* Description\n* Client Name\n* Person/Company\n* LinkedIn Profile\n* Scraped Info\n* Emails"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "9c24521c-85cb-4dbe-b671-43cb6e038740",
"connections": {
"Name is Found?": {
"main": [
[
{
"node": "Is It a Person or Company?",
"type": "main",
"index": 0
}
],
[
{
"node": "No Name Found - End Early",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Extract Company or Person Name from Job",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Is It a Person or Company?",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Run Every X Hours": {
"main": [
[
{
"node": "Fetch Latest Upwork Jobs (Apify)",
"type": "main",
"index": 0
}
]
]
},
"Person or Company?": {
"main": [
[
{
"node": "Search LinkedIn for Company (Phantombuster)",
"type": "main",
"index": 0
}
],
[
{
"node": "Search LinkedIn for Person (Phantombuster)",
"type": "main",
"index": 0
}
]
]
},
"Is It a Person or Company?": {
"main": [
[
{
"node": "Person or Company?",
"type": "main",
"index": 0
}
]
]
},
"Find Company Email (Hunter.io)": {
"main": [
[
{
"node": "Store Results in Google Sheet",
"type": "main",
"index": 0
}
]
]
},
"Scrape LinkedIn Person Profile": {
"main": [
[
{
"node": "Find Personal Email (Hunter.io)",
"type": "main",
"index": 0
}
]
]
},
"Find Personal Email (Hunter.io)": {
"main": [
[
{
"node": "Store Results in Google Sheet",
"type": "main",
"index": 0
}
]
]
},
"Scrape LinkedIn Company Profile": {
"main": [
[
{
"node": "Find Company Email (Hunter.io)",
"type": "main",
"index": 0
}
]
]
},
"Fetch Latest Upwork Jobs (Apify)": {
"main": [
[
{
"node": "Extract Company or Person Name from Job",
"type": "main",
"index": 0
}
]
]
},
"Extract Company or Person Name from Job": {
"main": [
[
{
"node": "Name is Found?",
"type": "main",
"index": 0
}
]
]
},
"Search LinkedIn for Person (Phantombuster)": {
"main": [
[
{
"node": "Scrape LinkedIn Person Profile",
"type": "main",
"index": 0
}
]
]
},
"Search LinkedIn for Company (Phantombuster)": {
"main": [
[
{
"node": "Scrape LinkedIn Company Profile",
"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.
googleSheetsOAuth2ApiopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Automated solution to extract and organize contact information from Upwork job postings, enabling direct outreach to potential clients who post jobs matching your expertise. Scrapes job postings for contact information Extracts email addresses and social profiles Organizes leads…
Source: https://n8n.io/workflows/4794/ — 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.
This n8n automation workflow automates the creation, scripting, production, and posting of YouTube videos. It leverages AI (OpenAI), image generation (PIAPI), video rendering (Shotstack), and platform
This workflow is designed for: Content creators and marketers E-commerce and product-based businesses Agencies producing social media visuals and videos Automation builders looking for AI-powered crea
Generate product images with NanoBanana Pro to Veo videos and Blotato - vide 2 ok. Uses httpRequest, editImage, googleDrive, googleSheets. Scheduled trigger; 76 nodes.
Created by: Peyton Leveillee Last updated: October 2025
The Multi-Model Agency Content Engine is a high-performance editorial system designed for agencies. It solves the "blank page" problem by alternating between real-world social proof and strategic expe