{
  "id": "GpCK3vp4ZK1smgHY",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Turn LinkedIn Sales Navigator Lists into Full Contact Profiles",
  "tags": [],
  "nodes": [
    {
      "id": "c23d0bfd-df04-4129-bf54-f77f0c5e7a8c",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -608,
        -144
      ],
      "parameters": {
        "width": 480,
        "height": 816,
        "content": "## Turn LinkedIn Sales Navigator Lists into Full Contact Profiles\n\n### How it works\n\nThis workflow runs on a schedule to process LinkedIn Sales Navigator profile URLs stored in Google Sheets. It fetches pending profiles, loops through them one at a time, enriches each profile with email/contact data via Tomba, formats the result, and writes the completed contact profile back to the sheet.\n\n### Setup steps\n\n- Configure the Schedule Trigger with the desired run frequency.\n- Connect Google Sheets credentials and select the spreadsheet, sheet, and pending-profile filter/range for the input node.\n- Configure the Tomba credentials/API key and ensure the LinkedIn URL field from the sheet is mapped into the lookup node.\n- Verify the formatting code matches the sheet columns, then configure the update node to write enriched contact fields back to the correct row.\n\n### Customization\n\nAdjust the Google Sheets pending criteria, batch size, Tomba lookup fields, or formatting code to match your lead list structure and desired output columns."
      },
      "typeVersion": 1
    },
    {
      "id": "713fa864-8eb1-4f4c-9fbe-717452a6c6b7",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 608,
        "height": 304,
        "content": "## Load pending profiles\n\nStarts on a schedule, reads pending LinkedIn profile rows from Google Sheets, and prepares them for batch processing."
      },
      "typeVersion": 1
    },
    {
      "id": "4e7b91ac-67aa-413c-b3b6-ccaa91072a6b",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        624,
        -144
      ],
      "parameters": {
        "color": 7,
        "width": 656,
        "height": 320,
        "content": "## Enrich and save contacts\n\nFor each profile, looks up contact details from the LinkedIn URL using Tomba, formats the returned data, updates the corresponding Google Sheets row, and then returns control to the loop for the next profile."
      },
      "typeVersion": 1
    },
    {
      "id": "41ebb88b-9628-4e00-922b-fd15de86c945",
      "name": "Every Day Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        0,
        0
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "5e85a501-24cb-4dde-98a1-3910ed885fa3",
      "name": "Read LinkedIn Profiles from Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        208,
        0
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "Pending",
              "lookupColumn": "Status"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1pBVkQk-tq2aidFvJTDXohBVpbFfkkcHhnlyGK5ZF0-g/edit#gid=0",
          "cachedResultName": "linkedin profiles"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1pBVkQk-tq2aidFvJTDXohBVpbFfkkcHhnlyGK5ZF0-g",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1pBVkQk-tq2aidFvJTDXohBVpbFfkkcHhnlyGK5ZF0-g/edit?usp=drivesdk",
          "cachedResultName": "Tomba - LinkedIn Contact Finder"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "311e0eb1-0c84-472e-9561-61b19d1e3694",
      "name": "Batch Process LinkedIn Profiles",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        416,
        0
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "40fa9eb3-8522-4a27-82b4-caf905e8a1ba",
      "name": "Retrieve Email from LinkedIn URL",
      "type": "n8n-nodes-tomba.tomba",
      "position": [
        672,
        16
      ],
      "parameters": {
        "url": "={{ $json['LinkedIn URL'] }}",
        "resource": "finder",
        "operation": "linkedinFinder",
        "enrichMobile": true
      },
      "credentials": {
        "tombaApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "9c3afb56-9c76-4a38-9390-10b015795940",
      "name": "Format LinkedIn Contact Data",
      "type": "n8n-nodes-base.code",
      "position": [
        880,
        16
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\nconst results = [];\n\nfor (const item of items) {\n  const json = item.json;\n\n  // Get all phone numbers if multiple exist\n  const phones = json.phone_data && json.phone_data.length > 0\n    ? json.phone_data.map(p => p.intl_format).join(', ')\n    : \"Not Found\";\n\n  results.push({\n    json: {\n      email: json.email || \"Not Found\",\n      phone: phones,\n      first_name: json.first_name || \"\",\n      last_name: json.last_name || \"\",\n      full_name: json.full_name || \"\",\n      company: json.company || \"\",\n      position: json.position || \"\",\n      linkedin: json.linkedin || \"\",\n      score: json.score || 0,\n      verification_status: json.verification?.status || \"unknown\",\n      status: json.email ? \"Enriched\" : \"Not Found\"\n    }\n  });\n}\n\nreturn results;"
      },
      "typeVersion": 2
    },
    {
      "id": "003c89ca-448b-4b52-b7b9-1979770a9c1c",
      "name": "Update LinkedIn Contacts in Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1136,
        16
      ],
      "parameters": {
        "columns": {
          "value": {
            "Email": "={{ $json.email }}",
            "Phone": "={{ $json.phone }}",
            "Score": "={{ $json.score }}",
            "Status": "Done",
            "row_number": "={{ $('Batch Process LinkedIn Profiles').item.json.row_number }}"
          },
          "schema": [
            {
              "id": "LinkedIn URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "LinkedIn URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Full Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Full Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Company",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Phone",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Phone",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Score",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Score",
              "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": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1pBVkQk-tq2aidFvJTDXohBVpbFfkkcHhnlyGK5ZF0-g/edit#gid=0",
          "cachedResultName": "linkedin profiles"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1pBVkQk-tq2aidFvJTDXohBVpbFfkkcHhnlyGK5ZF0-g",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1pBVkQk-tq2aidFvJTDXohBVpbFfkkcHhnlyGK5ZF0-g/edit?usp=drivesdk",
          "cachedResultName": "Tomba - LinkedIn Contact Finder"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "f26076a0-8ff1-4199-b647-ce0ec4453195",
  "connections": {
    "Every Day Trigger": {
      "main": [
        [
          {
            "node": "Read LinkedIn Profiles from Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format LinkedIn Contact Data": {
      "main": [
        [
          {
            "node": "Update LinkedIn Contacts in Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Batch Process LinkedIn Profiles": {
      "main": [
        [],
        [
          {
            "node": "Retrieve Email from LinkedIn URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Retrieve Email from LinkedIn URL": {
      "main": [
        [
          {
            "node": "Format LinkedIn Contact Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read LinkedIn Profiles from Sheets": {
      "main": [
        [
          {
            "node": "Batch Process LinkedIn Profiles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update LinkedIn Contacts in Sheets": {
      "main": [
        [
          {
            "node": "Batch Process LinkedIn Profiles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}