AutomationFlowsAI & RAG › Job Agent Workflow

Job Agent Workflow

Job-Agent-Workflow. Uses httpRequest, telegram, googleSheets. Scheduled trigger; 8 nodes.

Cron / scheduled trigger★★★★☆ complexity8 nodesHTTP RequestTelegramGoogle Sheets
AI & RAG Trigger: Cron / scheduled Nodes: 8 Complexity: ★★★★☆ Added:

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
{
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 3
            }
          ]
        }
      },
      "id": "1",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        240,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "const portals = [\n  { name: 'Duunitori', url: 'https://duunitori.fi/tyopaikat', language: 'fi' },\n  { name: 'Tyomarkkinatori', url: 'https://tyomarkkinatori.fi', language: 'fi' },\n  { name: 'Oikotie', url: 'https://tyopaikat.oikotie.fi', language: 'fi' },\n  { name: 'Jobly', url: 'https://www.jobly.fi', language: 'fi' },\n  { name: 'LinkedIn', url: 'https://www.linkedin.com/jobs/search/?location=Finland', language: 'en' },\n  { name: 'Indeed', url: 'https://fi.indeed.com', language: 'fi' },\n  { name: 'JobsPortal', url: 'https://www.jobsportal.fi', language: 'en' },\n  { name: 'JobsInHelsinki', url: 'https://www.jobsinhelsinki.com', language: 'en' },\n  { name: 'Barona', url: 'https://www.barona.fi/tyonhakijalle/avoimet-tyopaikat', language: 'fi' },\n  { name: 'Rekrytointi', url: 'https://www.rekrytointi.com', language: 'fi' },\n  { name: 'WorkInFinland', url: 'https://www.workinfinland.com', language: 'en' },\n  { name: 'Staffpoint', url: 'https://www.staffpoint.fi/tyopaikat', language: 'fi' }\n];\nreturn portals.map(portal => ({ json: portal }));"
      },
      "id": "2",
      "name": "Job Portals List",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        460,
        300
      ]
    },
    {
      "parameters": {
        "url": "={{ $json.url }}",
        "options": {
          "timeout": 30000,
          "response": {
            "response": {
              "responseFormat": "text"
            }
          }
        }
      },
      "id": "3",
      "name": "Scrape Job Listings",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        680,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "const html = $json.data || '';\nconst portalName = $('Job Portals List').item.json.name;\nconst portalUrl = $('Job Portals List').item.json.url;\nreturn [{\n  json: {\n    portal: portalName,\n    portal_url: portalUrl,\n    raw_html: html.substring(0, 15000)\n  }\n}];"
      },
      "id": "4",
      "name": "Prepare for AI",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        900,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "const allowedLanguages = ['fi', 'en', 'ar'];\nconst now = new Date();\nconst jobs = $input.all();\n\nconst filtered = jobs.filter(item => {\n  const job = item.json;\n  if (!job.job_title || !job.job_url) return false;\n  if (job.requires_other_language === true) return false;\n  if (!allowedLanguages.includes(job.language)) return false;\n  if (job.posting_date) {\n    const posted = new Date(job.posting_date);\n    const daysDiff = (now - posted) / (1000 * 60 * 60 * 24);\n    if (daysDiff > 30) return false;\n  }\n  return true;\n});\n\nreturn filtered.map(item => ({ json: item.json }));"
      },
      "id": "5",
      "name": "Language and Date Filter",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1120,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "const jobData = $json;\nreturn [{\n  json: {\n    ...jobData,\n    application_status: 'Pending Review',\n    created_at: new Date().toISOString(),\n    review_deadline: new Date(Date.now() + 24*60*60*1000).toISOString()\n  }\n}];"
      },
      "id": "6",
      "name": "Prepare Application",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1340,
        300
      ]
    },
    {
      "parameters": {
        "chatId": "YOUR_TELEGRAM_CHAT_ID",
        "text": "=\ud83d\udd14 NEW JOB MATCH!\n\n\ud83d\udccb {{ $json.job_title }}\n\ud83c\udfe2 {{ $json.company }}\n\ud83d\udccd {{ $json.location }}\n\ud83c\udf10 {{ $json.portal }}\n\ud83d\udd17 {{ $json.job_url }}\n\n\u23f0 24h to review. Auto-submits after deadline.",
        "additionalFields": {}
      },
      "id": "7",
      "name": "Send Telegram Alert",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        1560,
        300
      ]
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID"
        },
        "sheetName": {
          "mode": "list",
          "value": "gid=0"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Date": "={{ $json.created_at }}",
            "Company": "={{ $json.company }}",
            "Job Title": "={{ $json.job_title }}",
            "Portal": "={{ $json.portal }}",
            "Language": "={{ $json.language }}",
            "Score": "={{ $json.score }}",
            "Status": "=Pending Review",
            "Job URL": "={{ $json.job_url }}",
            "Notes": "={{ $json.match_reason }}"
          }
        }
      },
      "id": "8",
      "name": "Log to Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        1780,
        300
      ]
    }
  ],
  "connections": {
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Job Portals List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Job Portals List": {
      "main": [
        [
          {
            "node": "Scrape Job Listings",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape Job Listings": {
      "main": [
        [
          {
            "node": "Prepare for AI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare for AI": {
      "main": [
        [
          {
            "node": "Language and Date Filter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Language and Date Filter": {
      "main": [
        [
          {
            "node": "Prepare Application",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Application": {
      "main": [
        [
          {
            "node": "Send Telegram Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Telegram Alert": {
      "main": [
        [
          {
            "node": "Log to Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Job-Agent-Workflow. Uses httpRequest, telegram, googleSheets. Scheduled trigger; 8 nodes.

Source: https://gist.github.com/mmasni/c190900fe19f7e69d77937b165b437b5 — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

Ultimate Agent Platform. Uses httpRequest, n8n-nodes-openclaw, googleSheets, telegram. Scheduled trigger; 9 nodes.

HTTP Request, N8N Nodes Openclaw, Google Sheets +1
AI & RAG

Cyber Zap Public. Uses httpRequest, chainLlm, outputParserStructured, telegram. Scheduled trigger; 69 nodes.

HTTP Request, Chain Llm, Output Parser Structured +6
AI & RAG

This workflow automates invoicing and payment follow-ups using Google Sheets, PDFShift, Groq (LLM), Gmail, and Telegram, sending initial invoices with PDF attachments, scheduling overdue reminders at

Google Sheets, Gmail, Telegram +6
AI & RAG

This workflow is for solopreneurs, founders, creators, and marketers who want a consistent LinkedIn presence without spending hours writing posts. Ideal for anyone in tech, SaaS, or AI who wants trend

HTTP Request, Agent, Google Sheets +2
AI & RAG

YOUTUBE GUIDE 📣 This template generates up to 2,000 AI-based stock images per day for under $4. It includes prompt generation, image creation, metadata enrichment, upload to Google Drive, and error lo

Google Sheets, HTTP Request, Google Drive +6