This workflow corresponds to n8n.io template #9080 — we link there as the canonical source.
This workflow follows the Gmail → 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "b8539b60-3399-43ce-93ab-13ebe20ec771",
"name": "Trigger PhantomBuster Agent",
"type": "n8n-nodes-base.httpRequest",
"position": [
1696,
96
],
"parameters": {
"url": "https://api.phantombuster.com/api/v2/agents/launch",
"method": "POST",
"options": {},
"sendBody": true,
"sendHeaders": true,
"bodyParameters": {
"parameters": [
{
"name": "id",
"value": "={{ $('Sticky Note4').item.json.phantombuster_agent_id }}"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "X-Phantombuster-Key",
"value": "={{ $credentials.phantombusterApi.apiKey }}"
}
]
}
},
"credentials": {
"phantombusterApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "e2d8083d-8473-4e3f-8046-cc6ef3c1a980",
"name": "Add to Google Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1248,
96
],
"parameters": {
"columns": {
"value": {
"id": "={{ $('Limit1').item.json.vmid }}",
"name": "={{ $('Limit1').item.json.name }}",
"title": "={{ $('Limit1').item.json.title }}",
"last_name": "={{ $('Limit1').item.json.lastName }}",
"photo_url": "={{ $('Limit1').item.json.profileImageUrl }}",
"first_name": "={{ $('Limit1').item.json.firstName }}",
"icebreaker": "={{ $json.message.content.icebreaker }}",
"linkedin_url": "={{ $('Limit1').item.json.linkedInProfileUrl }}"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "id",
"defaultMatch": true,
"canBeUsedToMatch": true
},
{
"id": "first_name",
"type": "string",
"display": true,
"required": false,
"displayName": "first_name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "last_name",
"type": "string",
"display": true,
"required": false,
"displayName": "last_name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"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": "email_status",
"type": "string",
"display": true,
"required": false,
"displayName": "email_status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "photo_url",
"type": "string",
"display": true,
"required": false,
"displayName": "photo_url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "icebreaker",
"type": "string",
"display": true,
"required": false,
"displayName": "icebreaker",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {
"useAppend": true
},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "80846526-ff04-4e1b-8745-262f8515c6a3",
"name": "Personalize Outreach",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
896,
96
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o",
"cachedResultName": "GPT-4O"
},
"options": {},
"messages": {
"values": [
{
"role": "system",
"content": "You are a helpful, intelligent writing assistant."
},
{
"content": "Your task is to take as input a bunch of LinkedIn profile information of a user, and then generate a very short, very punchy icebreaker that I can use as a variable in my connection request.\n\nReturn your results in this format:\n\n{\"icebreaker\":\"Icebreaker goes here\"}\n\nIn order to ensure icebreakers are punchy and high-quality, make them follow this template:\n\nHey {{name}}, loved seeing {{thingAboutThem}}. I'm also into {{plausibleTieIn}}, thought I'd connect.\n\nFor {{thingAboutThem}} and {{plausibleTieIn}}, never use the exact information provided in a LinkedIn field. Instead, always paraphrase. This makes it seem human written, instead of just an automated message. Also, make it super short. Don't say stuff like \"passionate about turning vision into reality\" or anything like that\u2014be extremely laconic and spartan."
},
{
"content": "{\"linkedInFields\":\"John Toraason, Peru Illinois United States, President Founder at Toraason Marketing Group,\"}"
},
{
"role": "assistant",
"content": "{\n \"icebreaker\": \"Hey John, loved seeing your Toraason Marketing Group journey. I'm also building brands, thought I'd connect.\"\n}"
},
{
"content": "={\"linkedInFields\":\"{{ $json.firstName }} {{ $json.lastName }} , {{ $json.location }}, {{ $json.title }} at {{ $json.companyName }}, current experience: {{ $json.titleDescription }} at {{ $json.companyName }}\"} "
}
]
},
"jsonOutput": true
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.6
},
{
"id": "4aedf991-1644-4f86-96e7-920874276ac0",
"name": "Aggregate",
"type": "n8n-nodes-base.aggregate",
"position": [
1472,
96
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData"
},
"typeVersion": 1
},
{
"id": "21365e6e-89ac-4d39-979f-5ad487454249",
"name": "Get row(s) in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
448,
96
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "8c58d792-93b1-4a71-9061-d08a55263524",
"name": "Limit1",
"type": "n8n-nodes-base.limit",
"position": [
672,
96
],
"parameters": {
"maxItems": 10
},
"typeVersion": 1
},
{
"id": "67029c61-416f-4fbd-9e32-d8e1d4422312",
"name": "Delete rows or columns from sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1920,
96
],
"parameters": {
"operation": "delete",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
},
"numberToDelete": 10
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "66d51e51-5b3d-4f05-8a20-d07b8f9b9f49",
"name": "Delete rows or columns from sheet1",
"type": "n8n-nodes-base.googleSheets",
"position": [
224,
96
],
"parameters": {
"operation": "delete",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
},
"numberToDelete": 10
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "78985aa9-3dcd-4c18-a4b6-47b37bc75f0a",
"name": "Send a message",
"type": "n8n-nodes-base.gmail",
"position": [
2128,
96
],
"parameters": {
"sendTo": "",
"message": "LinkedIn connection request campaign completed successfully.",
"options": {},
"subject": "Connection Request Sent",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "1385458c-49f9-46a9-ad50-b22cd50ab5bb",
"name": "Schedule Trigger1",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
0,
224
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 2
}
]
}
},
"typeVersion": 1.2
},
{
"id": "94b0f87e-021b-471f-891a-2889b2597a30",
"name": "Schedule Trigger2",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
0,
-32
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 19
}
]
}
},
"typeVersion": 1.2
},
{
"id": "fe056929-674f-417f-a819-0f83546c50c0",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
320,
-208
],
"parameters": {
"width": 624,
"height": 256,
"content": "STEP2: Data Processing & AI Personalization\nThis section handles the core lead processing and message generation. The workflow reads LinkedIn prospect data from a Google Sheet, limits processing to 10 leads per run, and uses GPT-4O to create personalized icebreaker messages.\n\n\u2022 Get row(s) in sheet: Reads LinkedIn prospect data from input spreadsheet\n\u2022 Limit1: Processes only 10 leads per execution to manage costs and API limits\n\u2022 Personalize Outreach: Uses OpenAI GPT-4O to generate custom icebreakers based on profile data\n\u2022 AI prompt engineering: Creates punchy, human-like connection requests using prospect information\n"
},
"typeVersion": 1
},
{
"id": "3df1e47e-2cf5-49b9-9ad0-855dbf04d505",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-256,
-320
],
"parameters": {
"width": 416,
"height": 272,
"content": "STEP 1: Automated Scheduling\nTwo schedule triggers ensure consistent daily outreach without manual intervention, maximizing LinkedIn engagement during optimal business hours.\n\n\u2022 Schedule Trigger1: Runs campaign at 10 AM, Sending 10 connection requests.\n\u2022 Schedule Trigger2: Runs campaign at 5 PM, Sending 10 connection requests.\n\n\u2022 Hands-free automation: No manual intervention required for daily execution"
},
"typeVersion": 1
},
{
"id": "83397ef1-6f39-4bca-a446-8eab7d77e96b",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1248,
-208
],
"parameters": {
"width": 512,
"height": 256,
"content": "STEP 3: Lead Management & Campaign Execution\nAfter generating personalized messages, this section stores the processed leads and triggers the actual outreach campaign through PhantomBuster automation.\n\n\u2022 Add to Google Sheet: Saves processed leads with icebreakers to output spreadsheet\n\u2022 Aggregate: Combines all processed data before campaign trigger\n\u2022 Trigger PhantomBuster Agent: Launches automated LinkedIn connection requests\n\u2022 Campaign coordination: Manages the handoff between n8n processing and PhantomBuster execution\n"
},
"typeVersion": 1
},
{
"id": "c82ced29-e169-47ea-9aaf-41cc97a37b9a",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1904,
-160
],
"parameters": {
"width": 432,
"height": 240,
"content": "STEP 4: Cleanup & Notification System\nThe final section handles post-campaign cleanup and provides execution notifications to maintain data hygiene and campaign tracking.\n\n\u2022 Delete rows from input sheet: Removes processed leads to prevent duplicates\n\u2022 Delete rows from output sheet: Cleans processed data after campaign execution \n\u2022 Send notification email: Confirms successful campaign completion via Gmail\n\u2022 Data maintenance: Ensures clean slate for next automation cycle"
},
"typeVersion": 1
},
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1696,
-160
],
"parameters": {
"width": 320,
"height": 180,
"content": "\u2699\ufe0f SETUP REQUIRED\n\nBefore activating this workflow:\n\n1. Configure Google Sheets credentials in all Sheet nodes\n2. Select your Source and Destination spreadsheets\n3. Add OpenAI API credentials to 'Personalize Outreach' node\n4. Add PhantomBuster API credentials\n5. Enter your PhantomBuster Agent ID below:\n\nphantombuster_agent_id: YOUR_AGENT_ID_HERE\n\n6. Set notification email address in 'Send a message' node"
},
"typeVersion": 1
}
],
"connections": {
"Limit1": {
"main": [
[
{
"node": "Personalize Outreach",
"type": "main",
"index": 0
}
]
]
},
"Aggregate": {
"main": [
[
{
"node": "Trigger PhantomBuster Agent",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger1": {
"main": [
[
{
"node": "Delete rows or columns from sheet1",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger2": {
"main": [
[
{
"node": "Delete rows or columns from sheet1",
"type": "main",
"index": 0
}
]
]
},
"Add to Google Sheet": {
"main": [
[
{
"node": "Aggregate",
"type": "main",
"index": 0
}
]
]
},
"Get row(s) in sheet": {
"main": [
[
{
"node": "Limit1",
"type": "main",
"index": 0
}
]
]
},
"Personalize Outreach": {
"main": [
[
{
"node": "Add to Google Sheet",
"type": "main",
"index": 0
}
]
]
},
"Trigger PhantomBuster Agent": {
"main": [
[
{
"node": "Delete rows or columns from sheet",
"type": "main",
"index": 0
}
]
]
},
"Delete rows or columns from sheet": {
"main": [
[
{
"node": "Send a message",
"type": "main",
"index": 0
}
]
]
},
"Delete rows or columns from sheet1": {
"main": [
[
{
"node": "Get row(s) in sheet",
"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.
gmailOAuth2googleSheetsOAuth2ApiopenAiApiphantombusterApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This sophisticated n8n workflow transforms raw LinkedIn leads into personalized, high-converting connection requests using GPT-4O AI and PhantomBuster automation. The system processes LinkedIn profile data, generates authentic icebreakers, and automatically sends connection…
Source: https://n8n.io/workflows/9080/ — 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.
Stop wasting billable hours on manual time-tracking. AutoTimesheet Pro uses AI to collect emails, meetings, and GitHub work, then writes a clean timesheet straight into Google Sheets. Perfect for deve
Imagine a dedicated financial expert tirelessly working behind the scenes, sifting through every transaction, every investment move, and every accounting entry. That's exactly what this automated syst
Who is this for? AI creators, marketers, agencies, and researchers tracking YouTube trends who need weekly high-signal insights without 4+ hours manual research.
Automatically logs time to Jira every night from a Google Sheet. No manual worklog entries needed — just fill in your sheet and the workflow handles the rest at 10 PM.
This template automates overnight system health monitoring for DevOps and IT operations teams. It checks your internal services and APIs on a schedule, logs all results to Google Sheets, and sends AI-