AutomationFlowsData & Sheets › Score Linkedin Icp Leads and Draft Outreach with Claude, Notion and Sheets

Score Linkedin Icp Leads and Draft Outreach with Claude, Notion and Sheets

ByPeriodix @periodix on n8n.io

Automate LinkedIn lead generation from Sales Navigator search to personalized outreach. The Periodix node finds prospects, Claude AI scores each one against your ICP, writes personalized connection requests and follow-up messages for qualified leads, and logs results to Google…

Cron / scheduled trigger★★★★☆ complexity27 nodesNotionHTTP RequestGoogle Sheets@Periodix/N8N Nodes Actions
Data & Sheets Trigger: Cron / scheduled Nodes: 27 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #16373 — 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 →

Download .json
{
  "name": "Example node LinkedIn Outreach: ICP Scoring + AI Messages (Notion + Sales Nav + Claude)",
  "tags": [],
  "nodes": [
    {
      "id": "ac2409bd-b754-45b6-a331-d7cd407d1a8c",
      "name": "Hourly Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        1456,
        2368
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "e34938bc-4481-4494-a001-6ad2c2942bc1",
      "name": "Notion \u2013 Get Pending Search URLs",
      "type": "n8n-nodes-base.notion",
      "position": [
        1696,
        2368
      ],
      "parameters": {
        "limit": 10,
        "filters": {
          "conditions": [
            {
              "key": "Status|select",
              "condition": "equals",
              "selectValue": "Pending"
            }
          ]
        },
        "options": {},
        "resource": "databasePage",
        "matchType": "allFilters",
        "operation": "getAll",
        "databaseId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_NOTION_DATABASE_ID"
        },
        "filterType": "manual"
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "28526460-724a-4dec-a8f3-1e343dd5c98c",
      "name": "Extract Sales Nav URLs",
      "type": "n8n-nodes-base.code",
      "position": [
        1920,
        2368
      ],
      "parameters": {
        "jsCode": "return $input.all().map(item => {\n  const data = item.json;\n  \n  const salesNavUrl = data.property_sales_nav_url\n    || data.properties?.['Sales Nav URL']?.url\n    || '';\n\n  const pageId = data.id || '';\n  const name = data.property_campaign\n    || data.property_name\n    || data.name\n    || 'Unnamed';\n\n  return {\n    json: {\n      notion_page_id: pageId,\n      campaign_name: name,\n      sales_nav_url: salesNavUrl\n    }\n  };\n}).filter(item => item.json.sales_nav_url);"
      },
      "typeVersion": 2
    },
    {
      "id": "5bc6929c-9d8c-4c80-8f31-701c14676885",
      "name": "Loop Over Search URLs",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        2144,
        2368
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "92adf43d-fee3-41d8-9624-78e33e46da44",
      "name": "Sanitize Profiles",
      "type": "n8n-nodes-base.code",
      "position": [
        2560,
        2384
      ],
      "parameters": {
        "jsCode": "const notionPageId = $('Loop Over Search URLs').item.json.notion_page_id;\nconst campaignName = $('Loop Over Search URLs').item.json.campaign_name;\n\nconst sanitize = (str, maxLen = 300) =>\n  String(str || '')\n    .substring(0, maxLen)\n    .replace(/[^\\x20-\\x7E]/g, '')\n    .replace(/\"/g, \"'\")\n    .replace(/\\\\/g, '/');\n\nreturn $input.all().map(item => {\n  const profile = item.json;\n  return {\n    json: {\n      notion_page_id: notionPageId,\n      campaign_name: campaignName,\n      first_name: sanitize(profile.first_name || ''),\n      last_name: sanitize(profile.last_name || ''),\n      headline: sanitize(profile.headline || '', 200),\n      position1_role: sanitize(profile.current_positions?.[0]?.role || ''),\n      position1_company: sanitize(profile.current_positions?.[0]?.company || ''),\n      location: sanitize(profile.location || ''),\n      industry: sanitize(profile.current_positions?.[0]?.industry?.[0] || ''),\n      summary: sanitize(profile.summary || '', 300),\n      public_profile_url: String(profile.public_profile_url || '')\n    }\n  };\n});;"
      },
      "typeVersion": 2
    },
    {
      "id": "0e37d9d9-6163-41cf-83f6-715ac26a87b2",
      "name": "Loop Over Profiles",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        2816,
        2384
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "2d00bb6f-1b2e-43e4-84e7-517e1cf386bc",
      "name": "Delay (rate limit)",
      "type": "n8n-nodes-base.code",
      "position": [
        3072,
        2464
      ],
      "parameters": {
        "jsCode": "await new Promise(resolve => setTimeout(resolve, 1000));\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "5194d997-c3e6-411f-8846-5ad51cbf3962",
      "name": "Claude \u2013 Scoring Prompt",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3280,
        2464
      ],
      "parameters": {
        "url": "https://api.anthropic.com/v1/messages",
        "body": "={\n  \"model\": \"claude-haiku-4-5-20251001\",\n  \"max_tokens\": 300,\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": \"You are an expert SDR scoring LinkedIn profiles for ICP fit.\\n\\n[REPLACE WITH YOUR PRODUCT CONTEXT: describe what you sell, who it's for, and what problem it solves]\\n\\nSCORING 1-10:\\n9-10: [describe your best-fit signals, e.g. explicit users of your category, agency founders in your niche]\\n7-8: [describe strong-fit signals, e.g. users of competing tools, GTM engineers with relevant stack]\\n5-6: [describe moderate-fit signals, e.g. right job title but no specific tool mentions, adjacent roles]\\n3-4: [describe weak-fit signals, e.g. loosely related domain, students, junior roles]\\n1-2: [describe no-fit signals, e.g. completely unrelated industry, no automation signals]\\n\\nIMPORTANT: do NOT score 8+ just because someone has a relevant keyword in their job title. There must be a concrete signal: a specific tool mentioned, a post about relevant platforms, or founder status at a relevant company.\\n\\nProfile:\\nName: {{ $('Loop Over Profiles').item.json.first_name }} {{ $('Loop Over Profiles').item.json.last_name }}\\nHeadline: {{ $('Loop Over Profiles').item.json.headline }}\\nTitle: {{ $('Loop Over Profiles').item.json.position1_role }}\\nCompany: {{ $('Loop Over Profiles').item.json.position1_company }}\\nLocation: {{ $('Loop Over Profiles').item.json.location }}\\nIndustry: {{ $('Loop Over Profiles').item.json.industry }}\\nAbout: {{ $('Loop Over Profiles').item.json.summary }}\\n\\nRespond ONLY in valid JSON, no markdown, no backticks:\\n{\\\"score\\\": 7, \\\"reason\\\": \\\"brief reason\\\"}\"\n    }\n  ]\n}",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "raw",
        "sendHeaders": true,
        "rawContentType": "application/json",
        "headerParameters": {
          "parameters": [
            {
              "name": "x-api-key",
              "value": "YOUR_API_KEY_HERE"
            },
            {
              "name": "anthropic-version",
              "value": "2023-06-01"
            }
          ]
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "a0982302-05b1-4412-ac82-d6a5fa4c716d",
      "name": "Score \u2265 5?",
      "type": "n8n-nodes-base.if",
      "position": [
        3488,
        2464
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "score-threshold-001",
              "operator": {
                "type": "number",
                "operation": "gte"
              },
              "leftValue": "={{ JSON.parse($('Claude \u2013 Scoring Prompt').item.json.content[0].text.replace(/```json\\n?|\\n?```/g, '').trim()).score }}",
              "rightValue": 5
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "7273039d-4a95-4e6c-8149-a3f2376e6d54",
      "name": "Delay before M1",
      "type": "n8n-nodes-base.code",
      "position": [
        3712,
        2192
      ],
      "parameters": {
        "jsCode": "await new Promise(resolve => setTimeout(resolve, 1000));\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "96db6de0-324a-4152-ae85-5518c9cbdbf3",
      "name": "Claude \u2013 M1 + Connection Note",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3936,
        2192
      ],
      "parameters": {
        "url": "https://api.anthropic.com/v1/messages",
        "body": "={\n  \"model\": \"claude-haiku-4-5-20251001\",\n  \"max_tokens\": 600,\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": \"You are an expert SDR writing LinkedIn outreach. Target found via Sales Navigator ICP search.\\n\\nPRODUCT CONTEXT:\\n[REPLACE WITH YOUR PRODUCT CONTEXT]\\n- What your product does\\n- Key differentiators\\n- Pricing (optional)\\n\\nCONNECTION NOTE rules:\\n- Max 200 characters\\n- Reference ONE specific detail from their profile (project, tool, company initiative) not just job title\\n- Sound like a peer, not a seller. No selling, no mention of your product\\n- BANNED openings: \\\"Saw your...\\\", \\\"Noticed your...\\\", \\\"Saw you...\\\", \\\"I saw...\\\", \\\"I noticed...\\\"\\n- Vary the opening: use questions, observations, shared interests, compliments about something specific\\n- Goal: get the request accepted\\n\\nM1 (first message after connection accepted) rules:\\n- Max 3 sentences. Each under 25 words\\n- Sentence 1: reference something SPECIFIC from their profile (project, tool, initiative). NOT just title or company name\\n- Sentence 2: bridge to the problem you solve, framed as THEIR problem. Do NOT mention your product by name\\n- Sentence 3: ONE specific question about THEIR situation\\n- Do NOT mention your product by name, price, or list competing tools in parentheses\\n- Vary structure across leads\\n\\nANTI-PATTERNS (never do these):\\n- Generic opener + product pitch + generic question\\n- Listing competing tools in parentheses\\n- Generic questions about \\\"stack\\\" or \\\"pipeline\\\"\\n- Any two leads getting the same sentence structure\\n\\nProfile:\\nName: {{ $('Loop Over Profiles').item.json.first_name }} {{ $('Loop Over Profiles').item.json.last_name }}\\nHeadline: {{ $('Loop Over Profiles').item.json.headline }}\\nCompany: {{ $('Loop Over Profiles').item.json.position1_company }}\\nLocation: {{ $('Loop Over Profiles').item.json.location }}\\nIndustry: {{ $('Loop Over Profiles').item.json.industry }}\\n\\nRespond ONLY in valid JSON, no markdown, no backticks:\\n{\\\"connection_note\\\": \\\"text max 200 chars\\\", \\\"m1_message\\\": \\\"first message text\\\"}\"\n    }\n  ]\n}",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "raw",
        "sendHeaders": true,
        "rawContentType": "application/json",
        "headerParameters": {
          "parameters": [
            {
              "name": "x-api-key",
              "value": "YOUR_API_KEY_HERE"
            },
            {
              "name": "anthropic-version",
              "value": "2023-06-01"
            }
          ]
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "44a3c137-09e4-4f59-b2f3-d5650e4e6d28",
      "name": "Sheets \u2013 Append Validated",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        4144,
        2192
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ new Date().toLocaleString('uk-UA') }}",
            "Score": "={{ JSON.parse($('Claude \u2013 Scoring Prompt').item.json.content[0].text.replace(/```json\\n?|\\n?```/g, '').trim()).score }}",
            "Title": "={{ $('Loop Over Profiles').item.json.position1_role }}",
            "Reason": "={{ JSON.parse($('Claude \u2013 Scoring Prompt').item.json.content[0].text.replace(/```json\\n?|\\n?```/g, '').trim()).reason }}",
            "Company": "={{ $('Loop Over Profiles').item.json.position1_company }}",
            "Campaign": "={{ $('Loop Over Profiles').item.json.campaign_name }}",
            "Industry": "={{ $('Loop Over Profiles').item.json.industry }}",
            "Location": "={{ $('Loop Over Profiles').item.json.location }}",
            "Last Name": "={{ $('Loop Over Profiles').item.json.last_name }}",
            "First Name": "={{ $('Loop Over Profiles').item.json.first_name }}",
            "M1 Message": "={{ JSON.parse($('Claude \u2013 M1 + Connection Note').item.json.content[0].text.replace(/```json\\n?|\\n?```/g, '').trim()).m1_message }}",
            "LinkedIn URL": "={{ $('Loop Over Profiles').item.json.public_profile_url }}",
            "Notion Page ID": "={{ $('Loop Over Profiles').item.json.notion_page_id }}",
            "Connection Note": "={{ JSON.parse($('Claude \u2013 M1 + Connection Note').item.json.content[0].text.replace(/```json\\n?|\\n?```/g, '').trim()).connection_note }}"
          },
          "schema": [
            {
              "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": "Title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Company",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Location",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Location",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Industry",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Industry",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "LinkedIn URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "LinkedIn URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Reason",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Reason",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Connection Note",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Connection Note",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "M1 Message",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "M1 Message",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Campaign",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Campaign",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Notion Page ID",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Notion Page ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Validated"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "606eadc6-562c-4ef1-8e18-999519af7a14",
      "name": "Delay Rejected",
      "type": "n8n-nodes-base.code",
      "position": [
        3696,
        2480
      ],
      "parameters": {
        "jsCode": "await new Promise(resolve => setTimeout(resolve, 500));\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "4675c686-9f0b-4ec7-a33a-b02640fddd3a",
      "name": "Sheets \u2013 Append Rejected",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3888,
        2480
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ new Date().toLocaleString('uk-UA') }}",
            "Score": "={{ JSON.parse($('Claude \u2013 Scoring Prompt').item.json.content[0].text.replace(/```json\\n?|\\n?```/g, '').trim()).score }}",
            "Title": "={{ $('Loop Over Profiles').item.json.position1_role }}",
            "Reason": "={{ JSON.parse($('Claude \u2013 Scoring Prompt').item.json.content[0].text.replace(/```json\\n?|\\n?```/g, '').trim()).reason }}",
            "Company": "={{ $('Loop Over Profiles').item.json.position1_company }}",
            "Campaign": "={{ $('Loop Over Profiles').item.json.campaign_name }}",
            "Industry": "={{ $('Loop Over Profiles').item.json.industry }}",
            "Location": "={{ $('Loop Over Profiles').item.json.location }}",
            "Last Name": "={{ $('Loop Over Profiles').item.json.last_name }}",
            "First Name": "={{ $('Loop Over Profiles').item.json.first_name }}",
            "LinkedIn URL": "={{ $('Loop Over Profiles').item.json.public_profile_url }}",
            "Notion Page ID": "={{ $('Loop Over Profiles').item.json.notion_page_id }}",
            "Connection Note": "="
          },
          "schema": [
            {
              "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": "Title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Company",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Location",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Location",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Industry",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Industry",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "LinkedIn URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "LinkedIn URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Reason",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Reason",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Connection Note",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Connection Note",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "M1 Message",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "M1 Message",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Campaign",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Campaign",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Notion Page ID",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Notion Page ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Rejected"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "aed13727-5a6e-4713-ab95-8be303086a5c",
      "name": "Back to Profile Loop (Validated)",
      "type": "n8n-nodes-base.noOp",
      "position": [
        4352,
        2192
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "32028eb5-ce7d-4621-b033-432998f6dd78",
      "name": "Back to Profile Loop (Rejected)",
      "type": "n8n-nodes-base.noOp",
      "position": [
        4064,
        2480
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "83d0e198-232e-4cf5-affe-da295d8a9705",
      "name": "Notion \u2013 Mark as Done",
      "type": "n8n-nodes-base.notion",
      "position": [
        3040,
        2096
      ],
      "parameters": {
        "pageId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $input.first().json['Notion Page ID'] }}"
        },
        "options": {},
        "resource": "databasePage",
        "operation": "update",
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "Status|select",
              "selectValue": "Done"
            },
            {
              "key": "Processed At|date"
            }
          ]
        }
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "502354e9-8ce0-45c7-ba18-bdcefb217dc4",
      "name": "Back to URL Loop",
      "type": "n8n-nodes-base.noOp",
      "position": [
        3280,
        2096
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "340edf6a-8362-41f6-94eb-b5407ebf24fc",
      "name": "LinkedIn Search",
      "type": "@periodix/n8n-nodes-actions.linkedInSearch",
      "position": [
        2384,
        2384
      ],
      "parameters": {
        "limit": 2500,
        "options": {},
        "profileId": "olga",
        "searchUrl": "={{ $('Loop Over Search URLs').item.json.sales_nav_url }}"
      },
      "credentials": {
        "periodixActionsApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "b074e337-413b-4795-9816-1fb45efdbc2f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        736,
        2064
      ],
      "parameters": {
        "width": 660,
        "height": 588,
        "content": "## LinkedIn Outreach: ICP Scoring + AI Messages\n\n**Who it's for:** SDRs, founders, and growth teams running targeted LinkedIn outreach from Sales Navigator lists.\n\n**What it does:** Automatically pulls Sales Nav search URLs from Notion, scrapes LinkedIn profiles, scores them against your ICP using AI, generates personalized connection notes and first messages for validated leads, and logs everything to Google Sheets.\n\n**How it works:**\n1. Scheduled trigger picks up pending campaigns from Notion\n2. Runs LinkedIn/Sales Nav searches via the Periodix LinkedIn Search verified community node\n3. AI (Claude) scores each profile against your ICP criteria (1-10)\n4. Profiles scoring 5+ get a personalized connection note + first message\n5. All results (validated + rejected) are logged to Google Sheets\n6. Notion campaign status is updated to Done\n\n**Setup:**\n1. Add your Notion database with columns: \n`Sales Nav URL`, `Status` (select: Pending/Done), `Campaign`, `Processed At`\n2. Set up a Google Sheet with two tabs: `\nValidated` (columns: First Name, Last Name, Title, Company, Location, Industry, LinkedIn URL, Score, Reason, Connection Note, M1 Message, Campaign, Date, Notion Page ID) and `Rejected` (same columns, Connection Note and M1 Message will be empty)\n3. Add your Anthropic API key to both HTTP Request nodes\n4. Connect your Periodix, Notion, and Google Sheets credentials\n5. Customize the scoring and messaging prompts for your product"
      },
      "typeVersion": 1
    },
    {
      "id": "14a82707-f7cb-43bb-a95c-a0d5925899b1",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1424,
        2256
      ],
      "parameters": {
        "color": 2,
        "width": 420,
        "height": 276,
        "content": "### 1. Trigger & Data Source\nPulls pending campaign URLs from Notion every hour"
      },
      "typeVersion": 1
    },
    {
      "id": "645eeacd-87e2-40e4-a9a1-bb429458296f",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1872,
        2256
      ],
      "parameters": {
        "color": 2,
        "width": 832,
        "height": 276,
        "content": "### 2. LinkedIn Search & Scrape\nExtracts Sales Nav URLs, runs searches via Periodix node, sanitizes profile data"
      },
      "typeVersion": 1
    },
    {
      "id": "efd5b54a-9a1c-491d-9db6-5d304a38dbd6",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2752,
        2288
      ],
      "parameters": {
        "color": 2,
        "width": 680,
        "height": 332,
        "content": "### 3. AI ICP Scoring\nEach profile is scored 1-10 by Claude against your ICP criteria. Score threshold: 5+"
      },
      "typeVersion": 1
    },
    {
      "id": "8afe2daf-8c7e-4343-9798-783ca9b52e64",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3472,
        2096
      ],
      "parameters": {
        "color": 2,
        "width": 1032,
        "height": 564,
        "content": "### 4. Message Generation & Output\nQualified leads (score 5+) get AI-generated connection note + M1 message.\nAll results are saved to Google Sheets (Validated / Rejected tabs)."
      },
      "typeVersion": 1
    },
    {
      "id": "9f8d83d7-bb97-4a1f-ab3f-70ad3d44d573",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2992,
        2000
      ],
      "parameters": {
        "color": 2,
        "width": 412,
        "height": 248,
        "content": "### 5. Status Update\nMarks Notion campaign as Done after all profiles are processed"
      },
      "typeVersion": 1
    },
    {
      "id": "c87eabc9-ccdc-4f3f-8ea7-4fcd3d3937a9",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3120,
        2704
      ],
      "parameters": {
        "color": 6,
        "width": 228,
        "height": 120,
        "content": "\u26a0\ufe0f **Replace YOUR_API_KEY_HERE** with your Anthropic API key in both Claude HTTP Request nodes"
      },
      "typeVersion": 1
    },
    {
      "id": "5f393df0-44e0-4186-9a93-1955c08a79a0",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3392,
        2704
      ],
      "parameters": {
        "color": 6,
        "width": 420,
        "height": 120,
        "content": "\u26a0\ufe0f **Customize the prompts** in both Claude nodes with your product details, ICP criteria, and outreach style"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "connections": {
    "Score \u2265 5?": {
      "main": [
        [
          {
            "node": "Delay before M1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Delay Rejected",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Delay Rejected": {
      "main": [
        [
          {
            "node": "Sheets \u2013 Append Rejected",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Hourly Trigger": {
      "main": [
        [
          {
            "node": "Notion \u2013 Get Pending Search URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Delay before M1": {
      "main": [
        [
          {
            "node": "Claude \u2013 M1 + Connection Note",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "LinkedIn Search": {
      "main": [
        [
          {
            "node": "Sanitize Profiles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Back to URL Loop": {
      "main": [
        [
          {
            "node": "Loop Over Search URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sanitize Profiles": {
      "main": [
        [
          {
            "node": "Loop Over Profiles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Delay (rate limit)": {
      "main": [
        [
          {
            "node": "Claude \u2013 Scoring Prompt",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Profiles": {
      "main": [
        [
          {
            "node": "Notion \u2013 Mark as Done",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Delay (rate limit)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Search URLs": {
      "main": [
        [],
        [
          {
            "node": "LinkedIn Search",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Sales Nav URLs": {
      "main": [
        [
          {
            "node": "Loop Over Search URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Notion \u2013 Mark as Done": {
      "main": [
        [
          {
            "node": "Back to URL Loop",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude \u2013 Scoring Prompt": {
      "main": [
        [
          {
            "node": "Score \u2265 5?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sheets \u2013 Append Rejected": {
      "main": [
        [
          {
            "node": "Back to Profile Loop (Rejected)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sheets \u2013 Append Validated": {
      "main": [
        [
          {
            "node": "Back to Profile Loop (Validated)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Back to Profile Loop (Rejected)": {
      "main": [
        [
          {
            "node": "Loop Over Profiles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude \u2013 M1 + Connection Note": {
      "main": [
        [
          {
            "node": "Sheets \u2013 Append Validated",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Back to Profile Loop (Validated)": {
      "main": [
        [
          {
            "node": "Loop Over Profiles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Notion \u2013 Get Pending Search URLs": {
      "main": [
        [
          {
            "node": "Extract Sales Nav URLs",
            "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 LinkedIn lead generation from Sales Navigator search to personalized outreach. The Periodix node finds prospects, Claude AI scores each one against your ICP, writes personalized connection requests and follow-up messages for qualified leads, and logs results to Google…

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

More Data & Sheets workflows → · Browse all categories →

Related workflows

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

Data & Sheets

This workflow automates the daily reporting of Google Ads campaign performance. It pulls click and conversion data from the Google Ads API, merges both datasets, and stores the results into Notion dat

HTTP Request, Notion, Google Sheets
Data & Sheets

Daily Business Report Generator. Uses googleSheets, httpRequest, slack, gmail. Scheduled trigger; 17 nodes.

Google Sheets, HTTP Request, Slack +3
Data & Sheets

Revenue operations teams, SaaS growth managers, and sales directors who need automated weekly insights from their Stripe payment data. Perfect for small to medium businesses tracking subscription reve

HTTP Request, Google Sheets, Google Gemini Chat +4
Data & Sheets

This workflow automates video distribution to 9 social platforms simultaneously using Blotato's API. It includes both a scheduled publisher (checks Google Sheets for videos marked "Ready") and a subwo

Google Sheets, HTTP Request, Form Trigger +2
Data & Sheets

YogiAI. Uses googleSheets, googleSheetsTool, httpRequest, stopAndError. Scheduled trigger; 61 nodes.

Google Sheets, Google Sheets Tool, HTTP Request +1