AutomationFlowsAI & RAG › Automate Job Matching with Gemini Ai, Decodo Scraping & Resume Analysis to…

Automate Job Matching with Gemini Ai, Decodo Scraping & Resume Analysis to…

Original n8n title: Automate Job Matching with Gemini Ai, Decodo Scraping & Resume Analysis to Telegram

ByRully Saputra @rullysaputra15 on n8n.io

Sign up for Decodo — get better pricing here

Cron / scheduled trigger★★★★☆ complexityAI-powered20 nodes@Decodo/N8N Nodes DecodoGoogle Gemini ChatOutput Parser StructuredTelegramGoogle SheetsAgentGoogle DriveChain Summarization
AI & RAG Trigger: Cron / scheduled Nodes: 20 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #11774 — we link there as the canonical source.

This workflow follows the Agent → Chainsummarization 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": "n9vWZ1jS4GhwII10",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Decodo Job Posting",
  "tags": [],
  "nodes": [
    {
      "id": "f9d6b803-89d6-4bd4-a638-ac19368c5597",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -336,
        0
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "4f7eb37f-e9cf-4d80-8003-688880d08361",
      "name": "Decodo",
      "type": "@decodo/n8n-nodes-decodo.decodo",
      "position": [
        816,
        0
      ],
      "parameters": {
        "url": "https://www.simplyhired.com/search?q=software+engineer&l=Remote"
      },
      "credentials": {
        "decodoApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a6c2bb0d-fb08-40b3-adce-d903b37910d0",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        1200,
        240
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "062c5c30-a380-47b1-86e6-0f02398f4f8f",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1584,
        272
      ],
      "parameters": {
        "jsonSchemaExample": "{\n\t\"jobs\": [\n      {\n        \"company_name\": \"Redtrails\",\n        \"location\": \"south africa\",\n        \"salary_range\": \"70k - 80k\",\n        \"type\": \"remote\",\n        \"title\": \"software engineer\",\n        \"benefits\": \"health insurance,remote\",\n        \"isQuickApply\": true,\n        \"requirements\":\"Computer science, Computer Science, System design\",\n        \"url\": \"/job/0na7MNftvmilDf319ZD1iQBRdl5kbZx1zCwuNy_LUakQd1VtZcjtqA\",\n        \"isMatch\": true\n      }\n    ]\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "8a2179fd-b2bf-4204-aa1a-eaef1b8cc079",
      "name": "Split Out",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1744,
        0
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "output.jobs"
      },
      "typeVersion": 1
    },
    {
      "id": "e3cf1a33-41b1-478a-ba1d-5e455295361f",
      "name": "Notify User",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2112,
        0
      ],
      "parameters": {
        "text": "=\ud83d\udc4bNew Job Posting Alert\ud83d\udc4b\n\nDate Extracted: {{ $json['date extracted'] }}\n\nTitle: {{ $json.title }}\nCompany Name: {{ $json['company name'] }}\nLocation: {{ $json.location }}\nJob Type: {{ $json['job type'] }}\nBenefits: {{ $json.benefits }}\nSalary Range: {{ $json['salary range'] }}\nRequirements: {{ $json.requirements }}\nQuick Apply?: {{ $json['quick apply?'] }}\nurl: https://www.simplyhired.com{{ $json.url }}\n",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "703665d5-bc3d-4109-a300-664095ea978d",
      "name": "Store to Database",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1936,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "url": "=https://www.simplyhired.com{{ $json.url }}",
            "title": "={{ $json.title }}",
            "isMatch": "={{ $json.isMatch }}",
            "benefits": "={{ $json.benefits }}",
            "job type": "={{ $json.type }}",
            "location": "={{ $json.location }}",
            "company name": "={{ $json.company_name }}",
            "quick apply?": "={{ $json.isQuickApply }}",
            "requirements": "={{ $json.requirements }}",
            "salary range": "={{ $json.salary_range }}",
            "date extracted": "={{ DateTime.now().format('yyyy-MM-dd')}}"
          },
          "schema": [
            {
              "id": "date extracted",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "date extracted",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "company name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "company name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "location",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "location",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "benefits",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "benefits",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "job type",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "job type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "requirements",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "requirements",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "salary range",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "salary range",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "quick apply?",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "quick apply?",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "url",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "isMatch",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "isMatch",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1409861276,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1uvnAqq36EoJqdTN01oHCsQs7eqP0zVP3BM_ZJ7avepQ/edit#gid=1409861276",
          "cachedResultName": "job listings"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "https://docs.google.com/spreadsheets/d/1uvnAqq36EoJqdTN01oHCsQs7eqP0zVP3BM_ZJ7avepQ/edit?gid=2088990373#gid=2088990373"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "15986bcb-de46-42ae-a8d7-f45439a84ad8",
      "name": "Extract HTML",
      "type": "n8n-nodes-base.html",
      "position": [
        1056,
        0
      ],
      "parameters": {
        "options": {},
        "operation": "extractHtmlContent",
        "dataPropertyName": "results[0].content",
        "extractionValues": {
          "values": [
            {
              "key": "job",
              "cssSelector": ".css-13ia03s"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "7655e225-518b-418c-9656-172e69436219",
      "name": "Job Application Extractor",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1296,
        0
      ],
      "parameters": {
        "text": "={{ $json.job }}",
        "options": {
          "systemMessage": "=# Role\n- act as an expert data extractor\n\n# Instructions\n- extract the data from the html file\n- follow the output parser for the final structured format in JSON\n- isMatch field is compare the resume with the title and requirements from the job, if match then return true otherwise\n- benefits: should return the benefits that company propose, if it's not existed then return 'N/A'\n\n# Resume\n- {{ $('Get Content').item.json.text }}"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3
    },
    {
      "id": "5aef54cb-ce2c-4708-b274-2438486c844f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        784,
        -240
      ],
      "parameters": {
        "height": 224,
        "content": "### Decodo \n- Use SimplyHired search URL only (you can replace by your own preference)\n- Do not scrape company or review pages\n- Avoid parallel requests"
      },
      "typeVersion": 1
    },
    {
      "id": "4689419c-7dff-4144-86a9-c967f3e37a4d",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1088,
        -240
      ],
      "parameters": {
        "height": 224,
        "content": "### Extract HTML\n- Extract only job card containers\n- Use stable selector:\n.css-13ia03s (you must adjusting the selector according to your preferred page)\n- Output field must be named job"
      },
      "typeVersion": 1
    },
    {
      "id": "87a9c1e5-f31b-41b4-bb0d-dc1eeadb00c3",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1408,
        -240
      ],
      "parameters": {
        "height": 224,
        "content": "### AI Agent\n- Input must be raw HTML (job)\n- Role: expert data extractor\n- Output must follow structured parser schema\n- One job card \u2192 one structured job\n- Add resume for generate `isMatch` value"
      },
      "typeVersion": 1
    },
    {
      "id": "d072ba76-3900-4361-98e1-c8669030f9fe",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2016,
        -256
      ],
      "parameters": {
        "height": 224,
        "content": "### Telegram Notifier\n- Trigger only after DB insert\n- Concat the url with the domain if you only have relative path\n- One message per job\n- Keep message format consistent"
      },
      "typeVersion": 1
    },
    {
      "id": "0350908d-aa23-47d6-bebb-d5148c04a389",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -944,
        -480
      ],
      "parameters": {
        "width": 528,
        "height": 720,
        "content": "## AI Job Matcher with Decodo, Gemini AI & Resume Analysis in n8n\n\n## How it works\n\n1. Trigger runs the workflow on a schedule  \n2. Decodo scrapes job listings from SimplyHired  \n3. Job HTML is extracted and parsed  \n4. Gemini AI agent structures job data  \n5. Resume PDFs are downloaded from Google Drive  \n6. Resume content is extracted from files  \n7. Gemini AI summarizes key resume information  \n8. Job and resume data are stored in the database  \n9. Matching job alerts are sent via Telegram  \n\n---\n\n## Setup steps\n\n1. Add your Decodo API credentials  \n2. Configure the SimplyHired search URL  \n3. Add your Google Gemini API key  \n4. Connect Google Drive for resume access  \n5. Set up your database (Google Sheets or alternative)  \n6. Configure the Telegram bot and chat ID  \n7. Adjust selectors, prompts, and fields as needed  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "6e39d2a9-f1c9-4f02-8937-eee383f0184f",
      "name": "Download Resume",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -112,
        0
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "list",
          "value": "1Sn25F5dDAkltorQ5-lSxhGmPOeQrAiFB",
          "cachedResultUrl": "https://drive.google.com/file/d/1Sn25F5dDAkltorQ5-lSxhGmPOeQrAiFB/view?usp=drivesdk",
          "cachedResultName": "cv_rully_saputra.pdf"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "e07d14c9-b779-498a-bf47-5814b7fb13fd",
      "name": "Extract Resume",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        96,
        0
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1.1
    },
    {
      "id": "91850bc2-35eb-4823-8a73-0e0168b590e7",
      "name": "Google Gemini Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        416,
        272
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "9d028586-36d2-4e03-8b8c-b141b5edc7f1",
      "name": "Resume Summarizer",
      "type": "@n8n/n8n-nodes-langchain.chainSummarization",
      "position": [
        480,
        0
      ],
      "parameters": {
        "options": {},
        "chunkSize": 100000,
        "chunkOverlap": 2000
      },
      "typeVersion": 2.1
    },
    {
      "id": "22e0d44a-6456-4c0c-82a3-52bcdfeb1494",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -144,
        -224
      ],
      "parameters": {
        "width": 864,
        "height": 384,
        "content": "### Resume Processing & Summarization\n\nDownloads resume PDFs from Google Drive, extracts full text content, and uses AI to generate a concise, structured summary highlighting key skills, experience, and relevant insights. Ensures files are accessible and optimized for accurate AI analysis.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "69c83d86-ba21-4fec-b820-eb13990cccf9",
      "name": "Get Content",
      "type": "n8n-nodes-base.set",
      "position": [
        304,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "51d22e20-e0bb-4d3f-8ecc-e25b94ab52f7",
              "name": "text",
              "type": "string",
              "value": "={{ $json.text }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "87ee0ae9-ebf0-4ec1-92f0-bc243d7a78d3",
  "connections": {
    "Decodo": {
      "main": [
        [
          {
            "node": "Extract HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "Store to Database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Content": {
      "main": [
        [
          {
            "node": "Resume Summarizer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract HTML": {
      "main": [
        [
          {
            "node": "Job Application Extractor",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Resume": {
      "main": [
        [
          {
            "node": "Get Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Resume": {
      "main": [
        [
          {
            "node": "Extract Resume",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Download Resume",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Resume Summarizer": {
      "main": [
        [
          {
            "node": "Decodo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Store to Database": {
      "main": [
        [
          {
            "node": "Notify User",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Job Application Extractor",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Job Application Extractor",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Resume Summarizer",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Job Application Extractor": {
      "main": [
        [
          {
            "node": "Split Out",
            "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

Sign up for Decodo — get better pricing here

Source: https://n8n.io/workflows/11774/ — 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

Customer support calls contain a wealth of valuable feedback and urgent issues, but manually reviewing audio files is inefficient. This workflow acts as an AI assistant for your call log, transforming

Google Drive, Google Gemini Chat, Output Parser Structured +4
AI & RAG

Resume Screening & Behavioral Interviews with Gemini, Elevenlabs, & Notion ATS copy. Uses outputParserStructured, chainLlm, googleDrive, stickyNote. Webhook trigger; 67 nodes.

Output Parser Structured, Chain Llm, Google Drive +9
AI & RAG

Candidate Engagement | Resume Screening | AI Voice Interviews | Applicant Insights

Output Parser Structured, Chain Llm, Google Drive +9
AI & RAG

This automation is designed to help you generate AI-powered music tracks, cover art, and fully rendered music videos — all triggered from a simple Telegram chat and managed via Google Sheets.

OpenAI Chat, Memory Buffer Window, Output Parser Structured +11
AI & RAG

LinkedIn URL → Scrape → Match → Screen → Decide, all automated

Google Drive, Agent, Google Drive Tool +6