This workflow corresponds to n8n.io template #7233 — we link there as the canonical source.
This workflow follows the Agent → Gmail 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": "SANITIZED_WORKFLOW_ID",
"meta": {
"templateCredsSetupCompleted": false
},
"name": "09 - Lead Profile Enhancer",
"tags": [],
"nodes": [
{
"id": "7cac7cf5-958f-4a8b-8519-8ff30ea3dd1b",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-180,
-160
],
"parameters": {
"color": 5,
"width": 649,
"height": 664,
"content": "## \ud83d\udd17 Trigger & Input\n\n**\ud83d\udd17 HubSpot Contact Webhook: Triggers when a new HubSpot contact is added or updated.\n\n\ud83d\udc64 Fetch Contact: Retrieves full contact details using the object ID from the webhook.\n\n\ud83d\udcdd Update Sheet with Users Twitter/LinkedIn: Logs Twitter/LinkedIn usernames in Google Sheets to track status.**\n\n"
},
"typeVersion": 1
},
{
"id": "007a3ed2-25f0-4e78-8429-52b35586cc78",
"name": "\ud83d\udcdd Update Sheet with Users Twitter/LinkedIn",
"type": "n8n-nodes-base.googleSheets",
"position": [
320,
120
],
"parameters": {
"columns": {
"value": {
"Status": "Done",
"Profiles": "={{ $json.properties.twitter.value }}"
},
"schema": [
{
"id": "Profiles",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Profiles",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Profiles"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_GOOGLE_SHEET_ID",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit",
"cachedResultName": "Your Sheet Name"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "0515886e-a3d8-4a8e-a01b-90b8cb320348",
"name": "\ud83d\udc64 Fetch Contact",
"type": "n8n-nodes-base.hubspot",
"position": [
100,
120
],
"parameters": {
"contactId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.body[0].objectId }}"
},
"operation": "get",
"authentication": "appToken",
"additionalFields": {}
},
"credentials": {
"hubspotAppToken": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "fec95488-309a-4b87-a38a-517eba206127",
"name": "\ud83d\udd17 HubSpot Contact Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
-120,
120
],
"parameters": {
"path": "webhook-endpoint",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2
},
{
"id": "e16a8110-05b4-4712-8a14-eda731bf702b",
"name": "\u2705 Validate Twitter/LinkedIn Exists",
"type": "n8n-nodes-base.if",
"position": [
540,
120
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "1d288783-b441-4f91-9067-c267015477e5",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json.Profiles }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "b39ce319-58df-431a-a187-f6f35d27ff5a",
"name": "\ud83d\ude80 Launch Profile Scraper",
"type": "n8n-nodes-base.httpRequest",
"position": [
760,
220
],
"parameters": {
"url": "=https://api.phantombuster.com/api/v2/agents/launch",
"method": "POST",
"options": {},
"jsonBody": "{\n \"id\": \"YOUR_PROFILE_SCRAPER_ID\",\n \"manualLaunch\": true\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "X-Phantombuster-Key-1",
"value": "YOUR_PHANTOMBUSTER_API_KEY"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.1
},
{
"id": "c1625010-5d09-46be-9c0a-4b68965a606a",
"name": "\ud83c\udfaf Launch Tweet Scraper",
"type": "n8n-nodes-base.httpRequest",
"position": [
760,
20
],
"parameters": {
"url": "=https://api.phantombuster.com/api/v2/agents/launch",
"method": "POST",
"options": {},
"jsonBody": "{\n \"id\": \"YOUR_TWEET_SCRAPER_ID\",\n \"manualLaunch\": true\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "X-Phantombuster-Key-1",
"value": "YOUR_PHANTOMBUSTER_API_KEY"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.1
},
{
"id": "ebf5cba0-2b4f-419c-b837-b6e6c16ce197",
"name": "\u23f3 Wait for Profile Processing",
"type": "n8n-nodes-base.wait",
"position": [
980,
220
],
"parameters": {
"amount": 30
},
"typeVersion": 1.1
},
{
"id": "3045d517-cbfd-4211-b4e1-3ab9dceaf949",
"name": "\u23f3 Wait for Tweet Processing",
"type": "n8n-nodes-base.wait",
"position": [
980,
20
],
"parameters": {
"amount": 60
},
"typeVersion": 1.1
},
{
"id": "69537661-7f91-43a1-b7e7-0f2717c5d5ab",
"name": "\ud83d\udcca Fetch Profile Results",
"type": "n8n-nodes-base.httpRequest",
"position": [
1200,
220
],
"parameters": {
"url": "=https://api.phantombuster.com/api/v2/containers/fetch-output?id={{ $json.containerId }}",
"options": {
"response": {
"response": {}
}
},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "X-Phantombuster-Key-1",
"value": "YOUR_PHANTOMBUSTER_API_KEY_1"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "a92e1e5d-c07e-45e0-9ba9-ca00f348681e",
"name": "\ud83d\udcca Fetch Tweet Results",
"type": "n8n-nodes-base.httpRequest",
"position": [
1200,
20
],
"parameters": {
"url": "=https://api.phantombuster.com/api/v2/containers/fetch-output?id={{ $json.containerId }}&withResultObject=true",
"options": {
"response": {
"response": {}
}
},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "X-Phantombuster-Key-1",
"value": "YOUR_PHANTOMBUSTER_API_KEY_2"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "28b7f093-9752-4f3b-8c3a-cb9985d74852",
"name": "\ud83d\udd0d Extract Profile URL",
"type": "n8n-nodes-base.code",
"position": [
1420,
220
],
"parameters": {
"jsCode": "// Extract the JSON URL from the Phantombuster output\nconst output = $input.first().json.output;\n\n// More specific regex pattern to match the JSON result URL\nconst jsonUrlMatch = output.match(/JSON saved at (https:\\/\\/phantombuster\\.s3\\.amazonaws\\.com\\/\\w+\\/\\w+\\/result\\.json)/);\n\nif (jsonUrlMatch) {\n return [{ json: { resultUrl: jsonUrlMatch[1] } }];\n} else {\n // If JSON URL not found, also try to find CSV URL as fallback\n const csvUrlMatch = output.match(/CSV saved at (https:\\/\\/phantombuster\\.s3\\.amazonaws\\.com\\/\\w+\\/\\w+\\/result\\.csv)/);\n \n if (csvUrlMatch) {\n return [{ json: { resultUrl: csvUrlMatch[1] } }];\n } else {\n throw new Error('Could not find result URL in output. Output: ' + output);\n }\n}"
},
"typeVersion": 2
},
{
"id": "5c3096a3-4b77-4edc-b44f-6a0758299fba",
"name": "\ud83d\udd0d Extract Tweet URL",
"type": "n8n-nodes-base.code",
"position": [
1420,
20
],
"parameters": {
"jsCode": "// Extract the JSON URL from the output\nconst output = $input.first().json.output;\nconst jsonUrlMatch = output.match(/JSON saved at (https:\\/\\/phantombuster\\.s3\\.amazonaws\\.com\\/[^\\s]+\\.json)/);\n\nif (jsonUrlMatch) {\n return [{ json: { resultUrl: jsonUrlMatch[1] } }];\n} else {\n throw new Error('Could not find result URL in output');\n}"
},
"typeVersion": 2
},
{
"id": "00aa83c9-c9d1-4649-a52e-ed61e1cefb90",
"name": "\ud83d\udce5 Download Profile Data",
"type": "n8n-nodes-base.httpRequest",
"position": [
1640,
220
],
"parameters": {
"url": "={{ $json.resultUrl }}",
"options": {
"response": {
"response": {
"responseFormat": "file"
}
}
}
},
"typeVersion": 4.2
},
{
"id": "84dd3555-1bd1-4808-9dc0-6dab6650fd24",
"name": "\ud83d\udccb Parse Profile JSON",
"type": "n8n-nodes-base.extractFromFile",
"position": [
1860,
220
],
"parameters": {
"options": {},
"operation": "fromJson"
},
"typeVersion": 1
},
{
"id": "666741d2-2991-4582-ab3b-1249991e07b7",
"name": "\ud83c\udff7\ufe0f Format Profile Fields",
"type": "n8n-nodes-base.set",
"position": [
2080,
220
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "db34c1fc-0c06-4704-af41-5aa212f5436d",
"name": "Twitter",
"type": "string",
"value": "={{ $json.data[0].query }}"
},
{
"id": "cccd2ae9-6f56-45f7-8dcd-6a1d2253c86d",
"name": "Tweet Count",
"type": "string",
"value": "={{ $json.data[0].tweetsCount }}"
},
{
"id": "42e93287-b26a-4512-9c75-ced1102222ea",
"name": "Followers",
"type": "string",
"value": "={{ $json.data[0].followers }}"
},
{
"id": "ff19814a-1507-4855-9c82-94cb1e5b5afc",
"name": "Following",
"type": "string",
"value": "={{ $json.data[0].following }}"
},
{
"id": "04919753-74e6-4358-8ddb-4ce39e03e0cb",
"name": "Likes",
"type": "string",
"value": "={{ $json.data[0].likes }}"
},
{
"id": "0864c613-5243-4ec6-b804-a8e234a85706",
"name": "Lists",
"type": "string",
"value": "={{ $json.data[0].lists }}"
},
{
"id": "e6b83a62-7687-4c5c-bc53-4fcf12e184fe",
"name": "Bio",
"type": "string",
"value": "={{ $json.data[0].bio }}"
},
{
"id": "cd6a44d1-ba8b-45fb-99d1-ccc6e76a395b",
"name": "Website",
"type": "string",
"value": "={{ $json.data[0].website }}"
},
{
"id": "39c544e4-0253-464e-ba89-f093db6575a5",
"name": "Verified",
"type": "string",
"value": "={{ $json.data[0].verified }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "217803a0-a475-4b87-bd5b-573682b956c9",
"name": "\ud83c\udff7\ufe0f Format Tweet Fields",
"type": "n8n-nodes-base.set",
"position": [
2080,
20
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "c25b75bf-dd1a-48c4-bdd7-5e7ad939cae6",
"name": "Tweets",
"type": "string",
"value": "="
},
{
"id": "a6ab20fe-d29d-4fbb-8f72-fd232db84e8b",
"name": "Email",
"type": "string",
"value": "={{ $('\ud83d\udc64 Fetch Contact').item.json.properties.email.value }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "2f321e43-3784-4097-a261-7812b97e645c",
"name": "\ud83d\udd04 Merge Data Streams",
"type": "n8n-nodes-base.merge",
"position": [
2300,
120
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "4366bb24-e6ae-4fcf-a5c7-6a2a96b24dd2",
"name": "\ud83e\udde9 Combine All Data",
"type": "n8n-nodes-base.code",
"position": [
2520,
120
],
"parameters": {
"jsCode": "// Get all input items\nconst inputData = $input.all().map(item => item.json);\n\n// Merge all objects into one\nconst combined = inputData.reduce((acc, curr) => {\n return { ...acc, ...curr };\n}, {});\n\n// Return the merged object\nreturn [\n {\n json: combined\n }\n];"
},
"typeVersion": 2
},
{
"id": "96797231-0f43-4e79-bc87-e62e5ba63b11",
"name": "\ud83e\udde0 Generate Personalized Email",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2740,
120
],
"parameters": {
"text": "=You are an AI assistant helping write personalized emails using social media profile data.\n\nHere is the extracted Twitter profile data:\n\n{\n \"Tweets\": {{ $json.Tweets }},\n \"Twitter\": {{ $json.Twitter }},\n \"Tweet Count\": {{ $json['Tweet Count'] }},\n \"Followers\": {{ $json.Followers }},\n \"Following\": {{ $json.Following }},\n \"Likes\": {{ $json.Likes }},\n \"Lists\": {{ $json.Lists }},\n \"Bio\": {{ $json.Bio }},\n \"Website\": {{ $json.Website }},\n \"Verified\": {{ $json.Verified }}\n}\n\n\u2705 Based on this, write a professional and engaging HTML email to the user of the profile.\nThe email should:\n\nStart with a relevant and compelling subject line.\n\nInclude a personalized introduction using the profile info (like follower count, profession, etc.).\n\nMention the value we can offer (you can assume the sender is a brand or platform).\n\nInclude a call to action (e.g., connect with us, collaborate, reply back, etc.).\n\nBe formatted in clean HTML.\n\n\ud83d\udd3b Your response must be a JSON with two keys:\n\n\"subject\": Plain text string for email subject.\n\n\"body\": A string with HTML content of the email body.\n\nhere's my information \nName: [YOUR_NAME]\nPosition: [YOUR_POSITION]\nCompany: [YOUR_COMPANY]\nTwitter: [YOUR_TWITTER_URL]\nInstagram: [YOUR_INSTAGRAM_URL]\n",
"options": {},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "7318c5ff-85e3-4cd3-bfda-0d84e7e4f4e6",
"name": "\ud83e\udd16 OpenAI Language Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
2828,
340
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "516f428e-e79e-41c2-946c-6d9b299ba651",
"name": "\u2702\ufe0f Parse Email Content",
"type": "n8n-nodes-base.code",
"position": [
3116,
120
],
"parameters": {
"jsCode": "// Get the raw string inside the output field\nconst rawOutput = $input.first().json.output;\n\n// Remove ```json and ``` if present, and trim whitespace\nconst cleaned = rawOutput\n .replace(/```json|```/g, '')\n .trim();\n\n// Parse the cleaned JSON string\nconst parsed = JSON.parse(cleaned);\n\n// Return subject and body\nreturn [\n {\n json: {\n subject: parsed.subject,\n body: parsed.body\n }\n }\n];"
},
"typeVersion": 2
},
{
"id": "f63668c9-dde2-447e-9dff-397cb97875ef",
"name": "\ud83d\udce7 Sends Email",
"type": "n8n-nodes-base.gmail",
"position": [
3336,
120
],
"parameters": {
"sendTo": "={{ $('\ud83e\udde9 Combine All Data').item.json.Email }}",
"message": "={{ $json.body }}",
"options": {
"appendAttribution": false
},
"subject": "={{ $json.subject }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "d3dd663b-8251-41cd-9e83-41fce92bc67f",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
480,
-160
],
"parameters": {
"width": 220,
"height": 660,
"content": "## \u2705 Conditional Path\n\n**\u2705 Validate Twitter/LinkedIn Exists: Ensures the Profiles field exists before triggering the scraping process.**"
},
"typeVersion": 1
},
{
"id": "2c82fb3f-9b14-4872-970d-384bd4c17849",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
720,
-560
],
"parameters": {
"color": 3,
"width": 840,
"height": 1060,
"content": "## \ud83d\udd0d Social Media Scraping (Using Phantombuster)\n\n**\ud83d\ude80 Phantombuster Profile & Tweet Scrapers:\nLaunch Profile Scraper & Launch Tweet Scraper trigger external Phantombuster agents using an HTTP POST request.\n\nThe API call includes:\n\nX-Phantombuster-Key-1: Your Phantombuster API key\n\nContent-Type: application/json\n\nscriptId: The specific ID of the Phantom (Twitter Profile Scraper, Twitter Tweet Scraper, etc.)\n\narguments: JSON-formatted input with data such as Twitter handle, number of tweets, etc.\n\n\u23f3 Wait Nodes:\nAdded to allow time for Phantombuster to finish its scraping job (typically 30s to 60s).\n\n\ud83d\udcca Result Retrieval:\nFetch Profile/Tweet Results: Calls the https://api.phantombuster.com/api/v2/agents/fetch-output endpoint with the agent ID to get the latest job's result.\n\nExtract URL: Extracts the actual downloadable .json URL from the response.**"
},
"typeVersion": 1
},
{
"id": "3bfc5f34-f068-42a7-a1d4-bc52767b64c0",
"name": "\ud83d\udccb Download Tweet JSON",
"type": "n8n-nodes-base.httpRequest",
"position": [
1640,
20
],
"parameters": {
"url": "={{ $json.resultUrl }}",
"options": {
"response": {
"response": {
"responseFormat": "file"
}
}
}
},
"typeVersion": 4.2
},
{
"id": "21dad60e-b732-47e3-97ae-3c0ebc596393",
"name": "\ud83d\udccb Parse Tweet JSON",
"type": "n8n-nodes-base.extractFromFile",
"position": [
1860,
20
],
"parameters": {
"options": {},
"operation": "fromJson"
},
"typeVersion": 1
},
{
"id": "d3df814b-7990-4f80-92cb-748070d98068",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1580,
-260
],
"parameters": {
"color": 6,
"width": 420,
"height": 760,
"content": "## \ud83d\udce5 Data Download & Parsing\n\n**\ud83d\udce5 Download Profile Data & \ud83d\udccb Parse Profile JSON\n\n\ud83d\udccb Parse Tweet JSON (via HTTP request + extract JSON)\n\nExtract from File1: Converts Tweet JSON to usable object format.**"
},
"typeVersion": 1
},
{
"id": "e3c99a78-d4ad-4fc4-8ef7-a0729f2e624f",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
2040,
-360
],
"parameters": {
"color": 4,
"width": 640,
"height": 860,
"content": "## \ud83c\udff7\ufe0f Data Structuring\n\n**\ud83c\udff7\ufe0f Format Profile Fields: Maps important profile stats like bio, followers, verified status, likes, etc.\n\n\ud83c\udff7\ufe0f Format Tweet Fields: Assigns tweets and email from HubSpot contact to prepare for merging.**\n\n## \ud83d\udd04 Data Merging\n\n**\ud83d\udd04 Merge Data Streams: Combines tweet and profile data streams.\n\n\ud83e\udde9 Combine All Data: Consolidates all merged values into a single object for prompt input.**"
},
"typeVersion": 1
},
{
"id": "f88a12de-b2ce-4de5-a0e8-767098748464",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
2700,
-180
],
"parameters": {
"color": 5,
"width": 780,
"height": 680,
"content": "## \u2709\ufe0f Email Generation & Delivery\n\n**\ud83e\udde0 Generate Personalized Email: Uses LangChain + OpenAI GPT to craft a custom HTML email using the Twitter data and your personal brand details.\n\n\u2702\ufe0f Parse Email Content: Parses the AI's raw response to extract the subject + HTML body as clean JSON.\n\n\ud83d\udce7 Sends Email: Automatically sends the personalized email to the user's email address from Gmail.**"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "SANITIZED_VERSION_ID",
"connections": {
"\ud83d\udc64 Fetch Contact": {
"main": [
[
{
"node": "\ud83d\udcdd Update Sheet with Users Twitter/LinkedIn",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udccb Parse Tweet JSON": {
"main": [
[
{
"node": "\ud83c\udff7\ufe0f Format Tweet Fields",
"type": "main",
"index": 0
}
]
]
},
"\ud83e\udde9 Combine All Data": {
"main": [
[
{
"node": "\ud83e\udde0 Generate Personalized Email",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udd0d Extract Tweet URL": {
"main": [
[
{
"node": "\ud83d\udccb Download Tweet JSON",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udccb Parse Profile JSON": {
"main": [
[
{
"node": "\ud83c\udff7\ufe0f Format Profile Fields",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udd04 Merge Data Streams": {
"main": [
[
{
"node": "\ud83e\udde9 Combine All Data",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udcca Fetch Tweet Results": {
"main": [
[
{
"node": "\ud83d\udd0d Extract Tweet URL",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udccb Download Tweet JSON": {
"main": [
[
{
"node": "\ud83d\udccb Parse Tweet JSON",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udd0d Extract Profile URL": {
"main": [
[
{
"node": "\ud83d\udce5 Download Profile Data",
"type": "main",
"index": 0
}
]
]
},
"\ud83c\udfaf Launch Tweet Scraper": {
"main": [
[
{
"node": "\u23f3 Wait for Tweet Processing",
"type": "main",
"index": 0
}
]
]
},
"\u2702\ufe0f Parse Email Content": {
"main": [
[
{
"node": "\ud83d\udce7 Sends Email",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udcca Fetch Profile Results": {
"main": [
[
{
"node": "\ud83d\udd0d Extract Profile URL",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udce5 Download Profile Data": {
"main": [
[
{
"node": "\ud83d\udccb Parse Profile JSON",
"type": "main",
"index": 0
}
]
]
},
"\ud83e\udd16 OpenAI Language Model": {
"ai_languageModel": [
[
{
"node": "\ud83e\udde0 Generate Personalized Email",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"\ud83c\udff7\ufe0f Format Tweet Fields": {
"main": [
[
{
"node": "\ud83d\udd04 Merge Data Streams",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\ude80 Launch Profile Scraper": {
"main": [
[
{
"node": "\u23f3 Wait for Profile Processing",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udd17 HubSpot Contact Webhook": {
"main": [
[
{
"node": "\ud83d\udc64 Fetch Contact",
"type": "main",
"index": 0
}
]
]
},
"\u23f3 Wait for Tweet Processing": {
"main": [
[
{
"node": "\ud83d\udcca Fetch Tweet Results",
"type": "main",
"index": 0
}
]
]
},
"\ud83c\udff7\ufe0f Format Profile Fields": {
"main": [
[
{
"node": "\ud83d\udd04 Merge Data Streams",
"type": "main",
"index": 1
}
]
]
},
"\u23f3 Wait for Profile Processing": {
"main": [
[
{
"node": "\ud83d\udcca Fetch Profile Results",
"type": "main",
"index": 0
}
]
]
},
"\ud83e\udde0 Generate Personalized Email": {
"main": [
[
{
"node": "\u2702\ufe0f Parse Email Content",
"type": "main",
"index": 0
}
]
]
},
"\u2705 Validate Twitter/LinkedIn Exists": {
"main": [
[
{
"node": "\ud83d\ude80 Launch Profile Scraper",
"type": "main",
"index": 0
},
{
"node": "\ud83c\udfaf Launch Tweet Scraper",
"type": "main",
"index": 0
}
]
]
},
"\ud83d\udcdd Update Sheet with Users Twitter/LinkedIn": {
"main": [
[
{
"node": "\u2705 Validate Twitter/LinkedIn Exists",
"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.
gmailOAuth2googleSheetsOAuth2ApihubspotAppTokenopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow enriches and personalizes your lead profiles by integrating HubSpot contact data, scraping social media information, and using AI to generate tailored outreach emails. It streamlines the process from contact capture to sending a personalized email — all…
Source: https://n8n.io/workflows/7233/ — 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.
Fully production-ready B2B lead outreach pipeline that: Takes industry keywords from a form trigger (or you can manually add rows to Google Sheets) Scrapes targeted LinkedIn leads using Apify (peakyde
Marketing, growth, and automation teams that need to ship polished bilingual newsletters—complete with images, optional video, and multi-channel distribution—without writing a line of code. A Webhook
Universal Expense tracker. Uses telegram, httpRequest, openAi, googleSheets. Webhook trigger; 33 nodes.
🧾 Short Description
Hubspot Splitout. Uses stickyNote, agent, googleCalendarTool, executeWorkflowTrigger. Webhook trigger; 31 nodes.