This workflow corresponds to n8n.io template #6098 — we link there as the canonical source.
This workflow follows the Google Sheets → HTTP Request 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 →
{
"nodes": [
{
"id": "3bf17efb-5a0d-4c2d-8835-a21978514ebc",
"name": "Client data",
"type": "n8n-nodes-base.googleSheets",
"position": [
-480,
640
],
"parameters": {
"columns": {
"value": {
"Email": "={{ $json.emailAddress }}",
"Country": "={{ $json.countryName }}",
"Website": "={{ $json.company.mainDomain }}",
"Headline": "={{ $json.headline }}",
"Keywords": "={{ ($json.company?.searchKeywords ?? []).slice(0, 31) }}\n",
"LinkedIn": "={{ $json.linkedInProfileUrl }}",
"cityName": "={{ $json.cityName }}",
"Full Name": "={{ $json.firstName }} {{ $json.lastName }}",
"stateName": "={{ $json.stateName }}",
"Company Name": "={{ $json.company.companyName }}",
"company/cityName": "={{ $json.company.cityName }}",
"company/businessIndustry": "={{ $json.company.businessIndustry }}"
},
"schema": [
{
"id": "Full Name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Full Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Headline",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Headline",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "LinkedIn",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "LinkedIn",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "cityName",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "cityName",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "stateName",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "stateName",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "company/cityName",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "company/cityName",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Country",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Country",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company Name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Company Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Website",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Website",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "company/businessIndustry",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "company/businessIndustry",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Keywords",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Keywords",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "icebreaker",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "icebreaker",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "intro",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "intro",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "value_prop",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "value_prop",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 747242514,
"cachedResultUrl": "https://docs.google.com/YOUR_AWS_SECRET_KEY_HERE_AuYTFbB1FkTtkz31ZI/edit#gid=747242514",
"cachedResultName": "Videography"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_GOOGLE_SHEETS_DOCUMENT_ID",
"cachedResultUrl": "https://docs.google.com/YOUR_AWS_SECRET_KEY_HERE_AuYTFbB1FkTtkz31ZI/edit?usp=drivesdk",
"cachedResultName": "Leads"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "8456d4ee-f74a-48a7-8a9a-e876c357394e",
"name": "Increment Page Number",
"type": "n8n-nodes-base.code",
"position": [
-16,
816
],
"parameters": {
"jsCode": "const next = $item(0).$node[\"Loop over one by one\"].json.number + 1;\n return [{ json: { number: next } }];"
},
"typeVersion": 2
},
{
"id": "d500268c-dbcd-418c-af22-786958e7dd3e",
"name": "Generate Page Numbers",
"type": "n8n-nodes-base.code",
"position": [
-1200,
624
],
"parameters": {
"jsCode": "// Code (generator) node \u2013 start at 1 end at 50\nconst start = 1; // starting at 1\nconst end = 50; // total you want to reach\nreturn Array.from({ length: end - start + 1 }, (_, i) => ({\n json: { number: start + i },\n}));\n"
},
"typeVersion": 2
},
{
"id": "e3d5ba17-44e5-4932-a5a4-2d6c9b88cecd",
"name": "Loop over one by one",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-912,
624
],
"parameters": {
"options": {
"reset": true
}
},
"typeVersion": 3
},
{
"id": "fc2046ea-0117-4d01-b0cf-504c9386d1aa",
"name": "Apollo Scraper",
"type": "n8n-nodes-base.httpRequest",
"maxTries": 5,
"position": [
-672,
640
],
"parameters": {
"url": "https://api.apify.com/v2/acts/dx0856bVYoGUkmXAo/run-sync-get-dataset-items",
"method": "POST",
"options": {
"redirect": {
"redirect": {}
}
},
"jsonBody": "={\n \"count\": 10,\n \"excludeGuessedEmails\": false,\n \"excludeNoEmails\": false,\n \"getEmails\": true,\n \"searchUrl\": \"LINK\",\n \"startPage\": {{ $json.number }}\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
}
]
}
},
"retryOnFail": true,
"typeVersion": 4.2,
"alwaysOutputData": false
},
{
"id": "1982b7f5-f39d-440c-b52b-735a56ae1456",
"name": "Domain scrape",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueRegularOutput",
"position": [
-256,
640
],
"parameters": {
"url": "={{$json.Website.startsWith('http') ? $json.Website : 'https://' + $json.Website}}",
"options": {}
},
"typeVersion": 4.2,
"alwaysOutputData": false
},
{
"id": "d373cd33-19f7-4d7d-b494-b66f193a92c9",
"name": "Summarising prospect data",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
-912,
816
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini",
"cachedResultName": "GPT-4.1-MINI"
},
"options": {
"temperature": 0.6
},
"messages": {
"values": [
{
"role": "system",
"content": "=You are a highly intelligent ai assistant"
},
{
"content": "=Your task is to take as input a large amount of unstructured data on a client\u2019s website and profile, and condense it into a JSON output in this exact format:\n\n{\n \"WebsiteContext\": \"<Concise key points about the company\u2019s website or write \\\"no content\\\">\",\n \"PersonContext\": \"<Concise key points about the individual or write \\\"no content\\\">\",\n \"UniqueAngles\": \"<One or two brief, distinct outreach angles derived from the above contexts>\"\n}\n\nYou\u2019ll receive all necessary data as a single unstructured string. Parse it and emit only the JSON object.\n\nRules:\n- Focus on a small number of high-impact points per block for crafting an icebreaker.\n- WebsiteContext: 1\u20134 sentences on key company/website insights.\n- PersonContext: 1\u20134 sentences on key personal/professional insights.\n- UniqueAngles: 1\u20134 laconic hooks or unique angles that tie WebsiteContext and PersonContext into a personalized outreach idea.\n- Keep everything short and Spartan\u2014no em dashes \n- No extra fluff, only valuable information that can be effectively used for cold outreach to the client. \n"
},
{
"content": "=Website Scrape:\n{{ $('Domain scrape').item.json.data.length > 5000 ? $('Domain scrape').item.json.data.slice(0, 5000) : $('Domain scrape').item.json.data }}\n\nPersonal Data Scrape:\n{{ $('Client data').item.json['Full Name'] }} // Full Name\n{{ $('Client data').item.json.cityName }} // City (person)\n{{ $('Client data').item.json.stateName }} // State\n{{ $('Client data').item.json.Country }} // Country\n{{ $('Client data').item.json.Headline }} // Headline\n{{ $('Client data').item.json[\"company/businessIndustry\"] }} // Industry\n{{ $('Client data').item.json.Keywords }} // Keywords\n{{ $('Client data').item.json[\"Company Name\"] }} // Organization Name\n\n"
}
]
},
"jsonOutput": true
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "3f7ee48d-b748-4a0f-b5e8-b8812c32d68c",
"name": "Creating detailed email",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
-576,
816
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1",
"cachedResultName": "GPT-4.1"
},
"options": {
"temperature": 0.6
},
"messages": {
"values": [
{
"role": "system",
"content": "=You are a highly intelligent, expert email copywriter. Your task is to generate a JSON object containing the building blocks of a personalized cold email. Prioritise warmth and clarity over cleverness. \n- Write like someone who respects the founder\u2019s time and isn\u2019t trying too hard, like a familiar discussion with a friend. \n- NO em dashes (\u2014) should be used at all in any of the bodies.\n"
},
{
"content": "=Given the prospects context, produce a 5-block JSON object for a personalized, Spartan-style email. Directed towards operators and decision-makers at fitness studios, recovery clinics, and alternative therapy chains.\n\nUse the following template exactly:\n\n{\n \"icebreaker\": \"<Short, familiar opener that implies shared interest or belief, using context. Designed to hook the reader>\",\n \"intro\": \"<Start with: 'I know this is a bit out of the blue, but I work almost exclusively with [wellness/health/etc.] brands. My company, COMPANY NAME' Use the context to personalize naturally.>\",\n \"value_prop\": \"<One-sentence tie between our services and their industry or goals.>\"\n}\nMy Business context (for reference only, don\u2019t copy it verbatim):\nPUT YOUR COMPANY INFO HERE\n\n\nPersonalization rules:\n- Tailor blocks where possible around the context\u2014show homework, not box-ticking.\n- Tone: Spartan, laconic, familiar. first-person familiar voice, like you\u2019re talking over coffee. \n- NO em dashes (\u2014) should be used at all in any of the bodies.\n- Imply shared interests or goals where possible, even if it means stretching the truth a little. Avoid obvious lies like claiming you grew up in their hometown, which might invite follow-up questions.\n- Shorten company/brand names (e.g. \u201cAMS\u201d not \u201cAMS Professional Services\u201d, \"Mood Journal\" not \"The Mood Journal\") and locations (e.g. \u201cLA,\u201d \u201cSan Fran\u201d).\n- Don\u2019t be overly specific\u2014leave room for follow-up.\n- If no context is given just write general fitness studios, recovery clinics, and alternative therapy chains info."
},
{
"role": "assistant",
"content": "={\n \"icebreaker\": \"Hey Jamie, love how Breathe brings neuroscience into everyday life in such a clear way. Got a quick idea that might click with what you're doing.\",\n \"intro\": \"My company, COMPANY, blends smart digital marketing, standout brand design, and hands-on consulting to spark real growth. We've helped wellness brands turn expert content into something that clicks and converts, without losing the science.\",\n \"value_prop\": \"We turn credibility into clean, scalable growth. It never needs to feel complicated.\"\n}\n"
},
{
"role": "assistant",
"content": "={\n \"icebreaker\": \"Hey Morgan, ThriveLink\u2019s way of making therapy feel more real and less clinical really stuck with me. I\u2019ve got an idea that might fit right in.\",\n \"intro\": \"My company, COMPANY, blends data-backed marketing, bold brand design, and hands-on strategy to help wellness brands stand out and scale up. We focus on building clarity and trust, whether you\u2019re speaking to individuals or partners.\",\n \"value_prop\": \"We help wellness brands grow by making complex ideas feel clear, human and engaging.\"\n}\n"
},
{
"content": "=Use this information for context:\nWebsite Context:\n{{ $json.message.content.WebsiteContext }}\n\nPerson Context:\n{{ $json.message.content.PersonContext}}\n\nUnique Angles:\n{{ $json.message.content.UniqueAngles }}"
}
]
},
"jsonOutput": true
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "44d27e87-7c00-4825-9395-97ca00fe1e59",
"name": "Add email data to sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
-224,
816
],
"parameters": {
"columns": {
"value": {
"Email": "={{ $('Client data').item.json.Email }}",
"intro": "={{ $json.message.content.intro }}",
"icebreaker": "={{ $json.message.content.icebreaker }}",
"value_prop": "={{ $json.message.content.value_prop }}"
},
"schema": [
{
"id": "Full Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Full Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Headline",
"type": "string",
"display": true,
"required": false,
"displayName": "Headline",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "LinkedIn",
"type": "string",
"display": true,
"required": false,
"displayName": "LinkedIn",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "cityName",
"type": "string",
"display": true,
"required": false,
"displayName": "cityName",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "stateName",
"type": "string",
"display": true,
"required": false,
"displayName": "stateName",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "company/cityName",
"type": "string",
"display": true,
"required": false,
"displayName": "company/cityName",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Country",
"type": "string",
"display": true,
"required": false,
"displayName": "Country",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Company Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Website",
"type": "string",
"display": true,
"required": false,
"displayName": "Website",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "company/businessIndustry",
"type": "string",
"display": true,
"required": false,
"displayName": "company/businessIndustry",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Keywords",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Keywords",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "icebreaker",
"type": "string",
"display": true,
"required": false,
"displayName": "icebreaker",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "intro",
"type": "string",
"display": true,
"required": false,
"displayName": "intro",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "value_prop",
"type": "string",
"display": true,
"required": false,
"displayName": "value_prop",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Email"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 747242514,
"cachedResultUrl": "https://docs.google.com/YOUR_AWS_SECRET_KEY_HERE_AuYTFbB1FkTtkz31ZI/edit#gid=747242514",
"cachedResultName": "Videography"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_GOOGLE_SHEETS_DOCUMENT_ID",
"cachedResultUrl": "https://docs.google.com/YOUR_AWS_SECRET_KEY_HERE_AuYTFbB1FkTtkz31ZI/edit?usp=drivesdk",
"cachedResultName": "Leads"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "14cead03-9780-4312-8952-b558c24eb2d2",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-784,
304
],
"parameters": {
"color": 5,
"width": 528,
"height": 304,
"content": "## Workflow Overview\n\nThis workflow takes the client's personal data and website to create a personalized cold outreach email.\n\n### Instructions\n\n1. Modify the **Apollo Scraper** node with your **Apify API token** and **Apollo link**.\n2. Modify the **Google Sheets** nodes.\n3. Modify the **OpenAI** nodes with your **credentials**, **company name**, and **target sector**.\n"
},
"typeVersion": 1
},
{
"id": "c589ed00-f246-4262-a35c-0f9297870dfe",
"name": "When clicking \u2018Execute workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-1440,
624
],
"parameters": {},
"typeVersion": 1
},
{
"id": "45d96539-5a2d-4aa9-b8da-cf39997b19d3",
"name": "Website HTML to Markdown",
"type": "n8n-nodes-base.markdown",
"onError": "continueRegularOutput",
"position": [
-32,
640
],
"parameters": {
"html": "={{ $json.data }}",
"options": {}
},
"typeVersion": 1
}
],
"connections": {
"Client data": {
"main": [
[
{
"node": "Domain scrape",
"type": "main",
"index": 0
}
]
]
},
"Domain scrape": {
"main": [
[
{
"node": "Website HTML to Markdown",
"type": "main",
"index": 0
}
]
]
},
"Apollo Scraper": {
"main": [
[
{
"node": "Client data",
"type": "main",
"index": 0
}
]
]
},
"Loop over one by one": {
"main": [
[],
[
{
"node": "Apollo Scraper",
"type": "main",
"index": 0
}
]
]
},
"Generate Page Numbers": {
"main": [
[
{
"node": "Loop over one by one",
"type": "main",
"index": 0
}
]
]
},
"Increment Page Number": {
"main": [
[
{
"node": "Loop over one by one",
"type": "main",
"index": 0
}
]
]
},
"Add email data to sheet": {
"main": [
[
{
"node": "Increment Page Number",
"type": "main",
"index": 0
}
]
]
},
"Creating detailed email": {
"main": [
[
{
"node": "Add email data to sheet",
"type": "main",
"index": 0
}
]
]
},
"Website HTML to Markdown": {
"main": [
[
{
"node": "Summarising prospect data",
"type": "main",
"index": 0
}
]
]
},
"Summarising prospect data": {
"main": [
[
{
"node": "Creating detailed email",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "Generate Page Numbers",
"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
This workflow automates the creation of highly personalized cold outreach emails by extracting lead data, scraping company websites, and leveraging AI to craft unique email components. This is ideal for sales teams, marketers, and business development professionals looking to…
Source: https://n8n.io/workflows/6098/ — 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 workflow is Part 2 of the HR Client Acquisition system and builds on the lead discovery pipeline from the previous workflow:
Product - SERP Analysis (Serper + Firecrawl). Uses formTrigger, httpRequest, googleSheets, openAi. Event-driven trigger; 40 nodes.
Product - SERP Analysis (Serper & Crawl4AI). Uses formTrigger, httpRequest, googleSheets, openAi. Event-driven trigger; 39 nodes.
Product - SERP Analysis (SerpAPI + Crawl4AI). Uses formTrigger, httpRequest, googleSheets, openAi. Event-driven trigger; 38 nodes.
Categories: PPC Automation, Creative Generation, Competitive Intelligence