AutomationFlowsAI & RAG › Send Ai-personalized Linkedin Outreach From Google Sheets with Azure Openai…

Send Ai-personalized Linkedin Outreach From Google Sheets with Azure Openai…

Original n8n title: Send Ai-personalized Linkedin Outreach From Google Sheets with Azure Openai and Connectsafely

ByRahul Joshi @rahul08 on n8n.io

Automate personalized LinkedIn outreach at scale using AI and real prospect data. 🤖📧 This workflow pulls leads from Google Sheets, generates human-like LinkedIn messages with Azure OpenAI, and sends them safely via the ConnectSafely LinkedIn API. It intelligently avoids…

Cron / scheduled trigger★★★★☆ complexityAI-powered19 nodesGoogle SheetsAgentLm Chat Azure Open AiN8N Nodes Connectsafely AiHTTP Request
AI & RAG Trigger: Cron / scheduled Nodes: 19 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Agent → 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": "a9s07MGpyP64nPkW",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "LinkedIn Outreach Automation- Connectsafely",
  "tags": [],
  "nodes": [
    {
      "id": "bd6b0b21-61ad-4bf1-8ffb-8d2401b264a2",
      "name": "Main Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3472,
        736
      ],
      "parameters": {
        "color": 4,
        "width": 465,
        "height": 801,
        "content": "### How it works\n\nThis workflow automates personalized LinkedIn outreach for B2B lead generation. It runs daily at 5 PM, fetching prospect data from Google Sheets, generating AI-powered personalized messages using Azure OpenAI, and sending them via ConnectSafely LinkedIn API.\n\nThe workflow checks if a LinkedIn message already exists for each prospect. If not, it uses an AI agent with prospect context (name, role, company, industry, location) to craft natural, non-salesy messages that reference recent LinkedIn activity. Generated messages are saved back to the sheet, then the workflow validates message status before sending. After successful delivery, profile URNs and message status are recorded.\n\n### Setup steps\n\n1. **Google Sheets**: Connect your Google account and configure the document ID with sheet \"Automation result\"\n2. **Azure OpenAI**: Add your Azure OpenAI credentials for the GPT-4o-mini model\n3. **ConnectSafely**: Configure your ConnectSafely API credentials\n4. **Schedule**: Adjust the cron expression if you want a different execution time (default: 5 PM daily)\n\n### Customization\n\n- Modify the AI agent's system message and prompt to match your brand voice\n- Adjust the message length (currently 50-85 words)\n- Change the batch processing rate in Loop Over Items\n- Update the Google Sheet column mappings to match your data structure"
      },
      "typeVersion": 1
    },
    {
      "id": "31244ebe-798b-4745-a74b-a735df669bcd",
      "name": "Section: Data Retrieval",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2976,
        864
      ],
      "parameters": {
        "color": 5,
        "width": 280,
        "height": 136,
        "content": "## Data Retrieval\n\nFetches prospect records from Google Sheets that need personalized LinkedIn messages generated."
      },
      "typeVersion": 1
    },
    {
      "id": "20fd1a9a-3984-42d9-8edf-95285505275d",
      "name": "Section: AI Message Generation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2560,
        864
      ],
      "parameters": {
        "color": 5,
        "width": 400,
        "height": 136,
        "content": "## AI Message Generation\n\nGenerates personalized LinkedIn messages using AI based on prospect data. Loops through each prospect record and creates contextual outreach messages."
      },
      "typeVersion": 1
    },
    {
      "id": "4c079ca8-6a7b-4998-acde-d0f2f551196b",
      "name": "Section: Message Validation & Sending",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1584,
        880
      ],
      "parameters": {
        "color": 5,
        "width": 520,
        "height": 152,
        "content": "## Message Validation & LinkedIn Sending\n\nValidates generated messages exist and are not empty, retrieves profile information via API, then sends personalized messages through ConnectSafely LinkedIn."
      },
      "typeVersion": 1
    },
    {
      "id": "0e6acc33-aa5c-4001-bff2-8d196b13b05d",
      "name": "Warning: Azure OpenAI",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2320,
        1264
      ],
      "parameters": {
        "color": 2,
        "height": 188,
        "content": "\u26a0\ufe0f **Azure OpenAI Credentials Required**\n\nYou must configure Azure OpenAI API credentials with access to the gpt-4o-mini model. Without valid credentials, the AI message generation will fail."
      },
      "typeVersion": 1
    },
    {
      "id": "e9d3bd40-ba95-4154-94f2-d91fd254d2d4",
      "name": "Warning: ConnectSafely",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -736,
        1248
      ],
      "parameters": {
        "color": 2,
        "height": 156,
        "content": "\u26a0\ufe0f **ConnectSafely API Required**\n\nThis node requires valid ConnectSafely LinkedIn API credentials. Ensure your API key is active and has permission to send messages."
      },
      "typeVersion": 1
    },
    {
      "id": "c04c7ee0-0362-4d8d-9ff5-2831c89e725c",
      "name": "Check if Message Exists",
      "type": "n8n-nodes-base.if",
      "position": [
        -2544,
        1024
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "5d3e626a-4540-4aa7-bfe3-4eac4195b073",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json[\"LinkedIn message\"] }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "4a3f686c-f19c-4011-a1c6-903fedfedf3f",
      "name": "Save Generated Message to Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueRegularOutput",
      "position": [
        -1744,
        1024
      ],
      "parameters": {
        "columns": {
          "value": {
            "Person Name": "={{ $('Loop Over Items1').item.json['Person Name'] }}",
            "LinkedIn message": "={{ $json.output }}"
          },
          "schema": [
            {
              "id": "Person Name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Person Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Current role",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Current role",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Post Url",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Post Url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company name",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Company name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Linkedin Url",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Linkedin Url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Person Email",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Person Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Seniority",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Seniority",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Industry",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Industry",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company size",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Company size",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Loacation",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Loacation",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Key Focus Area",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Key Focus Area",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "LinkedIn message",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "LinkedIn message",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Person Name"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 987670951,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1figNpIMxgqp1L47tYWStpY1yB4F9txn605MKX_5x5rI/edit#gid=987670951",
          "cachedResultName": "Automation result"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1figNpIMxgqp1L47tYWStpY1yB4F9txn605MKX_5x5rI",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1figNpIMxgqp1L47tYWStpY1yB4F9txn605MKX_5x5rI/edit?usp=drivesdk",
          "cachedResultName": "Linkedin url sheet"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "471ad27b-f257-4a38-86fa-42f909aa6e60",
      "name": "Generate Personalized Message with AI",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -2096,
        1024
      ],
      "parameters": {
        "text": "=Using the prospect data below, write a personalized LinkedIn message.\n\nProspect Data:\n{\n  \"Person Name\": \"{{ $json['Person Name'] }}\",\n  \"Company name\": \"{{ $json['Company name'] }}\",\n  \"Current role\": \"{{ $json['Current role'] }}\",\n  \"Industry\": \"{{ $json['Industry'] }}\",\n  \"Company size\": \"{{ $json['Company size'] }}\",\n  \"Location\": \"{{ $json['Loacation'] }}\",\n  \"Key Focus Area\": \"{{ $json['Key Focus Area'] }}\"\n}\n\nInstructions:\n- Start by mentioning that you saw their recent post or comment on LinkedIn.\n- Naturally connect that activity to growth, demand generation, or lead flow challenges.\n- Personalize using role, company, industry, or focus area.\n- Position the message as exploratory and helpful, not a pitch.\n- Invite them to a light conversation to see if there\u2019s any way to help.\n\nOutput ONLY the LinkedIn message text. No explanations, no formatting, no emojis.\n",
        "options": {
          "systemMessage": "=You are a B2B LinkedIn outreach copywriter writing first-touch messages for a lead generation agency.\n\nYour task is to write short, highly personalized LinkedIn messages that reference a prospect\u2019s recent post, comment, or expressed intent (even if generic), and open a friendly conversation.\n\nRules:\n- Always mention that you noticed their post, comment, or recent activity.\n- Politely infer that they may be exploring growth, demand generation, or lead flow.\n- Do NOT claim exact details about the post \u2014 keep it natural and non-assumptive.\n- Tone must be friendly, observant, and helpful (not salesy).\n- Avoid buzzwords, hype, or aggressive CTAs.\n- Do NOT include links.\n- Length: 50\u201385 words.\n- End with a soft, optional CTA (e.g., \u201copen to a quick chat?\u201d).\n- Assume this is a first LinkedIn message.\n\nContext:\nYou represent LeadMe (https://leadme.cloud/agencies), a B2B lead generation agency helping founders and leadership teams set up consistent, qualified outbound conversations.\n"
        },
        "promptType": "define"
      },
      "typeVersion": 3
    },
    {
      "id": "690a96d6-89b7-409b-9a7e-653b32c25aa5",
      "name": "Azure OpenAI GPT-4o-mini",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        -2032,
        1248
      ],
      "parameters": {
        "model": "gpt-4o-mini",
        "options": {}
      },
      "credentials": {
        "azureOpenAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "85ec88a4-d964-45cf-ac34-9e4fdbb77783",
      "name": "Validate Message Not Empty",
      "type": "n8n-nodes-base.if",
      "position": [
        -1296,
        1024
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "2d6d7b17-4f46-4a3b-aff6-3c77c3f605f4",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json[\"LinkedIn message\"] }}",
              "rightValue": "ADDED in AIMFOX"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "18590228-b490-4f8d-a264-cce70c9e2e1a",
      "name": "Fetch Updated Prospect Data",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueRegularOutput",
      "position": [
        -1520,
        1024
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 987670951,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1figNpIMxgqp1L47tYWStpY1yB4F9txn605MKX_5x5rI/edit#gid=987670951",
          "cachedResultName": "Automation result"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1figNpIMxgqp1L47tYWStpY1yB4F9txn605MKX_5x5rI",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1figNpIMxgqp1L47tYWStpY1yB4F9txn605MKX_5x5rI/edit?usp=drivesdk",
          "cachedResultName": "Linkedin url sheet"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "executeOnce": true,
      "typeVersion": 4.7
    },
    {
      "id": "0bdece18-bbe2-4885-ada7-c773fbb9f91d",
      "name": "Get Prospects from Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueRegularOutput",
      "position": [
        -2768,
        1024
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 987670951,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1figNpIMxgqp1L47tYWStpY1yB4F9txn605MKX_5x5rI/edit#gid=987670951",
          "cachedResultName": "Automation result"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1figNpIMxgqp1L47tYWStpY1yB4F9txn605MKX_5x5rI",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1figNpIMxgqp1L47tYWStpY1yB4F9txn605MKX_5x5rI/edit?usp=drivesdk",
          "cachedResultName": "Linkedin url sheet"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "executeOnce": true,
      "typeVersion": 4.7
    },
    {
      "id": "2723a670-3b73-4b8a-9c7c-3d21bc797aa0",
      "name": "Daily Schedule Trigger (5 PM)",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -2992,
        1024
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 0 17 * * *"
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "10868abb-2447-45c4-9b63-cf492b1ef7b5",
      "name": "Batch Process Prospects",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -2320,
        1024
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "92ca240b-e5e6-4b76-982f-1fdd8512ed2c",
      "name": "Send LinkedIn Message via ConnectSafely",
      "type": "n8n-nodes-connectsafely-ai.connectSafelyLinkedIn",
      "position": [
        -624,
        1024
      ],
      "parameters": {
        "message": "=Hii testt vedant",
        "subject": "test",
        "accountId": "695ce64a09c18d6bbbe90ed0",
        "operation": "sendMessage",
        "recipientProfileId": "={{ $json.profileId }}",
        "recipientProfileUrn": "={{ $json.profileUrn }}"
      },
      "credentials": {
        "connectSafelyApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "0aab6792-d440-4ab6-88d6-82a97ca034c5",
      "name": "Get LinkedIn Profile Data",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1072,
        1024
      ],
      "parameters": {
        "url": "https://api.connectsafely.ai/linkedin/profile",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "profileId",
              "value": "vedant-badwaniya-4a0465333"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_TOKEN_HERE"
            }
          ]
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "1c04d962-a954-41af-b880-e62a40b38479",
      "name": "Extract Profile URN and Identifiers",
      "type": "n8n-nodes-base.code",
      "position": [
        -848,
        1024
      ],
      "parameters": {
        "jsCode": "// Input: single item from ConnectSafely \"Get Profile\" response\n\nconst item = items[0].json;\n\nconst profile = item.profile || {};\n\nconst profileUrn = profile.entityUrn || null;\nconst profileId = item.profileId || profile.publicIdentifier || null;\nconst publicIdentifier = profile.publicIdentifier || null;\n\nconst firstName = profile.firstName || null;\nconst lastName = profile.lastName || null;\n\nconst profileUrl = publicIdentifier\n  ? `https://www.linkedin.com/in/${publicIdentifier}/`\n  : null;\n\nreturn [\n  {\n    json: {\n      success: item.success ?? false,\n\n      // Core identifiers (MOST IMPORTANT)\n      profileUrn,\n      profileId,\n      publicIdentifier,\n      profileUrl,\n\n      // Optional enrichment\n      firstName,\n      lastName,\n      headline: profile.headline || null,\n      countryCode: profile.location?.countryCode || null,\n    },\n  },\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "6bbf16b7-56fd-4df9-a208-80b07747d537",
      "name": "Update Sheet with Send Status",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -400,
        1024
      ],
      "parameters": {
        "columns": {
          "value": {
            "Profile urn": "={{ $json.recipientProfileUrn }}",
            "Linkedin Url": "={{ $('Code in JavaScript').item.json.profileUrl }}",
            "message sent": "={{ $json.success }}"
          },
          "schema": [
            {
              "id": "Person Name",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Person Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Current role",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Current role",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Post Url",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Post Url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company name",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Company name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Linkedin Url",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Linkedin Url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Person Email",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Person Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Seniority",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Seniority",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Industry",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Industry",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company size",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Company size",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Loacation",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Loacation",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Key Focus Area",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Key Focus Area",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "LinkedIn message",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "LinkedIn message",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Profile urn",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Profile urn",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "message sent",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "message sent",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Linkedin Url"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 987670951,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1figNpIMxgqp1L47tYWStpY1yB4F9txn605MKX_5x5rI/edit#gid=987670951",
          "cachedResultName": "Automation result"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1figNpIMxgqp1L47tYWStpY1yB4F9txn605MKX_5x5rI",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1figNpIMxgqp1L47tYWStpY1yB4F9txn605MKX_5x5rI/edit?usp=drivesdk",
          "cachedResultName": "Linkedin url sheet"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "cec4c042-1c4f-4ebe-9f4c-d94d45d1f5ad",
  "connections": {
    "Batch Process Prospects": {
      "main": [
        [],
        [
          {
            "node": "Generate Personalized Message with AI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if Message Exists": {
      "main": [
        [
          {
            "node": "Batch Process Prospects",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Azure OpenAI GPT-4o-mini": {
      "ai_languageModel": [
        [
          {
            "node": "Generate Personalized Message with AI",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Get Prospects from Sheet": {
      "main": [
        [
          {
            "node": "Check if Message Exists",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get LinkedIn Profile Data": {
      "main": [
        [
          {
            "node": "Extract Profile URN and Identifiers",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate Message Not Empty": {
      "main": [
        [
          {
            "node": "Get LinkedIn Profile Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Updated Prospect Data": {
      "main": [
        [
          {
            "node": "Validate Message Not Empty",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Daily Schedule Trigger (5 PM)": {
      "main": [
        [
          {
            "node": "Get Prospects from Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save Generated Message to Sheet": {
      "main": [
        [
          {
            "node": "Fetch Updated Prospect Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Profile URN and Identifiers": {
      "main": [
        [
          {
            "node": "Send LinkedIn Message via ConnectSafely",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Personalized Message with AI": {
      "main": [
        [
          {
            "node": "Save Generated Message to Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send LinkedIn Message via ConnectSafely": {
      "main": [
        [
          {
            "node": "Update Sheet with Send Status",
            "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

Automate personalized LinkedIn outreach at scale using AI and real prospect data. 🤖📧 This workflow pulls leads from Google Sheets, generates human-like LinkedIn messages with Azure OpenAI, and sends them safely via the ConnectSafely LinkedIn API. It intelligently avoids…

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

Automate post-purchase workflows by instantly fetching successful Stripe payments, matching them to corresponding automation templates in Google Sheets, and sending customers personalized access email

Lm Chat Azure Open Ai, Output Parser Structured, Google Sheets Tool +5
AI & RAG

Automatically analyze incoming lead replies from Google Sheets using Azure OpenAI GPT-4, classify their intent (Demo Request, Pricing, Objection, etc.), and create actionable follow-up tasks in ClickU

Google Sheets, ClickUp, HTTP Request +4
AI & RAG

YogiAI. Uses lmChatAzureOpenAi, googleSheets, outputParserAutofixing, outputParserStructured. Scheduled trigger; 31 nodes.

Lm Chat Azure Open Ai, Google Sheets, Output Parser Autofixing +5
AI & RAG

The YogiAI workflow automates sending daily yoga pose reminders and related information via Line Push Messages . This automation leverages data from a Google Sheets database containing yoga pose detai

Lm Chat Azure Open Ai, Google Sheets, Output Parser Autofixing +5
AI & RAG

Description

Lm Chat Azure Open Ai, Output Parser Structured, Google Sheets +3