AutomationFlowsAI & RAG › Generate Personalized Cold Email Openers From LinkedIn Posts

Generate Personalized Cold Email Openers From LinkedIn Posts

Original n8n title: Generate Personalized Cold Email Openers From Linkedin Posts with Gpt-4o

ByDajeel Dulal @dajeel on n8n.io

Turn any LinkedIn post into a personalized cold email opener that sounds like a human wrote it in seconds.

Event trigger★★★★☆ complexityAI-powered8 nodesOpenAIForm Trigger
AI & RAG Trigger: Event Nodes: 8 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Form Trigger → OpenAI 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": "oJXYeAsW2fEXu2CM",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "LinkedIn Post To Personalized Opener",
  "tags": [],
  "nodes": [
    {
      "id": "4cc7a4e7-aeb1-4eae-a73e-a6106d8a126b",
      "name": "Try This Example",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        580,
        580
      ],
      "parameters": {
        "width": 480,
        "height": 600,
        "content": "**Test with this (Copy & Paste):**\n\nAuthor: Shakira Johhson\n\nCompany: Apple\n\nPost:\n\nJust closed our Series B! \ud83d\ude80 \n\nHonestly didn't think we'd get here 2 years ago when we were bootstrapping in my garage. Now we're scaling our AI workflow automation to help 10,000+ businesses.\n\nShoutout to the team who believed in the vision when it was just sketches on a whiteboard. This is just the beginning.\n\n#TechCorp #SeriesB #AI #Automation\n\n**You'll get something like this:**\n\n\"Came across your post on LinkedIn - from garage sketches to Series B is incredible, and the 10,000+ businesses you're helping with AI automation shows the real impact.\"\n\n**Pro tips:**\n- Use recent posts (last 30 days)\n- Longer posts = better personalization\n- Company updates work best\n- Achievement posts are gold"
      },
      "typeVersion": 1
    },
    {
      "id": "8f299bd9-fbee-4933-8646-a9c654eb8ffd",
      "name": "What This Does",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1420,
        140
      ],
      "parameters": {
        "width": 400,
        "height": 560,
        "content": "**What this does:**\n\n1. Fill out the form with LinkedIn post\n2. AI reads it like a human would\n3. Creates personalized opener\n4. You get copy-ready result\n\n**Why it works:**\n- References specific details\n- Sounds natural, not robotic\n- Shows you actually read their content\n- Builds instant credibility\n\n**Perfect for:**\n- Sales reps\n- Business development\n- Agency outreach\n- Partnership building\n\n**Setup:**\n1. Add OpenAI API key (Or, just use free n8n OpenAI credits)\n2. Test with example\n3. Start personalizing\n\nThat's it."
      },
      "typeVersion": 1
    },
    {
      "id": "538a0c40-6292-460b-a12c-914ad5443e4b",
      "name": "Output & Next Steps",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1420,
        980
      ],
      "parameters": {
        "width": 400,
        "height": 280,
        "content": "**Where to find your output:**\n\nClick on \"Format Output\" node after running the workflow.\n\nYou'll see:\n- **opener**: Your personalized email opener\n- **prospect**: The person's name\n- **company**: Their company name\n- **next_steps**: What to do next\n- **tips**: Email best practices\n\n**Save your results:**\n- Connect Google Sheets node\n- Add to your CRM\n- Send to email tool\n- Log in database\n\n**Make it yours:**\n- Edit the AI prompt for your industry\n- Add more form fields\n- Connect to your tools\n- Batch process multiple posts\n\n**Pro tip:** The output is structured JSON - easy to connect to any tool you use."
      },
      "typeVersion": 1
    },
    {
      "id": "1f9660c3-8a4d-4b0a-b0cb-0fb9335f236f",
      "name": "Why This Works",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2060,
        740
      ],
      "parameters": {
        "width": 400,
        "height": 140,
        "content": "** Further connect to your tools:**\n- Google Sheets for logging\n- CRM for prospect data\n- Email tools for sending\n- Slack for notifications"
      },
      "typeVersion": 1
    },
    {
      "id": "4e7c2e84-5451-4946-9a37-cf98db194729",
      "name": "Format Output",
      "type": "n8n-nodes-base.code",
      "position": [
        1840,
        760
      ],
      "parameters": {
        "jsCode": "// Get AI response and original data\nconst aiResponse = $input.first().json;\nconst originalData = $('Process Input').first().json;\n\n// Extract the personalized opener\nconst opener = aiResponse.message?.content || aiResponse.text || \"Something went wrong. Try again.\";\n\n// Clean up the opener\nconst cleanOpener = opener\n  .replace(/^\"|\"$/g, '')\n  .replace(/^'|'$/g, '')\n  .trim();\n\n// Create final response\nconst response = {\n  success: true,\n  opener: cleanOpener,\n  prospect: originalData.first_name,\n  company: originalData.company_name,\n  next_steps: [\n    \"1. Copy the opener above\",\n    \"2. Add your value prop (2-3 sentences max)\",\n    \"3. Include clear CTA\",\n    \"4. Send it\"\n  ],\n  tips: [\n    \"Keep total email under 100 words\",\n    \"Send Tuesday-Thursday, 8-10am\",\n    \"Follow up in 3-5 days if no response\",\n    \"Personalize the subject line too\"\n  ]\n};\n\nreturn { json: response };"
      },
      "typeVersion": 2
    },
    {
      "id": "7470a3f6-f7cb-455c-b8c1-82a87d2a0e05",
      "name": "AI Magic",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        1500,
        760
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {
          "maxTokens": 150,
          "temperature": 0.8
        },
        "messages": {
          "values": [
            {
              "content": "You are an elite B2B sales expert who crafts personalized cold email openers that get responses.\n\nYour specialty: Taking LinkedIn posts and creating openers that feel like they came from someone who actually READ and UNDERSTOOD the content.\n\nRules:\n- Reference specific details, metrics, or insights from the post\n- Sound like a human, not a bot\n- Show genuine interest in their work/achievement\n- Avoid generic praise (\"great post\", \"inspiring\", \"amazing\")\n- Be conversational but professional\n- Focus on what makes this post unique\n\nComplete this sentence: \"Came across your post on LinkedIn - \"\n\nMake it feel like you're genuinely interested in what they shared, not just trying to sell them something.\n\nExamples of what works:\n- \"Came across your post on LinkedIn - going from 5 to 50 employees in 18 months while maintaining 98% customer satisfaction is seriously impressive execution.\"\n- \"Came across your post on LinkedIn - the insight about AI replacing tasks, not jobs, really resonates with what we're seeing in manufacturing right now.\"\n- \"Came across your post on LinkedIn - bootstrapping to $2M ARR without external funding while building a distributed team is exactly the kind of scrappy growth I respect.\"\n\nOutput ONLY the completed sentence."
            },
            {
              "content": "=LinkedIn Post:\n{{ $json.post_content }}\n\nAuthor: {{ $json.first_name }}\nCompany: {{ $json.company_name }}"
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "7948c914-c9c3-4675-993c-51cb0c7f8979",
      "name": "LinkedIn Post Form",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        1140,
        760
      ],
      "parameters": {
        "path": "6fbe076d-b99c-4dea-8575-ec53ad0a6e0a",
        "options": {},
        "formTitle": "LinkedIn Post Opener Generator",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Author's First Name",
              "requiredField": true
            },
            {
              "fieldLabel": "Company Name",
              "requiredField": true
            },
            {
              "fieldType": "textarea",
              "fieldLabel": "LinkedIn Post Content",
              "requiredField": true
            }
          ]
        },
        "formDescription": "Paste any LinkedIn post and get a personalized cold email opener that actually sounds human."
      },
      "typeVersion": 2.1
    },
    {
      "id": "506fae22-1567-46be-8e74-263a5b4a1f84",
      "name": "Process Input",
      "type": "n8n-nodes-base.code",
      "position": [
        1320,
        760
      ],
      "parameters": {
        "jsCode": "// Get form data\nconst firstName = $json['Author\\'s First Name']?.trim();\nconst companyName = $json['Company Name']?.trim();\nconst postContent = $json['LinkedIn Post Content']?.trim();\n\n// Validate input\nif (!firstName || !companyName || !postContent) {\n  throw new Error('All fields are required');\n}\n\nif (postContent.length < 50) {\n  throw new Error('Post too short. Need at least 50 characters for good personalization.');\n}\n\n// Clean the post content\nconst cleanedPost = postContent\n  .replace(/\\s+/g, ' ')\n  .replace(/[\\r\\n]+/g, ' ')\n  .trim();\n\nreturn {\n  json: {\n    first_name: firstName,\n    company_name: companyName,\n    post_content: cleanedPost,\n    timestamp: new Date().toISOString()\n  }\n};"
      },
      "typeVersion": 2
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "c2d342d7-3f02-41e5-95bd-cea679b53bee",
  "connections": {
    "AI Magic": {
      "main": [
        [
          {
            "node": "Format Output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Input": {
      "main": [
        [
          {
            "node": "AI Magic",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "LinkedIn Post Form": {
      "main": [
        [
          {
            "node": "Process Input",
            "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

Turn any LinkedIn post into a personalized cold email opener that sounds like a human wrote it in seconds.

Source: https://n8n.io/workflows/5856/ — 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

Note: Now includes an Apify alternative for Rapid API (Some users can't create new accounts on Rapid API, so I have added an alternative for you. But immediately you are able to get access to Rapid AP

Form Trigger, Google Sheets Trigger, OpenAI +2
AI & RAG

This system automates LinkedIn lead generation and enrichment in six clear stages: Lead Collection (via Apollo.io) Automatically pulls leads based on keywords, roles, or industries using Apollo’s API.

Form Trigger, OpenAI, Google Sheets Trigger +2
AI & RAG

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Airtable, OpenAI, Form Trigger +3
AI & RAG

Goal: This workflow demonstrates the full fluidX THE EYE integration — starting a live session, inviting both the customer (via SMS) and the service agent (via email), and then accessing the media (ph

Form Trigger, Google Drive, Email Send +3
AI & RAG

This workflow is ideal for content creators, training providers, agencies, and businesses that need to quickly turn raw videos into polished, captioned, or narrated content — without hiring editors or

Ssh, Form Trigger, Ftp +3