AutomationFlowsAI & RAG › Generate Personalized Cold Email Icebreakers with Perplexity Research &…

Generate Personalized Cold Email Icebreakers with Perplexity Research &…

Original n8n title: Generate Personalized Cold Email Icebreakers with Perplexity Research & Claude Sonnet

ByAnatoly @savantageai on n8n.io

This production-ready workflow transforms your lead generation by automatically researching prospects and generating genuinely personalized icebreakers that feel human-written. What normally takes 10-15 minutes per lead now happens in under a minute, at scale.

Event trigger★★★★☆ complexityAI-powered19 nodesOpenAIOpenRouter ChatOutput Parser StructuredChain LlmGoogle Sheets
AI & RAG Trigger: Event Nodes: 19 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #9629 — we link there as the canonical source.

This workflow follows the Chainllm → 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 →

Download .json
{
  "id": "Aze4xNW0bG2NTuIf",
  "name": "AI-Powered Cold Email Icebreakers That Actually Get Responses",
  "tags": [],
  "nodes": [
    {
      "id": "33074582-e6ea-4ba4-be34-a6f4695b5958",
      "name": "Sticky Note - Data Source",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1376,
        -80
      ],
      "parameters": {
        "color": 5,
        "width": 452,
        "height": 508,
        "content": "## \ud83d\udcca DATA SOURCE: GOOGLE SHEETS\n\n**Input Requirements:**\nYour spreadsheet must contain these columns:\n- `id` - Unique identifier\n- `first_name`, `last_name`, `title`\n- `organization_name`\n- `Icebreaker` - Output (set to \"no data\" for new leads)\n- `company_name_cleanup` - Cleaned company name\n\nThe workflow only processes leads where `Icebreaker` = \"no data\", so you can re-run without duplicating work."
      },
      "typeVersion": 1
    },
    {
      "id": "7f8ff355-6c3a-4bdf-ae3a-2339cec3c289",
      "name": "Sticky Note - Batch Processing",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -928,
        -80
      ],
      "parameters": {
        "color": 6,
        "width": 264,
        "height": 508,
        "content": "## \ud83d\udd04 PROCESSING\n**Batch size:** 25 leads at a time"
      },
      "typeVersion": 1
    },
    {
      "id": "0bd311ec-7e5c-42ab-bfaf-d7765ba7ca84",
      "name": "Sticky Note - Company Name Cleanup",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -672,
        -80
      ],
      "parameters": {
        "color": 7,
        "width": 348,
        "height": 512,
        "content": "## \u270f\ufe0f COMPANY NAME STANDARDIZATION\n\n**Purpose:**\nCleans company names to sound natural in icebreakers.\n\n**Example:**\n- \"Sharp Guys Web Design Agency\" \u2192 \"Sharp Guys\"\n"
      },
      "typeVersion": 1
    },
    {
      "id": "65c388ac-5d75-4ee3-8886-31208aba6725",
      "name": "Sticky Note - Research",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -336,
        -80
      ],
      "parameters": {
        "color": 3,
        "width": 372,
        "height": 520,
        "content": "## \ud83d\udd0e COMPANY RESEARCH\n\n**Perplexity Sonar** conducts real-time web research on each company using founder full name, exact job title,and due date.\n\nExample: \"John Smith CMO Acme Corp at 14.10.2025\"\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "38c666f7-d9a3-4888-9626-6aec78a6fd7c",
      "name": "Sticky Note - Icebreaker Generation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        32,
        -80
      ],
      "parameters": {
        "color": 3,
        "width": 376,
        "height": 512,
        "content": "## \u2728 ICEBREAKER GENERATION\n\n**Claude Sonnet** crafts personalized opening lines based on research.\n\n**Why Claude Sonnet?**\nBest at nuanced, human-like writing. Understands context and avoids generic language.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "89b9858e-2ef6-448a-8e06-b0b734f35311",
      "name": "Sticky Note - Update",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        400,
        -80
      ],
      "parameters": {
        "color": 5,
        "width": 300,
        "height": 512,
        "content": "## \ud83d\udcbe UPDATE SPREADSHEET\n\n**Fields Configuration:**\n- `company_name_cleanup` \n- `icebreaker` \n\n**Update method:**\nMatches by `id` column for accurate row updates.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "715bd285-c8a7-4520-9571-8e2c3db18511",
      "name": "Sticky Note - Quick Start",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1680,
        -336
      ],
      "parameters": {
        "color": 4,
        "width": 304,
        "height": 772,
        "content": "## \ud83d\ude80 QUICK START GUIDE\n\n**Prerequisites:**\n- Google Sheets with lead data\n- OpenAI API key (GPT-4o-mini)\n- OpenRouter account (Perplexity + Claude access)\n\n**Step 1: Prepare Spreadsheet**\nCreate columns: `id`, `first_name`, `last_name`, `title`, `organization_name`, `Icebreaker`, `company_name_cleanup`. Set Icebreaker to \"no data\" for new leads.\n\n**Step 2: Configure Credentials**\nConnect Google Sheets OAuth2, OpenAI API, and OpenRouter API.\n\n**Step 3: Setup Nodes**\nSelect your spreadsheet in \"Get Leads\" and \"Update Icebreaker\" nodes.\n\n**Step 4: Test & Run**\nTest with 2-3 leads first, then run full workflow."
      },
      "typeVersion": 1
    },
    {
      "id": "9ec50fca-839f-446d-87b9-1d03e7a0baff",
      "name": "Sticky Note - Cost Analysis",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        688,
        -80
      ],
      "parameters": {
        "color": 4,
        "width": 280,
        "height": 512,
        "content": "## \ud83d\udcb0 COST ANALYSIS\n\n**Per lead:** ~$0.02\n- GPT-4o-mini: ~$0.0001\n- Perplexity Sonar: ~$0.005\n- Claude Sonnet 4: ~$0.015\n\n**Examples:**\n- 100 leads = ~$2\n- 500 leads = ~$10\n- 1,000 leads = ~$20\n\n**ROI:** If this increases response rate by 1% on high-ticket B2B, typical ROI is 100-1000x."
      },
      "typeVersion": 1
    },
    {
      "id": "e47f3da6-f275-4de1-8cda-d9f6e8bbb09f",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1600,
        256
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "55f0d612-d933-42c0-9724-23a9ade26fb1",
      "name": "Loop Over Leads",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -880,
        256
      ],
      "parameters": {
        "options": {},
        "batchSize": 25
      },
      "typeVersion": 3
    },
    {
      "id": "1ac1c796-fb63-4505-aab2-e03bf331bd19",
      "name": "Company Name Clean Up",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        -608,
        256
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "GPT-4O-MINI"
        },
        "options": {
          "topP": 1,
          "maxTokens": 250,
          "temperature": 0.6
        },
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "You are a helpful, intelligent writing assistant."
            },
            {
              "content": "=Your task is to make an icebreaker.\n\n\nTo clean up company name paraphrase {{ $('Get Leads').item.json.organization_name }}\ne.g.:\n\"The Boathouse Agency\" MUST be \"Boathouse\"\n\"Baaba Holland Agency\" MUST be \"Baaba Holland\"\n\"BNR Branding Solutions\" MUST be \"BNR\"\n\"Van Ness Agency\" MUST be \"Van Ness\"\n\"IRL Agency\" MUST be \"IRL\"\n\"Sharp Guys Web Design and Digital Marketing Agency\" MUST be \"Sharp Guys\"\n\nAlways output a cleaned up company name!\n\nReturn JSON:\n{\nCompanyNameCleanUp: \"\"\n}"
            },
            {
              "content": "Shorten all organizations, company & projects names, paraphrase so prospects think a human wrote it. \n\nExamples:\n\"Fashion Hall agency\" or \"Fashion Hall\" NOT \"THE FASHION HALL AGENCY\"; \"81 agency\" NOT \"Eighteen81 Agency\" NOT \"eighteen81 Agency\"; \"WT\" or \"WT agency\" NOT \"WT Digital Agency\"; \"Pearls\" NOT \"Pearls Marketing Agency\"; \"Kannon\" NOT \"Kannon Marketing Agency\"; \"PURE\" NOT \"Agency PURE\". If a company name contains word \"Agency\" like this: \"Cheeky Agency\" use only name of agency, e.g \"Cheeky\". If a company has \"Inc.\" or \"Group\" in the name avoid using these words in the text"
            }
          ]
        },
        "jsonOutput": true
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 1.6
    },
    {
      "id": "d3fc0e7f-aa5c-4371-9320-8464732f974a",
      "name": "Perplexity Sonar",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        -256,
        352
      ],
      "parameters": {
        "model": "perplexity/sonar",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "b995242f-530f-4ab0-8aa6-805cb02ccac7",
      "name": "Claude Sonnet",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        112,
        352
      ],
      "parameters": {
        "model": "anthropic/claude-sonnet-4",
        "options": {
          "topP": 0.8,
          "maxTokens": 300
        }
      },
      "typeVersion": 1
    },
    {
      "id": "107c9bc9-0ed5-4513-9312-b287705e1842",
      "name": "Parse JSON",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        256,
        352
      ],
      "parameters": {
        "jsonSchemaExample": "{\"icebreaker\":\"\"}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "9433978e-fbcc-4c33-8366-285ff7a7ae17",
      "name": "Generate Icebreaker",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        112,
        256
      ],
      "parameters": {
        "text": "=You are a helpful, intelligent assistant",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "=You are a helpful, intelligent assistant"
            },
            {
              "type": "HumanMessagePromptTemplate",
              "message": "=Write an icebreaker\u2014a one line, customized introduction\u2014for a cold email campaign.\n\nUse the provided data (from a Google Search) as context.\n\nGuidlines:\n1. Your tone of voice should be \"casual bar converation\" and very spartan. No fancy language.\n2. Look for plausible (but vague) connections wherever possible.\n3. Do not lie & stratch the truth. For example, if one was a poker pro player, do not mention that I was as well!\n4. After \"Hey [firstName],\"  always put \\n\\n\n5. End the icebreaker with \"I wanted to share something that could be relevant for {{ $('Company Name Clean Up').item.json.message.content.CompanyNameCleanUp }}\".\n\nExample icebreakers:\n\n\"Hey Boris,\\n\\nReally like the way Parisleaf started with that whole print and plant tree thing back in 2015 - pretty cool how you've grown that into helping nonprofits with their fundraising campaigns, I wanted to share something that could be relevant Parismover\""
            },
            {
              "type": "HumanMessagePromptTemplate",
              "message": "={\"context\":\"{{ $json.text }}\"}"
            }
          ]
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.7
    },
    {
      "id": "5442e9b6-32a4-4c7d-9502-e444f3d3e8dd",
      "name": "Perplexity Research",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        -256,
        256
      ],
      "parameters": {
        "text": "=Find information",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "type": "HumanMessagePromptTemplate",
              "message": "={{ $('Get Leads').item.json.first_name }} {{ $('Get Leads').item.json.last_name }} {{ $('Get Leads').item.json.title }} {{ $('Get Leads').item.json.organization_name }} at {{ $now.toFormat('dd.MM.yyyy') }}"
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "1489908c-e151-416e-93df-9c56ba8e7d92",
      "name": "Update Icebreaker",
      "type": "n8n-nodes-base.googleSheets",
      "maxTries": 2,
      "position": [
        496,
        256
      ],
      "parameters": {
        "columns": {
          "value": {
            "id": "={{ $('Get Leads').item.json.id }}",
            "Icebreaker": "={{ $json.output.icebreaker }}",
            "row_number": 0,
            "company_name_cleanup": "={{ $('Company Name Clean Up').item.json.message.content.CompanyNameCleanUp }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "id",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "company_name_cleanup",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "company_name_cleanup",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Icebreaker",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Icebreaker",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "id"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": " "
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": ""
        }
      },
      "retryOnFail": false,
      "typeVersion": 4.6
    },
    {
      "id": "ae2616ec-c0e4-4267-ace9-523e475c9f8d",
      "name": "Check If Unprocessed ",
      "type": "n8n-nodes-base.if",
      "position": [
        -1104,
        256
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "ebb9dbd8-0616-4a42-a4c2-1aa2532f8b15",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.Icebreaker }}",
              "rightValue": "no data"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "b92cd82b-8276-48a6-b99f-c9cc5351492a",
      "name": "Get Leads",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -1328,
        256
      ],
      "parameters": {
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultUrl": "",
          "cachedResultName": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "="
        }
      },
      "executeOnce": false,
      "typeVersion": 4.6
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "9d51a60e-dd00-4180-a410-a55786c900c7",
  "connections": {
    "Get Leads": {
      "main": [
        [
          {
            "node": "Check If Unprocessed ",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse JSON": {
      "ai_outputParser": [
        [
          {
            "node": "Generate Icebreaker",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Claude Sonnet": {
      "ai_languageModel": [
        [
          {
            "node": "Generate Icebreaker",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Leads": {
      "main": [
        [],
        [
          {
            "node": "Company Name Clean Up",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Perplexity Sonar": {
      "ai_languageModel": [
        [
          {
            "node": "Perplexity Research",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Update Icebreaker": {
      "main": [
        [
          {
            "node": "Loop Over Leads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Icebreaker": {
      "main": [
        [
          {
            "node": "Update Icebreaker",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Perplexity Research": {
      "main": [
        [
          {
            "node": "Generate Icebreaker",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check If Unprocessed ": {
      "main": [
        [
          {
            "node": "Loop Over Leads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Company Name Clean Up": {
      "main": [
        [
          {
            "node": "Perplexity Research",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Get Leads",
            "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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This production-ready workflow transforms your lead generation by automatically researching prospects and generating genuinely personalized icebreakers that feel human-written. What normally takes 10-15 minutes per lead now happens in under a minute, at scale.

Source: https://n8n.io/workflows/9629/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Automatically capture, categorize, and log expenses from receipts, PDFs, voice notes, or text — powered by AI and integrated with Telegram and Google Sheets.

HTTP Request, OpenAI, Chain Llm +6
AI & RAG

This n8n automation is a complete LinkedIn Content Engine that turns simple topic ideas into fully written, visual, and scheduled posts. It features a "Human-in-the-Loop" design, meaning AI handles th

HTTP Request, Google Sheets, Chain Llm +5
AI & RAG

leads. Uses supabase, gmail, formTrigger, httpRequest. Webhook trigger; 62 nodes.

Supabase, Gmail, Form Trigger +13
AI & RAG

🧠 Automate end-to-end SEO blog creation and WordPress publishing using a GPT-5 multi-agent workflow with real-time research, metadata generation, and optional featured images.

Output Parser Structured, HTTP Request, OpenAI +10
AI & RAG

Transform your WhatsApp group conversations into actionable business intelligence through automated AI analysis and daily reporting. This workflow eliminates manual conversation monitoring by capturin

OpenRouter Chat, Output Parser Autofixing, Agent +6