AutomationFlowsSocial Media › Scrape Linkedin Job Listings with Phantombuster & Save to Google Sheets

Scrape Linkedin Job Listings with Phantombuster & Save to Google Sheets

ByAvkash Kakdiya @itechnotion on n8n.io

This workflow automatically scrapes LinkedIn job postings for a list of target companies and organizes the results in Google Sheets. Every Monday morning, it checks your company list, runs a LinkedIn job scrape using Phantombuster, waits for the data to be ready, and then…

Cron / scheduled trigger★★★★☆ complexity10 nodesHTTP RequestGoogle Sheets
Social Media Trigger: Cron / scheduled Nodes: 10 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #8144 — 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
{
  "id": "example-workflow-id",
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "name": "21 - Competitive Hiring Intelligence System",
  "tags": [],
  "nodes": [
    {
      "id": "3195a2a6-d109-4394-b72e-a3799cf55c2b",
      "name": "\ud83d\ude80 Trigger Phantombuster Scraper",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        200,
        -40
      ],
      "parameters": {
        "url": "=https://api.phantombuster.com/api/v2/agents/launch",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"id\": \"YOUR_PHANTOMBUSTER_AGENT_ID\",\n  \"argument\": {\n    \"profileUrls\": [\"{{ $json.LinkedIn }}\"]\n  }\n}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "X-Phantombuster-Key-1",
              "value": "YOUR_PHANTOMBUSTER_API_KEY_HERE"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "67ed3500-b5d1-48e3-9071-6b80fcbe8657",
      "name": "\u23f3 Wait for Scraper to Finish",
      "type": "n8n-nodes-base.wait",
      "position": [
        420,
        -40
      ],
      "parameters": {
        "unit": "minutes",
        "amount": 3
      },
      "typeVersion": 1.1
    },
    {
      "id": "7f8db189-e297-49d8-8cbe-6277221846ea",
      "name": "\ud83d\udce6 Fetch Scraped CSV Link",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        640,
        -40
      ],
      "parameters": {
        "url": "=https://api.phantombuster.com/api/v2/containers/fetch-output?id={{ $('\ud83d\ude80 Trigger Phantombuster Scraper').item.json.containerId }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "X-Phantombuster-Key-1",
              "value": "YOUR_PHANTOMBUSTER_API_KEY_HERE"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "2d6dab41-3235-47ce-846a-812d4600629c",
      "name": "\u23f0Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -240,
        -40
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 9 * * 1"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "2a7fd7c7-3064-4a43-be40-f13c90b475cd",
      "name": "\ud83d\udcc4Read Companies Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -20,
        -40
      ],
      "parameters": {
        "options": {
          "returnAllMatches": "returnFirstMatch"
        },
        "filtersUI": {
          "values": [
            {
              "lookupValue": "Pending",
              "lookupColumn": "Status"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID_HERE/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID_HERE",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID_HERE/edit",
          "cachedResultName": "Companies List"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4
    },
    {
      "id": "abe0f5f0-0861-44f3-9ed0-abef7c4e17e1",
      "name": "\ud83d\udee0\ufe0fFormat Job Data",
      "type": "n8n-nodes-base.set",
      "position": [
        860,
        -40
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "Company Name"
            },
            {
              "name": "Job Title"
            },
            {
              "name": "Job Description"
            },
            {
              "name": "Job Link"
            },
            {
              "name": "Date Posted"
            },
            {
              "name": "Location"
            },
            {
              "name": "Employment Type"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "d236fdab-cd32-425b-8ab5-fb9aa4ab97cc",
      "name": "\ud83d\udccaWrite to Results Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1080,
        -40
      ],
      "parameters": {
        "columns": {
          "value": {
            "Job Link": "={{$json[\"Job Link\"]}}",
            "Location": "={{$json[\"Location\"]}}",
            "Job Title": "={{$json[\"Job Title\"]}}",
            "Date Posted": "={{$json[\"Date Posted\"]}}",
            "Company Name": "={{$json[\"Company Name\"]}}",
            "Scraped Date": "={{new Date().toISOString().split('T')[0]}}",
            "Employment Type": "={{$json[\"Employment Type\"]}}",
            "Job Description": "={{$json[\"Job Description\"]}}"
          },
          "schema": [
            {
              "id": "Company Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Company Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Job Title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Job Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Job Description",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Job Description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Job Link",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Job Link",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date Posted",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Date Posted",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Location",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Location",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Employment Type",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Employment Type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Scraped Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Scraped Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": []
        },
        "options": {},
        "operation": "append",
        "sheetName": "Job Results",
        "documentId": "YOUR_RESULTS_SHEET_ID_HERE"
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4
    },
    {
      "id": "a6eb28b6-7b45-437a-9142-757924d23281",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -300,
        -320
      ],
      "parameters": {
        "color": 4,
        "width": 440,
        "height": 560,
        "content": "## 1. Trigger & Input Retrieval\n\n\u23f0 Schedule Trigger: Runs the workflow at 9:00 AM every Monday.\n\n\ud83d\udcc4 Read Companies Sheet: Reads data from a specified Google Sheet containing company details, filtering only those with Status = Pending.\n\nPurpose: Ensures the scraper runs on fresh, relevant company entries at a scheduled interval."
      },
      "typeVersion": 1
    },
    {
      "id": "e3e451fd-fa5e-4e25-ba82-c1f5e22ad91b",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        160,
        -320
      ],
      "parameters": {
        "color": 6,
        "width": 640,
        "height": 560,
        "content": "## 2. Scraping Process (Phantombuster Integration)\n\n\ud83d\ude80 Trigger Phantombuster Scraper: Sends a POST request to the Phantombuster API to start a LinkedIn job scrape, passing the LinkedIn profile URL from the sheet as input.\n\n\u23f3 Wait for Scraper to Finish: Pauses execution for 3 minutes to allow Phantombuster to complete the scrape.\n\n\ud83d\udce6 Fetch Scraped CSV Link: Fetches the output CSV file link from the Phantombuster container.\n\nPurpose: Automates the job scraping process without manual API checks or re-runs.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "9b58f1e2-06b1-42c2-941c-e117e75dcc5a",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        820,
        -320
      ],
      "parameters": {
        "color": 3,
        "width": 460,
        "height": 560,
        "content": "## 3. Data Processing & Storage\n\n\ud83d\udee0\ufe0f Format Job Data: Structures the scraped job data into predefined fields \u2014 Company Name, Job Title, Job Description, Job Link, Date Posted, Location, and Employment Type.\n\n\ud83d\udcca Write to Results Sheet: Appends the formatted job data into a separate Google Sheet (Job Results), including the current scrape date for tracking.\n\nPurpose: Converts raw scrape output into a clean, standardized dataset and saves it for easy review."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "sanitized-version-id",
  "connections": {
    "\u23f0Schedule Trigger": {
      "main": [
        [
          {
            "node": "\ud83d\udcc4Read Companies Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udee0\ufe0fFormat Job Data": {
      "main": [
        [
          {
            "node": "\ud83d\udccaWrite to Results Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udcc4Read Companies Sheet": {
      "main": [
        [
          {
            "node": "\ud83d\ude80 Trigger Phantombuster Scraper",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udccaWrite to Results Sheet": {
      "main": [
        []
      ]
    },
    "\ud83d\udce6 Fetch Scraped CSV Link": {
      "main": [
        [
          {
            "node": "\ud83d\udee0\ufe0fFormat Job Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u23f3 Wait for Scraper to Finish": {
      "main": [
        [
          {
            "node": "\ud83d\udce6 Fetch Scraped CSV Link",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\ude80 Trigger Phantombuster Scraper": {
      "main": [
        [
          {
            "node": "\u23f3 Wait for Scraper to Finish",
            "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

This workflow automatically scrapes LinkedIn job postings for a list of target companies and organizes the results in Google Sheets. Every Monday morning, it checks your company list, runs a LinkedIn job scrape using Phantombuster, waits for the data to be ready, and then…

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

More Social Media workflows → · Browse all categories →

Related workflows

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

Social Media

This template is ideal for sales teams, recruiters, business development professionals, and relationship managers who need to monitor changes in their network's LinkedIn profiles. Perfect for agencies

Google Sheets, HTTP Request, Slack
Social Media

Save time - Eliminate manual LinkedIn posting and content scheduling tasks Stay consistent - Automated daily posting keeps your LinkedIn profile active and engaging Keep control - Preview every post b

HTTP Request, Telegram, Google Sheets +2
Social Media

Send Personalized DMs to LinkedIn Profile Visitors. Uses httpRequest, googleSheets. Scheduled trigger; 21 nodes.

HTTP Request, Google Sheets
Social Media

&gt; Set up n8n self-hosted instance using https://tino.vn/vps-n8n?affid=388 &gt; Use the code ==VPSN8N== for up to 39% off.

Google Drive, HTTP Request, Google Sheets
Social Media

&gt; Recommended: Self-hosted via tino.vn/vps-n8n?affid=388 — use code VPSN8N for up to 39% off.

Google Drive, Google Sheets, HTTP Request