{
  "id": "suRqtETAixIFI5QB",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "LinkedIn Profile Enrichment Pipeline",
  "tags": [
    {
      "id": "CbLcgNMJtpnafc16",
      "name": "linkedin",
      "createdAt": "2026-06-05T09:36:54.007Z",
      "updatedAt": "2026-06-05T09:36:54.007Z"
    },
    {
      "id": "abLqlZtT3ezn4ZfS",
      "name": "enrichment",
      "createdAt": "2026-06-05T09:36:54.085Z",
      "updatedAt": "2026-06-05T09:36:54.085Z"
    },
    {
      "id": "hgpxhG98rsxpEmiU",
      "name": "leads",
      "createdAt": "2026-06-05T09:36:54.051Z",
      "updatedAt": "2026-06-05T09:36:54.051Z"
    },
    {
      "id": "q2zfa6svbBeeEAek",
      "name": "sales",
      "createdAt": "2026-06-10T06:29:12.577Z",
      "updatedAt": "2026-06-10T06:29:12.577Z"
    },
    {
      "id": "hzD1FMH6jZ1ATtJz",
      "name": "phantombuster",
      "createdAt": "2026-06-10T06:29:12.612Z",
      "updatedAt": "2026-06-10T06:29:12.612Z"
    }
  ],
  "nodes": [
    {
      "id": "e98fd53c-d38f-425a-837b-d8e51991cb45",
      "name": "\ud83d\udccc Workflow Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2016,
        720
      ],
      "parameters": {
        "color": 4,
        "width": 476,
        "height": 540,
        "content": "# \ud83d\ude80 LinkedIn Profile Enrichment Pipeline\n\n**What this workflow does:**\n1. Reads LinkedIn profile URLs from a Google Sheet\n2. Scrapes full profile data via PhantomBuster\n3. Enriches company data via a second PhantomBuster agent\n4. Discovers work email via Hunter.io \u2192 falls back to Dropcontact\n5. Writes all enriched data back to the same Google Sheet\n\n---\n**\u26a1 Quick Setup (5 steps):**\n1. Set up your Google Sheets credential\n2. Set up your PhantomBuster credential\n3. Set up your Hunter.io credential\n4. Set up your Dropcontact credential\n5. Fill in the **\u2699\ufe0f Pipeline Configuration** node with your IDs\n\n**\ud83d\udccb Sheet Requirements:**\n- Sheet tab named exactly: `Leads`\n- Column A must be named: `linkedin_url`\n- See Setup Guide sticky note for full column list"
      },
      "typeVersion": 1
    },
    {
      "id": "34382a75-f510-438a-a2ad-e336a4d04a1c",
      "name": "\ud83d\udccc Section 1: Triggers",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1456,
        496
      ],
      "parameters": {
        "color": 5,
        "width": 436,
        "height": 248,
        "content": "## \u2699\ufe0f SECTION 1: TRIGGERS\n\n**Schedule Trigger:** Runs automatically every day at 8:00 AM.\nActivate this when you're ready to go to production.\n\n**Manual Trigger:** Click 'Execute Workflow' to run immediately.\nUse this for testing and one-off runs.\n\n> \ud83d\udca1 Only ONE trigger should be active at a time.\n> Disable the Schedule Trigger while testing."
      },
      "typeVersion": 1
    },
    {
      "id": "7f15fb95-dd80-4ba5-94a7-5349d411b847",
      "name": "\ud83d\udccc Section 2: Configuration",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -992,
        464
      ],
      "parameters": {
        "color": 6,
        "width": 600,
        "height": 372,
        "content": "## \u2699\ufe0f SECTION 2: CONFIGURATION\n\n**Fill in the node to the right with your values:**\n\n|              Field             |        |                       What to put                      |\n|:------------------------------:|--------|:------------------------------------------------------:|\n| GOOGLE_SHEET_ID                |        | The ID from your Google Sheet URL                      |\n| PHANTOMBUSTER_PROFILE_AGENT_ID |        | Your PhantomBuster 'LinkedIn Profile Scraper' agent ID |\n| PHANTOMBUSTER_COMPANY_AGENT_ID |        | Your PhantomBuster 'LinkedIn Company Scraper' agent ID |\n| LINKEDIN_SESSION_COOKIE        |        | Your li_at cookie from LinkedIn                        |\n| LINKEDIN_IDENTITY_ID           |        | Your PhantomBuster identity ID                         |\n| USER_AGENT                     |        | Your browser's user agent string                       |\n| SLACK_WEBHOOK_URL              |        | Your Slack incoming webhook URL (optional)             |\n\n> \u26a0\ufe0f **Keep your LinkedIn session cookie private.**\n> Rotate it if you suspect it has been exposed."
      },
      "typeVersion": 1
    },
    {
      "id": "42aafd46-e339-4d4b-96fd-11550811a404",
      "name": "\ud83d\udccc Section 3: Input & Filtering",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -816,
        1072
      ],
      "parameters": {
        "color": 5,
        "width": 520,
        "height": 428,
        "content": "## \ud83d\udccb SECTION 3: INPUT & FILTERING\n\n**Google Sheet tab name:** `Leads`\n\n**Required columns in your sheet:**\n- `linkedin_url` \u2014 input (Column A)\n- `enrichment_status` \u2014 output (leave blank for new leads)\n- `first_name`, `last_name`, `email`, `phone_numer`, `Company name`, `role`, `website`, `email_source`\n\n**Filter logic:**\nOnly processes rows where:\n- `linkedin_url` is NOT empty\n- `enrichment_status` is empty (not yet processed)\n- `first_name` is empty (not yet enriched)\n\n**Batch size:** 5 leads per batch with a 3-second pause between batches.\n\n> \ud83d\udca1 To reprocess a lead, clear Column B (enrichment_status) in the sheet."
      },
      "typeVersion": 1
    },
    {
      "id": "ed6ad884-bbad-4cc4-8b8a-8500235b7587",
      "name": "\ud83d\udccc Section 4: LinkedIn Profile Scraper",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        384,
        448
      ],
      "parameters": {
        "color": 3,
        "width": 520,
        "height": 424,
        "content": "## \ud83d\udc64 SECTION 4: LINKEDIN PROFILE SCRAPER\n\n**PhantomBuster Agent:** LinkedIn Profile Scraper\n\nThis agent visits each LinkedIn profile URL and extracts:\n- First name, last name\n- Current job title\n- Company name + LinkedIn company URL\n- Location, headline\n\n**Wait time: 60 seconds**\nThis gives PhantomBuster enough time to process the job in its queue. Increase to 90s if you experience timeouts on slower plans.\n\n> \ud83d\udca1 You must have the LinkedIn Profile Scraper Phantom set up in your PhantomBuster account.\n> Set the agent to accept a `spreadsheetUrl` argument (the profile URL)."
      },
      "typeVersion": 1
    },
    {
      "id": "f1e2498f-bc40-488c-93f3-98b01928ba5a",
      "name": "\ud83d\udccc Section 5: Company Enrichment Scraper",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1152,
        304
      ],
      "parameters": {
        "color": 3,
        "width": 520,
        "height": 444,
        "content": "## \ud83c\udfe2 SECTION 5:  COMPANY ENRICHMENT SCRAPER\n\n**PhantomBuster Agent:** LinkedIn Company Scraper\n\nUsing the company LinkedIn URL extracted in Section 4, this agent fetches:\n- Company website / domain\n- Employee count\n- Industry\n\n**Wait time: 70 seconds**\nCompany pages may take slightly longer. Increase to 90s if needed.\n\n> \ud83d\udca1 You need a separate 'LinkedIn Company Scraper' Phantom.\n> It accepts a `spreadsheetUrl` argument (the company LinkedIn URL).\n\n> \u26a0\ufe0f If the profile has no linked company, this step will still run but return empty results. That's handled gracefully downstream."
      },
      "typeVersion": 1
    },
    {
      "id": "e2b0c08a-1a67-4c1c-9f2b-949437830586",
      "name": "\ud83d\udccc Section 6: Email Discovery",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1728,
        368
      ],
      "parameters": {
        "color": 3,
        "width": 520,
        "height": 380,
        "content": "## \ud83d\udce7 SECTION 6: EMAIL DISCOVERY\n\n**Provider 1: Hunter.io**\nSearches for a professional email using first name, last name, and company domain.\n\u2705 On success \u2192 writes email immediately\n\u274c On failure \u2192 falls back to Dropcontact\n\n**Provider 2: Dropcontact**\nFull contact enrichment using LinkedIn profile data.\nDropcontact waits internally (configured for 60s).\n\u2705 On success \u2192 writes email\n\u274c On failure \u2192 writes profile data without email (`Email Not Found` status)\n\n> \ud83d\udca1 Hunter.io is faster and cheaper for high-volume.\n> Dropcontact has better European coverage.\n> You can swap providers by reordering the nodes."
      },
      "typeVersion": 1
    },
    {
      "id": "101dd1aa-d6cc-46a6-8359-9d36460d1396",
      "name": "\ud83d\udccc Section 7: Output & Notifications",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3008,
        1232
      ],
      "parameters": {
        "color": 2,
        "width": 520,
        "height": 376,
        "content": "## \ud83d\udcbe SECTION 7: OUTPUT & NOTIFICATIONS\n\n**Two write paths:**\n1. **With email found** \u2192 `enrichment_status = Enriched`\n2. **Without email** \u2192 `enrichment_status = Email Not Found`\n3. **Invalid URL** \u2192 `enrichment_status = Failed`\n\n**Slack Notification:**\nFires after every completed batch with a summary.\nLeave `SLACK_WEBHOOK_URL` empty in Configuration to disable.\n\n**Wait Between Batches:**\n3 seconds between each batch of 5 to respect rate limits.\n\n> \ud83d\udca1 To add more output columns, modify the\n> 'Write Enriched Lead' Google Sheets node\n> and add the column to your sheet header row."
      },
      "typeVersion": 1
    },
    {
      "id": "7dfd29aa-7609-465a-ab92-cd8cb90355ab",
      "name": "\ud83d\udccc Troubleshooting Guide",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1472,
        1200
      ],
      "parameters": {
        "width": 440,
        "height": 456,
        "content": "## \ud83d\udd27 TROUBLESHOOTING\n\n**PhantomBuster returns empty output:**\n- Increase Wait node from 60s to 90s\n- Check your LinkedIn session cookie is still valid\n- Verify the agent is active and not paused in PhantomBuster\n\n**Hunter returns no email:**\n- Ensure the company domain was correctly extracted\n- The lead's email may not be in Hunter's database\n\n**Google Sheets fails to update:**\n- Confirm sheet tab is named exactly `Leads`\n- Ensure `row_number` header exists\n- Confirm your Google Sheets credential has edit access\n\n**Workflow runs but no leads processed:**\n- Check column A has valid linkedin.com/in/ URLs\n- Confirm `enrichment_status` column is empty for target rows"
      },
      "typeVersion": 1
    },
    {
      "id": "27fe1e91-b186-4228-b92b-dc5c2dde7c67",
      "name": "\u25b6\ufe0f Manual Trigger",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1232,
        800
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "3acb44b9-8547-47a4-87f3-8103d72eb0ff",
      "name": "\u23f0 Schedule Trigger (Daily 8AM)",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -1216,
        1024
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 8 * * *"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "52a84938-b0b5-486b-86ab-121eb7cd09e9",
      "name": "\u2699\ufe0f Pipeline Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        -1008,
        880
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "cfg-sheet-id",
              "name": "GOOGLE_SHEET_ID",
              "type": "string",
              "value": "REPLACE_WITH_YOUR_GOOGLE_SHEET_ID"
            },
            {
              "id": "cfg-pb-profile",
              "name": "PHANTOMBUSTER_PROFILE_AGENT_ID",
              "type": "string",
              "value": "REPLACE_WITH_YOUR_PROFILE_SCRAPER_AGENT_ID"
            },
            {
              "id": "cfg-pb-company",
              "name": "PHANTOMBUSTER_COMPANY_AGENT_ID",
              "type": "string",
              "value": "REPLACE_WITH_YOUR_COMPANY_SCRAPER_AGENT_ID"
            },
            {
              "id": "cfg-li-cookie",
              "name": "LINKEDIN_SESSION_COOKIE",
              "type": "string",
              "value": "REPLACE_WITH_YOUR_LINKEDIN_LI_AT_COOKIE"
            },
            {
              "id": "cfg-li-identity",
              "name": "LINKEDIN_IDENTITY_ID",
              "type": "string",
              "value": "REPLACE_WITH_YOUR_PHANTOMBUSTER_IDENTITY_ID"
            },
            {
              "id": "cfg-user-agent",
              "name": "USER_AGENT",
              "type": "string",
              "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
            },
            {
              "id": "cfg-slack",
              "name": "SLACK_WEBHOOK_URL",
              "type": "string",
              "value": "REPLACE_WITH_YOUR_SLACK_WEBHOOK_URL_OR_LEAVE_EMPTY"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "569cb5c1-cdc3-4fde-b6a3-75080c0e3c10",
      "name": "\ud83d\udccb Read Leads from Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -816,
        880
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Leads"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('\u2699\ufe0f Pipeline Configuration').item.json.GOOGLE_SHEET_ID }}"
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "e6a10241-00b4-45c2-bd0b-f2165927dcbb",
      "name": "\ud83d\udd0d Filter Unprocessed Leads",
      "type": "n8n-nodes-base.code",
      "position": [
        -592,
        880
      ],
      "parameters": {
        "jsCode": "try {\n  const items = $input.all();\n\n  /** @type {any[]} */\n  const filtered = [];\n\n  items.forEach((item, index) => {\n    const row = item.json;\n    const linkedinUrl    = (row.linkedin_url       || '').toString().trim();\n    const enrichStatus   = (row.enrichment_status  || '').toString().trim();\n    const firstName      = (row.first_name         || '').toString().trim();\n\n    // Only process rows that:\n    // 1. Have a LinkedIn URL\n    // 2. Have NOT already been enriched\n    // 3. Have NOT already been filled with a first_name\n    if (linkedinUrl !== '' && enrichStatus === '' && firstName === '') {\n      filtered.push({\n        json: {\n          ...row,\n          row_number: index + 2,   // +2 accounts for the header row\n          linkedin_url: linkedinUrl\n        }\n      });\n    }\n  });\n\n  if (filtered.length === 0) {\n    // Return a sentinel item so downstream nodes don't error on empty input\n    return [{ json: { message: 'No unprocessed leads found.', total_leads: 0 } }];\n  }\n\n  return filtered;\n\n} catch (e) {\n  throw new Error('Filter Unprocessed Leads failed: ' + e.message);\n}"
      },
      "typeVersion": 2
    },
    {
      "id": "73097b95-702c-4348-b930-35e548f49fc1",
      "name": "\u26a1 Process in Batches (5 at a time)",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -320,
        880
      ],
      "parameters": {
        "options": {},
        "batchSize": 5
      },
      "typeVersion": 3
    },
    {
      "id": "ec11d526-b860-483a-8722-2b31f860a0ec",
      "name": "\ud83d\udd14 Notify Slack on Batch Complete",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -80,
        752
      ],
      "parameters": {
        "url": "={{ $('\u2699\ufe0f Pipeline Configuration').item.json.SLACK_WEBHOOK_URL }}",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ JSON.stringify({\n  text: '\u2705 *LinkedIn Enrichment Batch Complete*\\n\\n' +\n        '\ud83d\udcca Processed: ' + $input.all().length + ' leads\\n' +\n        '\u2709\ufe0f With email: ' + $input.all().filter(i => i.json.enrichment_status === 'Enriched').length + '\\n' +\n        '\u26a0\ufe0f No email found: ' + $input.all().filter(i => i.json.enrichment_status === 'Email Not Found').length + '\\n' +\n        '\u274c Failed: ' + $input.all().filter(i => i.json.enrichment_status === 'Failed').length + '\\n' +\n        '\ud83d\udd50 ' + new Date().toISOString(),\n  channel: '#lead-enrichment-alerts'\n}) }}",
        "sendBody": true,
        "specifyBody": "json"
      },
      "typeVersion": 4.2
    },
    {
      "id": "6098b424-9dc2-411d-a882-f835fad47fa9",
      "name": "\u2705 Validate LinkedIn URL Format",
      "type": "n8n-nodes-base.code",
      "position": [
        -80,
        1024
      ],
      "parameters": {
        "jsCode": "try {\n  const allItems = $input.all();\n  const results  = [];\n\n  // Accepts standard LinkedIn /in/ profile URLs\n  // Strips query strings and trailing slashes for cleanliness\n  const linkedinRegex = /^https?:\\/\\/(www\\.)?linkedin\\.com\\/in\\/[a-zA-Z0-9._%-]+\\/?(\\?.*)?$/i;\n\n  for (const item of allItems) {\n    const data = item.json;\n    const url  = (data.linkedin_url || '').toString().trim();\n    const isValid = linkedinRegex.test(url);\n\n    let cleanUrl = null;\n    let username = null;\n\n    if (isValid) {\n      // Normalise: strip query params and trailing slash\n      cleanUrl = url.split('?')[0].split('#')[0].replace(/\\/$/, '');\n      const match = cleanUrl.match(/linkedin\\.com\\/in\\/([a-zA-Z0-9._%-]+)/i);\n      username = match ? match[1] : null;\n    }\n\n    results.push({\n      json: {\n        ...data,\n        linkedin_url:      cleanUrl || url,\n        linkedin_username: username,\n        url_valid:         isValid,\n        validation_error:  isValid ? null : 'Invalid LinkedIn URL: ' + url\n      }\n    });\n  }\n\n  return results;\n\n} catch (e) {\n  return [{ json: { url_valid: false, validation_error: e.message } }];\n}"
      },
      "typeVersion": 2
    },
    {
      "id": "d3d3e9ff-3570-4498-96be-652499be96ce",
      "name": "\ud83d\udd00 Route: Valid URL?",
      "type": "n8n-nodes-base.if",
      "position": [
        112,
        1024
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "url-valid-check",
              "operator": {
                "type": "boolean",
                "operation": "true"
              },
              "leftValue": "={{ $json.url_valid }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "c7baff58-2de5-4108-b43d-b1016a3df918",
      "name": "\u26a0\ufe0f Mark: Invalid URL",
      "type": "n8n-nodes-base.set",
      "position": [
        400,
        1152
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "b1",
              "name": "enrichment_status",
              "type": "string",
              "value": "Failed"
            },
            {
              "id": "b2",
              "name": "error_message",
              "type": "string",
              "value": "={{ $json.validation_error || 'Invalid LinkedIn URL format' }}"
            },
            {
              "id": "b3",
              "name": "processed_at",
              "type": "string",
              "value": "={{ new Date().toISOString() }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.3
    },
    {
      "id": "4ae0be36-0482-41a4-be7d-3e085e3fd576",
      "name": "\ud83d\udcbe Update: Invalid URL Status",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        592,
        1152
      ],
      "parameters": {
        "columns": {
          "value": {
            "row_number": "={{ $json.row_number }}",
            "enrichment_status": "={{ $json.enrichment_status }}"
          },
          "schema": [
            {
              "id": "linkedin_url",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "linkedin_url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "enrichment_status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "enrichment_status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "first_name",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "first_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "row_number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Leads"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('\u2699\ufe0f Pipeline Configuration').item.json.GOOGLE_SHEET_ID }}"
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "44f15c82-f260-457c-a6c1-c13d9243e109",
      "name": "\ud83d\ude80 Launch: LinkedIn Profile Scraper",
      "type": "n8n-nodes-base.phantombuster",
      "position": [
        400,
        912
      ],
      "parameters": {
        "agentId": "={{ $('\u2699\ufe0f Pipeline Configuration').item.json.PHANTOMBUSTER_PROFILE_AGENT_ID }}",
        "additionalFields": {
          "argumentsUi": {
            "argumentValues": [
              {
                "key": "spreadsheetUrl",
                "value": "={{ $json.linkedin_url }}"
              },
              {
                "key": "identityId",
                "value": "={{ $('\u2699\ufe0f Pipeline Configuration').item.json.LINKEDIN_IDENTITY_ID }}"
              },
              {
                "key": "sessionCookie",
                "value": "={{ $('\u2699\ufe0f Pipeline Configuration').item.json.LINKEDIN_SESSION_COOKIE }}"
              },
              {
                "key": "userAgent",
                "value": "={{ $('\u2699\ufe0f Pipeline Configuration').item.json.USER_AGENT }}"
              }
            ]
          }
        }
      },
      "typeVersion": 1
    },
    {
      "id": "21a17cd0-0e37-4339-ba47-91956b732b0c",
      "name": "\u23f3 Wait: Profile Scraper (60s)",
      "type": "n8n-nodes-base.wait",
      "position": [
        592,
        912
      ],
      "parameters": {
        "amount": 60
      },
      "typeVersion": 1.1
    },
    {
      "id": "7cc2706e-d6c9-4401-ac06-0327d9cd4bf1",
      "name": "\ud83d\udce5 Fetch: Profile Scraper Results",
      "type": "n8n-nodes-base.phantombuster",
      "position": [
        800,
        912
      ],
      "parameters": {
        "agentId": "={{ $('\u2699\ufe0f Pipeline Configuration').item.json.PHANTOMBUSTER_PROFILE_AGENT_ID }}",
        "operation": "getOutput",
        "additionalFields": {}
      },
      "typeVersion": 1
    },
    {
      "id": "7565bb3d-6ae4-4621-8042-093c4eea2c23",
      "name": "\ud83d\udd00 Route: Profile Data Found?",
      "type": "n8n-nodes-base.if",
      "position": [
        976,
        912
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "has-first-name",
              "operator": {
                "type": "string",
                "operation": "notEmpty"
              },
              "leftValue": "={{ $json.firstName }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "8489cf4a-e107-4517-8d09-a1103b59b6c6",
      "name": "\u26a0\ufe0f Mark: No Profile Data",
      "type": "n8n-nodes-base.set",
      "position": [
        1216,
        1024
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "c1",
              "name": "enrichment_status",
              "type": "string",
              "value": "Failed"
            },
            {
              "id": "c2",
              "name": "error_message",
              "type": "string",
              "value": "No profile data returned from PhantomBuster. Check your LinkedIn session cookie and agent configuration."
            },
            {
              "id": "c3",
              "name": "processed_at",
              "type": "string",
              "value": "={{ new Date().toISOString() }}"
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "51932ba4-8530-4163-b60d-2b9b2c6c30e1",
      "name": "\ud83d\udcbe Update: No Profile Status",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1424,
        1024
      ],
      "parameters": {
        "columns": {
          "value": {
            "row_number": "={{ $('\u26a1 Process in Batches (5 at a time)').item.json.row_number }}",
            "enrichment_status": "={{ $json.enrichment_status }}"
          },
          "schema": [
            {
              "id": "enrichment_status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "enrichment_status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "row_number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Leads"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('\u2699\ufe0f Pipeline Configuration').item.json.GOOGLE_SHEET_ID }}"
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "cbde98c5-f6b4-4c43-93d1-32f25b03e019",
      "name": "\ud83d\ude80 Launch: Company Enrichment Scraper",
      "type": "n8n-nodes-base.phantombuster",
      "position": [
        1216,
        784
      ],
      "parameters": {
        "agentId": "={{ $('\u2699\ufe0f Pipeline Configuration').item.json.PHANTOMBUSTER_COMPANY_AGENT_ID }}",
        "additionalFields": {
          "argumentsUi": {
            "argumentValues": [
              {
                "key": "spreadsheetUrl",
                "value": "={{ $json.linkedinCompanyUrl }}"
              },
              {
                "key": "identityId",
                "value": "={{ $('\u2699\ufe0f Pipeline Configuration').item.json.LINKEDIN_IDENTITY_ID }}"
              },
              {
                "key": "sessionCookie",
                "value": "={{ $('\u2699\ufe0f Pipeline Configuration').item.json.LINKEDIN_SESSION_COOKIE }}"
              },
              {
                "key": "userAgent",
                "value": "={{ $('\u2699\ufe0f Pipeline Configuration').item.json.USER_AGENT }}"
              }
            ]
          }
        }
      },
      "typeVersion": 1
    },
    {
      "id": "144a5669-7c21-46c5-950d-a303d163c86f",
      "name": "\u23f3 Wait: Company Scraper (70s)",
      "type": "n8n-nodes-base.wait",
      "position": [
        1392,
        784
      ],
      "parameters": {
        "amount": 70
      },
      "typeVersion": 1.1
    },
    {
      "id": "53096a72-4324-457c-9d86-05629ede87c0",
      "name": "\ud83d\udce5 Fetch: Company Scraper Results",
      "type": "n8n-nodes-base.phantombuster",
      "position": [
        1568,
        784
      ],
      "parameters": {
        "agentId": "={{ $('\u2699\ufe0f Pipeline Configuration').item.json.PHANTOMBUSTER_COMPANY_AGENT_ID }}",
        "operation": "getOutput",
        "additionalFields": {}
      },
      "typeVersion": 1
    },
    {
      "id": "96dfbb30-87fd-400b-adb2-b7132882ed76",
      "name": "\ud83d\udd0d Find Email: Hunter.io",
      "type": "n8n-nodes-base.hunter",
      "position": [
        1760,
        784
      ],
      "parameters": {
        "domain": "={{ $json.domain || $('\ud83d\udce5 Fetch: Company Scraper Results').item.json.domain || '' }}",
        "lastname": "={{ $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.lastName }}",
        "firstname": "={{ $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.firstName }}",
        "operation": "emailFinder"
      },
      "typeVersion": 1
    },
    {
      "id": "01ff830e-ff7b-42f9-9b8d-79b85dfa5619",
      "name": "\ud83d\udd00 Route: Hunter Email Found?",
      "type": "n8n-nodes-base.if",
      "position": [
        1920,
        784
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "hunter-email",
              "operator": {
                "type": "string",
                "operation": "notEmpty"
              },
              "leftValue": "={{ $json.email }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "8f13f9c3-53ad-4f53-8e74-913b50519c7d",
      "name": "\ud83d\udce7 Set: Hunter Email Data",
      "type": "n8n-nodes-base.set",
      "position": [
        2496,
        656
      ],
      "parameters": {
        "options": {
          "includeBinary": false
        },
        "assignments": {
          "assignments": [
            {
              "id": "h1",
              "name": "work_email",
              "type": "string",
              "value": "={{ $json.email || $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.professionalEmail || '' }}"
            },
            {
              "id": "h3",
              "name": "email_source",
              "type": "string",
              "value": "hunter"
            },
            {
              "id": "h4",
              "name": "phone_number",
              "type": "string",
              "value": "={{ $json.phone_number || $('\ud83d\udce5 Fetch: Company Scraper Results').item.json.phone || '' }}"
            },
            {
              "id": "h5",
              "name": "company_website",
              "type": "string",
              "value": "={{ $('\ud83d\udce5 Fetch: Company Scraper Results').item.json.website || $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.companyWebsite || '' }}"
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "49d1e66d-82b8-4ede-8596-6ee1c1baf7e6",
      "name": "\ud83d\udd0d Enrich Contact: Dropcontact",
      "type": "n8n-nodes-base.dropcontact",
      "position": [
        2160,
        864
      ],
      "parameters": {
        "email": "={{ $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.professionalEmail || $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.firstName || '' }}{{ $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.lastName || '' }}@{{ $('\ud83d\udce5 Fetch: Company Scraper Results').item.json.domain || '' }}",
        "options": {
          "waitTime": 60
        },
        "additionalFields": {
          "company": "={{ $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.companyName || '' }}",
          "country": "={{ $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.location || '' }}",
          "website": "={{ $('\ud83d\udce5 Fetch: Company Scraper Results').item.json.website || '' }}",
          "linkedin": "={{ $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.linkedinProfileUrl }}",
          "full_name": "={{ $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.scraperFullName || '' }}",
          "last_name": "={{ $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.lastName || '' }}",
          "first_name": "={{ $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.firstName || '' }}"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8c41223e-26bb-4e81-a306-71730a5ee22e",
      "name": "\u23f3 Wait: Dropcontact Response",
      "type": "n8n-nodes-base.wait",
      "position": [
        2336,
        864
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "e9df6bc7-004c-44d8-819e-eb471a4b0e7d",
      "name": "\ud83d\udd00 Route: Dropcontact Email Found?",
      "type": "n8n-nodes-base.if",
      "position": [
        2528,
        864
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "dc-email",
              "operator": {
                "type": "string",
                "operation": "notEmpty"
              },
              "leftValue": "={{ $json.email[0].email }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "c4a8f6dc-1f54-4b0e-bb8d-0aa234ab15eb",
      "name": "\ud83d\udce7 Set: Dropcontact Email Data",
      "type": "n8n-nodes-base.set",
      "position": [
        2800,
        784
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d1",
              "name": "work_email",
              "type": "string",
              "value": "={{ $json.email[0].email || $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.professionalEmail || '' }}"
            },
            {
              "id": "d3",
              "name": "email_source",
              "type": "string",
              "value": "dropcontact"
            },
            {
              "id": "d4",
              "name": "phone_number",
              "type": "string",
              "value": "={{ $json.phone || $('\ud83d\udce5 Fetch: Company Scraper Results').item.json.phone || '' }}"
            },
            {
              "id": "d5",
              "name": "company_website",
              "type": "string",
              "value": "={{ $json.website || $('\ud83d\udce5 Fetch: Company Scraper Results').item.json.website || $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.companyWebsite || '' }}"
            }
          ]
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "8b3ed9ce-0168-400d-9425-d8d82510e5c7",
      "name": "\ud83d\udccb Compile: Profile Without Email",
      "type": "n8n-nodes-base.set",
      "position": [
        2816,
        960
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "ef1",
              "name": "first_name",
              "type": "string",
              "value": "={{ $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.firstName || '' }}"
            },
            {
              "id": "ef2",
              "name": "last_name",
              "type": "string",
              "value": "={{ $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.lastName || '' }}"
            },
            {
              "id": "ef3",
              "name": "company_name",
              "type": "string",
              "value": "={{ $('\ud83d\udce5 Fetch: Company Scraper Results').first().json.companyName || $('\ud83d\udce5 Fetch: Profile Scraper Results').first().json.linkedinCompanySlug || '' }}"
            },
            {
              "id": "ef4",
              "name": "phone",
              "type": "string",
              "value": "={{ $json.phone_number || $('\ud83d\udce5 Fetch: Company Scraper Results').item.json.phone || '' }}"
            },
            {
              "id": "ef5",
              "name": "website",
              "type": "string",
              "value": "={{ $('\ud83d\udce5 Fetch: Company Scraper Results').item.json.website || $('\ud83d\udce5 Fetch: Profile Scraper Results').item.json.companyWebsite || '' }}"
            },
            {
              "id": "ef6",
              "name": "role",
              "type": "string",
              "value": "={{ $('\ud83d\udce5 Fetch: Profile Scraper Results').first().json.linkedinJobTitle || '' }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "d4caecf3-47c6-4a2f-8459-8ae388924f92",
      "name": "\ud83d\udd17 Compile Final Lead Record",
      "type": "n8n-nodes-base.code",
      "position": [
        3088,
        720
      ],
      "parameters": {
        "jsCode": "const item = $input.first().json;\n\nreturn [{\n  json: {\n    ...item,\n    first_name:   $('\ud83d\udce5 Fetch: Profile Scraper Results').first().json.firstName  || '',\n    last_name:    $('\ud83d\udce5 Fetch: Profile Scraper Results').first().json.lastName   || '',\n    company_name: $('\ud83d\udce5 Fetch: Company Scraper Results').first().json.companyName ||\n                  $('\ud83d\udce5 Fetch: Profile Scraper Results').first().json.linkedinCompanySlug || '',\n    role:         $('\ud83d\udce5 Fetch: Profile Scraper Results').first().json.linkedinJobTitle || ''\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "a642b26b-57fa-4669-b801-f2c02413e51c",
      "name": "\u2705 Write: Enriched Lead (With Email)",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3296,
        720
      ],
      "parameters": {
        "columns": {
          "value": {
            "role": "={{ $json.role || '' }}",
            "email": "={{ $json.work_email || '' }}",
            "website": "={{ $json.company_website || '' }}",
            "last_name": "={{ $json.last_name || '' }}",
            "first_name": "={{ $json.first_name || '' }}",
            "row_number": "={{ $('\u26a1 Process in Batches (5 at a time)').item.json.row_number }}",
            "phone_numer": "={{ $json.phone_number || '' }}",
            "Company name": "={{ $json.company_name || '' }}",
            "email_source": "={{ $json.email_source || '' }}",
            "enrichment_status": "Enriched"
          },
          "schema": [
            {
              "id": "linkedin_url",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "linkedin_url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "enrichment_status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "enrichment_status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "first_name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "first_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "last_name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "last_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "email",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "phone_numer",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "phone_numer",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Company name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "role",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "role",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "website",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "website",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "email_source",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "email_source",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "row_number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Leads"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('\u2699\ufe0f Pipeline Configuration').item.json.GOOGLE_SHEET_ID }}"
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "87c5aa77-6f45-43b1-b645-4a3ee00bce47",
      "name": "\ud83d\udccb Write: Enriched Lead (No Email)",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3104,
        960
      ],
      "parameters": {
        "columns": {
          "value": {
            "role": "={{ $json.role || '' }}",
            "website": "={{ $json.website || '' }}",
            "last_name": "={{ $json.last_name || '' }}",
            "first_name": "={{ $json.first_name || '' }}",
            "row_number": "={{ $('\u26a1 Process in Batches (5 at a time)').item.json.row_number }}",
            "phone_numer": "={{ $json.phone || '' }}",
            "Company name": "={{ $json.company_name || '' }}",
            "enrichment_status": "Email Not Found"
          },
          "schema": [
            {
              "id": "linkedin_url",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "linkedin_url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "enrichment_status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "enrichment_status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "first_name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "first_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "last_name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "last_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "phone_numer",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "phone_numer",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Company name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "role",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "role",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "website",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "website",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "row_number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Leads"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('\u2699\ufe0f Pipeline Configuration').item.json.GOOGLE_SHEET_ID }}"
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "a9ddafda-d734-415e-9ffa-78784fa7bfd3",
      "name": "\u23f3 Wait Between Batches (3s)",
      "type": "n8n-nodes-base.wait",
      "position": [
        3552,
        1024
      ],
      "parameters": {
        "amount": 3
      },
      "typeVersion": 1.1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "9e8a5357-ad28-47ed-b179-bd1f0bcfd22a",
  "connections": {
    "\u25b6\ufe0f Manual Trigger": {
      "main": [
        [
          {
            "node": "\u2699\ufe0f Pipeline Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd00 Route: Valid URL?": {
      "main": [
        [
          {
            "node": "\ud83d\ude80 Launch: LinkedIn Profile Scraper",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "\u26a0\ufe0f Mark: Invalid URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u26a0\ufe0f Mark: Invalid URL": {
      "main": [
        [
          {
            "node": "\ud83d\udcbe Update: Invalid URL Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd0d Find Email: Hunter.io": {
      "main": [
        [
          {
            "node": "\ud83d\udd00 Route: Hunter Email Found?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udce7 Set: Hunter Email Data": {
      "main": [
        [
          {
            "node": "\ud83d\udd17 Compile Final Lead Record",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u26a0\ufe0f Mark: No Profile Data": {
      "main": [
        [
          {
            "node": "\ud83d\udcbe Update: No Profile Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u23f3 Wait Between Batches (3s)": {
      "main": [
        [
          {
            "node": "\u26a1 Process in Batches (5 at a time)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u2699\ufe0f Pipeline Configuration": {
      "main": [
        [
          {
            "node": "\ud83d\udccb Read Leads from Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd0d Filter Unprocessed Leads": {
      "main": [
        [
          {
            "node": "\u26a1 Process in Batches (5 at a time)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u23f3 Wait: Dropcontact Response": {
      "main": [
        [
          {
            "node": "\ud83d\udd00 Route: Dropcontact Email Found?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udcbe Update: No Profile Status": {
      "main": [
        [
          {
            "node": "\u23f3 Wait Between Batches (3s)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd17 Compile Final Lead Record": {
      "main": [
        [
          {
            "node": "\u2705 Write: Enriched Lead (With Email)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u23f3 Wait: Company Scraper (70s)": {
      "main": [
        [
          {
            "node": "\ud83d\udce5 Fetch: Company Scraper Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u23f3 Wait: Profile Scraper (60s)": {
      "main": [
        [
          {
            "node": "\ud83d\udce5 Fetch: Profile Scraper Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udcbe Update: Invalid URL Status": {
      "main": [
        [
          {
            "node": "\u23f3 Wait Between Batches (3s)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd00 Route: Hunter Email Found?": {
      "main": [
        [
          {
            "node": "\ud83d\udce7 Set: Hunter Email Data",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "\ud83d\udd0d Enrich Contact: Dropcontact",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd00 Route: Profile Data Found?": {
      "main": [
        [
          {
            "node": "\ud83d\ude80 Launch: Company Enrichment Scraper",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "\u26a0\ufe0f Mark: No Profile Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u23f0 Schedule Trigger (Daily 8AM)": {
      "main": [
        [
          {
            "node": "\u2699\ufe0f Pipeline Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u2705 Validate LinkedIn URL Format": {
      "main": [
        [
          {
            "node": "\ud83d\udd00 Route: Valid URL?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udce7 Set: Dropcontact Email Data": {
      "main": [
        [
          {
            "node": "\ud83d\udd17 Compile Final Lead Record",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd0d Enrich Contact: Dropcontact": {
      "main": [
        [
          {
            "node": "\u23f3 Wait: Dropcontact Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udccb Read Leads from Google Sheets": {
      "main": [
        [
          {
            "node": "\ud83d\udd0d Filter Unprocessed Leads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udccb Compile: Profile Without Email": {
      "main": [
        [
          {
            "node": "\ud83d\udccb Write: Enriched Lead (No Email)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udce5 Fetch: Company Scraper Results": {
      "main": [
        [
          {
            "node": "\ud83d\udd0d Find Email: Hunter.io",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udce5 Fetch: Profile Scraper Results": {
      "main": [
        [
          {
            "node": "\ud83d\udd00 Route: Profile Data Found?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u26a1 Process in Batches (5 at a time)": {
      "main": [
        [
          {
            "node": "\ud83d\udd14 Notify Slack on Batch Complete",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "\u2705 Validate LinkedIn URL Format",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udccb Write: Enriched Lead (No Email)": {
      "main": [
        [
          {
            "node": "\u23f3 Wait Between Batches (3s)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd00 Route: Dropcontact Email Found?": {
      "main": [
        [
          {
            "node": "\ud83d\udce7 Set: Dropcontact Email Data",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "\ud83d\udccb Compile: Profile Without Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u2705 Write: Enriched Lead (With Email)": {
      "main": [
        [
          {
            "node": "\u23f3 Wait Between Batches (3s)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\ude80 Launch: LinkedIn Profile Scraper": {
      "main": [
        [
          {
            "node": "\u23f3 Wait: Profile Scraper (60s)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\ude80 Launch: Company Enrichment Scraper": {
      "main": [
        [
          {
            "node": "\u23f3 Wait: Company Scraper (70s)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}