This workflow corresponds to n8n.io template #14772 — we link there as the canonical source.
This workflow follows the Agent → Gmail 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "6342426b-2394-4a52-a476-bb3ce9f69b8e",
"name": "Receive Application via Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
-128,
144
],
"parameters": {
"path": "job-application",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2.1
},
{
"id": "678c69e8-578d-4f8b-bdb9-4195d8ac7c61",
"name": "Structure Job and Candidate Data",
"type": "n8n-nodes-base.set",
"position": [
96,
144
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "f4252103-8544-4b4e-be8c-bb250bd83cb7",
"name": "Job_Information",
"type": "object",
"value": "={{ $json.body.job }}"
},
{
"id": "aa7feed0-9d49-4382-9186-3801b43667d6",
"name": "Candidate_Information",
"type": "object",
"value": "={{ $json.body.candidate }}"
},
{
"id": "bb8feed1-0e50-5493-a297-4912c54778e7",
"name": "ApplicationId",
"type": "string",
"value": "={{ $json.body.applicationId }}"
},
{
"id": "cc9feed2-1f61-6504-b308-5023d65889f8",
"name": "ReceivedAt",
"type": "string",
"value": "={{ $now.toISO() }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "1532fb94-2677-4eb2-80a3-b647c726dfb7",
"name": "Check for Duplicate Application",
"type": "n8n-nodes-base.googleSheets",
"position": [
320,
144
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupValue": "={{ $json.ApplicationId }}",
"lookupColumn": "ApplicationId"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_GOOGLE_SHEETS_DOCUMENT_ID",
"cachedResultUrl": "",
"cachedResultName": "ShortListed Candidates"
}
},
"typeVersion": 4.7
},
{
"id": "813610e2-12fe-4312-a4e3-1a91f4d64267",
"name": "Is Duplicate Application?",
"type": "n8n-nodes-base.if",
"position": [
528,
144
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "dup-check-001",
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{ $json.length }}",
"rightValue": 0
}
]
}
},
"typeVersion": 2.3
},
{
"id": "c0ca8312-600b-4c26-95c4-6863b6855e04",
"name": "Score Candidate with AI",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
784,
144
],
"parameters": {
"text": "=Please evaluate the following job application:\n\nJob Title: {{ $('Structure Job and Candidate Data').item.json.Job_Information.title }}\nJob Description: {{ $('Structure Job and Candidate Data').item.json.Job_Information.description }}\nRequired Skills: {{ $('Structure Job and Candidate Data').item.json.Job_Information.requiredSkills }}\nRequired Experience: {{ $('Structure Job and Candidate Data').item.json.Job_Information.requiredExperienceYears }} years\n\nCandidate Name: {{ $('Structure Job and Candidate Data').item.json.Candidate_Information.name }}\nCandidate Skills: {{ $('Structure Job and Candidate Data').item.json.Candidate_Information.skills }}\nYears of Experience: {{ $('Structure Job and Candidate Data').item.json.Candidate_Information.experienceYears }}\nEducation: {{ $('Structure Job and Candidate Data').item.json.Candidate_Information.education }}\nResume URL: {{ $('Structure Job and Candidate Data').item.json.Candidate_Information.resumeUrl }}",
"options": {},
"promptType": "define"
},
"typeVersion": 3
},
{
"id": "e7036547-4f0a-4fb9-a86d-32168afd3515",
"name": "Groq LLM (llama-3.3-70b)",
"type": "@n8n/n8n-nodes-langchain.lmChatGroq",
"position": [
800,
320
],
"parameters": {
"model": "llama-3.3-70b-versatile",
"options": {}
},
"typeVersion": 1
},
{
"id": "f19d0f69-4084-4ab7-98d1-2f870a825355",
"name": "Parse Score, Reason, Strengths and Gaps",
"type": "n8n-nodes-base.code",
"position": [
1104,
144
],
"parameters": {
"jsCode": "const text = $json.output;\n\nconst scoreMatch = text.match(/Score:\\s*(\\d+)/i);\nconst score = scoreMatch ? parseInt(scoreMatch[1]) : null;\n\nconst reasonMatch = text.match(/Reason:\\s*([\\s\\S]*?)(?=\\nStrengths:|$)/i);\nconst reason = reasonMatch ? reasonMatch[1].trim() : null;\n\nconst strengthsMatch = text.match(/Strengths:\\s*([\\s\\S]*?)(?=\\nGaps:|$)/i);\nconst strengths = strengthsMatch ? strengthsMatch[1].trim() : null;\n\nconst gapsMatch = text.match(/Gaps:\\s*([\\s\\S]*?)$/i);\nconst gaps = gapsMatch ? gapsMatch[1].trim() : null;\n\nconst band = score >= 80 ? 'Strong' : score >= 60 ? 'Moderate' : 'Weak';\n\nreturn [\n {\n score,\n reason,\n strengths,\n gaps,\n band\n }\n];"
},
"typeVersion": 2
},
{
"id": "b90117d7-b114-42f4-a35b-d9ff37523e95",
"name": "Route by Score Band",
"type": "n8n-nodes-base.switch",
"position": [
1328,
144
],
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"version": 3,
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "sw-001",
"operator": {
"type": "number",
"operation": "gte"
},
"leftValue": "={{ $json.score }}",
"rightValue": 80
}
]
}
},
{
"conditions": {
"options": {
"version": 3,
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "sw-002",
"operator": {
"type": "number",
"operation": "gte"
},
"leftValue": "={{ $json.score }}",
"rightValue": 60
}
]
}
}
]
},
"options": {}
},
"typeVersion": 3
},
{
"id": "f453f8f8-53d2-40aa-9526-882d9819856d",
"name": "Log Shortlisted Candidate to Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1696,
0
],
"parameters": {
"columns": {
"value": {
"Band": "={{ $('Parse Score, Reason, Strengths and Gaps').item.json.band }}",
"Gaps": "={{ $('Parse Score, Reason, Strengths and Gaps').item.json.gaps }}",
"Score": "={{ $('Parse Score, Reason, Strengths and Gaps').item.json.score }}",
"Resume": "={{ $('Structure Job and Candidate Data').item.json.Candidate_Information.resumeUrl }}",
"Status": "=Shortlisted",
"Job Title": "={{ $('Structure Job and Candidate Data').item.json.Job_Information.title }}",
"Strengths": "={{ $('Parse Score, Reason, Strengths and Gaps').item.json.strengths }}",
"ReceivedAt": "={{ $('Structure Job and Candidate Data').item.json.ReceivedAt }}",
"Description": "={{ $('Parse Score, Reason, Strengths and Gaps').item.json.reason }}",
"ApplicationId": "={{ $('Structure Job and Candidate Data').item.json.ApplicationId }}",
"Candidate Name": "={{ $('Structure Job and Candidate Data').item.json.Candidate_Information.name }}"
},
"schema": [
{
"id": "ApplicationId",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "ApplicationId",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Job Title",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Job Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Candidate Name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Candidate Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Resume",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Resume",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Score",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Band",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Band",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Description",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Strengths",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Strengths",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Gaps",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Gaps",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "ReceivedAt",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "ReceivedAt",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_GOOGLE_SHEETS_DOCUMENT_ID",
"cachedResultUrl": "",
"cachedResultName": "ShortListed Candidates"
}
},
"typeVersion": 4.7
},
{
"id": "270d0c66-40e4-43b7-b19f-2975e07b6216",
"name": "Send Shortlist Congratulations Email",
"type": "n8n-nodes-base.gmail",
"position": [
1936,
0
],
"parameters": {
"sendTo": "={{ $('Structure Job and Candidate Data').item.json.Candidate_Information.email }}",
"message": "=<html><body><table><tr><td style=\"font-size:20px;font-weight:bold;color:#2c3e50\">You are Shortlisted!</td></tr><tr><td style=\"height:15px\"></td></tr><tr><td style=\"font-size:14px;color:#555\">Dear {{ $('Structure Job and Candidate Data').item.json.Candidate_Information.name }},</td></tr><tr><td style=\"height:10px\"></td></tr><tr><td style=\"font-size:14px;color:#555\">Thank you for applying for the <b>{{ $('Structure Job and Candidate Data').item.json.Job_Information.title }}</b> position.<br/><br/>We are pleased to inform you that your profile has been <b>shortlisted</b> based on our initial AI-assisted screening. Our team will contact you shortly with next steps including interview scheduling.</td></tr><tr><td style=\"height:15px\"></td></tr><tr><td style=\"font-size:14px;color:#555\">We look forward to speaking with you.</td></tr><tr><td style=\"height:25px\"></td></tr><tr><td style=\"font-size:14px;color:#555\">Best regards,<br/><b>HR Team</b></td></tr></table></body></html>",
"options": {},
"subject": "=You have been Shortlisted - {{ $('Structure Job and Candidate Data').item.json.Job_Information.title }}"
},
"typeVersion": 2.2
},
{
"id": "e48cf431-f46a-4ddd-9c25-78632eadbdb5",
"name": "Notify HR Team on Slack",
"type": "n8n-nodes-base.slack",
"position": [
2176,
0
],
"parameters": {
"text": "=:white_check_mark: *New Shortlisted Candidate*\n\n*Name:* {{ $('Structure Job and Candidate Data').item.json.Candidate_Information.name }}\n*Role:* {{ $('Structure Job and Candidate Data').item.json.Job_Information.title }}\n*Score:* {{ $('Parse Score, Reason, Strengths and Gaps').item.json.score }}/100 ({{ $('Parse Score, Reason, Strengths and Gaps').item.json.band }})\n*Strengths:* {{ $('Parse Score, Reason, Strengths and Gaps').item.json.strengths }}\n*Gaps:* {{ $('Parse Score, Reason, Strengths and Gaps').item.json.gaps }}\n*Resume:* {{ $('Structure Job and Candidate Data').item.json.Candidate_Information.resumeUrl }}",
"otherOptions": {}
},
"typeVersion": 2.3
},
{
"id": "59d2a115-1678-48b7-86e9-59dc68bb2450",
"name": "Log Moderate Candidate to Waitlist",
"type": "n8n-nodes-base.googleSheets",
"position": [
1696,
192
],
"parameters": {
"columns": {
"value": {
"Band": "={{ $('Parse Score, Reason, Strengths and Gaps').item.json.band }}",
"Gaps": "={{ $('Parse Score, Reason, Strengths and Gaps').item.json.gaps }}",
"Score": "={{ $('Parse Score, Reason, Strengths and Gaps').item.json.score }}",
"Resume": "={{ $('Structure Job and Candidate Data').item.json.Candidate_Information.resumeUrl }}",
"Status": "=Waitlist",
"Job Title": "={{ $('Structure Job and Candidate Data').item.json.Job_Information.title }}",
"Strengths": "={{ $('Parse Score, Reason, Strengths and Gaps').item.json.strengths }}",
"ReceivedAt": "={{ $('Structure Job and Candidate Data').item.json.ReceivedAt }}",
"Description": "={{ $('Parse Score, Reason, Strengths and Gaps').item.json.reason }}",
"ApplicationId": "={{ $('Structure Job and Candidate Data').item.json.ApplicationId }}",
"Candidate Name": "={{ $('Structure Job and Candidate Data').item.json.Candidate_Information.name }}"
},
"schema": [
{
"id": "ApplicationId",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "ApplicationId",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Job Title",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Job Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Candidate Name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Candidate Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Resume",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Resume",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Score",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Band",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Band",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Description",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Strengths",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Strengths",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Gaps",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Gaps",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "ReceivedAt",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "ReceivedAt",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=1",
"cachedResultUrl": "",
"cachedResultName": "Waitlist"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_GOOGLE_SHEETS_DOCUMENT_ID",
"cachedResultUrl": "",
"cachedResultName": "ShortListed Candidates"
}
},
"typeVersion": 4.7
},
{
"id": "b7571ad0-4a33-4585-a59f-10cd2a422379",
"name": "Send Waitlist Holding Email",
"type": "n8n-nodes-base.gmail",
"position": [
1936,
192
],
"parameters": {
"sendTo": "={{ $('Structure Job and Candidate Data').item.json.Candidate_Information.email }}",
"message": "=<html><body><table><tr><td style=\"font-size:18px;font-weight:bold;color:#e67e22\">Application Under Review</td></tr><tr><td style=\"height:15px\"></td></tr><tr><td style=\"font-size:14px;color:#555\">Dear {{ $('Structure Job and Candidate Data').item.json.Candidate_Information.name }},</td></tr><tr><td style=\"height:10px\"></td></tr><tr><td style=\"font-size:14px;color:#555\">Thank you for applying for the <b>{{ $('Structure Job and Candidate Data').item.json.Job_Information.title }}</b> position.<br/><br/>Your application is currently under further review. We have added you to our talent pool and will reach out if a suitable opportunity arises or if shortlisted candidates do not progress.</td></tr><tr><td style=\"height:15px\"></td></tr><tr><td style=\"font-size:14px;color:#555\">We appreciate your interest and patience.</td></tr><tr><td style=\"height:25px\"></td></tr><tr><td style=\"font-size:14px;color:#555\">Kind regards,<br/><b>HR Team</b></td></tr></table></body></html>",
"options": {},
"subject": "=Update on Your Application - {{ $('Structure Job and Candidate Data').item.json.Job_Information.title }}"
},
"typeVersion": 2.2
},
{
"id": "18880e68-7613-423f-a3f9-efcadb44eaca",
"name": "Send Rejection Email",
"type": "n8n-nodes-base.gmail",
"position": [
2176,
192
],
"parameters": {
"sendTo": "={{ $('Structure Job and Candidate Data').item.json.Candidate_Information.email }}",
"message": "=<html><body><table><tr><td style=\"font-size:18px;font-weight:bold;color:#e74c3c\">Application Status Update</td></tr><tr><td style=\"height:15px\"></td></tr><tr><td style=\"font-size:14px;color:#555\">Dear {{ $('Structure Job and Candidate Data').item.json.Candidate_Information.name }},</td></tr><tr><td style=\"height:10px\"></td></tr><tr><td style=\"font-size:14px;color:#555\">Thank you for applying for the <b>{{ $('Structure Job and Candidate Data').item.json.Job_Information.title }}</b> position.<br/><br/>After careful consideration, we regret to inform you that we will not be moving forward with your application at this time. We encourage you to apply for future openings that match your profile.</td></tr><tr><td style=\"height:15px\"></td></tr><tr><td style=\"font-size:14px;color:#555\">We truly appreciate your interest and wish you success in your career journey.</td></tr><tr><td style=\"height:25px\"></td></tr><tr><td style=\"font-size:14px;color:#555\">Kind regards,<br/><b>HR Team</b></td></tr></table></body></html>",
"options": {},
"subject": "=Update on Your Application - {{ $('Structure Job and Candidate Data').item.json.Job_Information.title }}"
},
"typeVersion": 2.2
},
{
"id": "a23cec44-332d-4791-9e84-e94f594a99e8",
"name": "Overview - AI Job Screening Automator",
"type": "n8n-nodes-base.stickyNote",
"position": [
-736,
-352
],
"parameters": {
"width": 496,
"height": 848,
"content": "# AI Job Application Screening and Shortlist Automator\n\nThis workflow automates end-to-end candidate screening using AI. When a job application is submitted via webhook, it checks for duplicates, evaluates the candidate against the job requirements using an LLM, assigns a score from 0-100, and routes the candidate into one of three tracks: Shortlisted, Waitlist, or Rejected. HR teams are notified on Slack for top candidates.\n\n### How it Works\n\t- Webhook receives job and candidate data from your ATS or application form\n\t- Candidate and job data are structured and a timestamp is added\n\t- Google Sheets is checked to prevent duplicate application processing\n\t- AI Agent evaluates the candidate and generates a score, reason, strengths, and gaps\n\t- JavaScript parses the AI output into structured fields including a score band\n\t- Switch node routes candidate into Strong (80+), Moderate (60-79), or Weak (below 60)\n\t- Strong candidates are logged to the shortlist sheet and receive a congratulations email plus a Slack alert to the HR team\n\t- Moderate candidates are logged to a waitlist sheet and receive a holding email\n\t- Weak candidates receive a polite rejection email\n\n### Setup Steps\n1. Set up your Webhook node and connect your ATS or application form to the webhook URL\n2. Add your Google Sheets OAuth2 credentials and set the correct document ID and sheet names\n3. Add your Groq API credentials to the Groq LLM node\n4. Add Gmail OAuth2 credentials to all three email nodes\n5. Add your Slack API credentials and set the correct channel ID in the Slack node\n6. Adjust the score thresholds in the Switch node to fit your hiring bar\n7. Customize email templates with your company name and tone"
},
"typeVersion": 1
},
{
"id": "000267a2-42d6-4a11-aac7-fff18c16c246",
"name": "Section - Receive and Validate",
"type": "n8n-nodes-base.stickyNote",
"position": [
-224,
-352
],
"parameters": {
"color": 7,
"width": 928,
"height": 848,
"content": "## Step 1: Receive and Validate\n\nThe webhook receives the incoming application payload containing job and candidate data. Fields are structured and enriched with a timestamp. A Google Sheets lookup then checks whether this application ID has been processed before, and an IF node stops duplicate applications from flowing further into the workflow."
},
"typeVersion": 1
},
{
"id": "8930de86-e229-46c1-bfa6-4a6e8204c65a",
"name": "Section - AI Evaluation and Scoring",
"type": "n8n-nodes-base.stickyNote",
"position": [
736,
-352
],
"parameters": {
"color": 7,
"width": 784,
"height": 848,
"content": "## Step 2: AI Evaluation and Scoring\n\nThe AI Agent powered by Groq (llama-3.3-70b) evaluates the candidate against the job requirements using a structured rubric covering skills match, experience, education, and profile quality. The JavaScript node then parses the AI output into clean fields: score, reason, strengths, gaps, and band (Strong, Moderate, or Weak)."
},
"typeVersion": 1
},
{
"id": "0c78c8eb-929b-4dec-bcb6-152500e30373",
"name": "Section - Route, Notify and Log",
"type": "n8n-nodes-base.stickyNote",
"position": [
1536,
-352
],
"parameters": {
"color": 7,
"width": 960,
"height": 848,
"content": "## Step 3: Route, Notify and Log\n\nThe Switch node routes each candidate into one of three tracks based on their score band. Strong candidates (80+) are logged to the shortlist sheet, sent a congratulations email, and trigger a Slack alert to the HR team. Moderate candidates (60-79) are added to a waitlist sheet and receive a holding email. Weak candidates (below 60) receive a polite rejection email. All outcomes are fully automated with no manual HR effort required."
},
"typeVersion": 1
}
],
"connections": {
"Route by Score Band": {
"main": [
[
{
"node": "Log Shortlisted Candidate to Sheet",
"type": "main",
"index": 0
}
],
[
{
"node": "Log Moderate Candidate to Waitlist",
"type": "main",
"index": 0
}
]
]
},
"Score Candidate with AI": {
"main": [
[
{
"node": "Parse Score, Reason, Strengths and Gaps",
"type": "main",
"index": 0
}
]
]
},
"Groq LLM (llama-3.3-70b)": {
"ai_languageModel": [
[
{
"node": "Score Candidate with AI",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Is Duplicate Application?": {
"main": [
[],
[
{
"node": "Score Candidate with AI",
"type": "main",
"index": 0
}
]
]
},
"Send Waitlist Holding Email": {
"main": [
[
{
"node": "Send Rejection Email",
"type": "main",
"index": 0
}
]
]
},
"Check for Duplicate Application": {
"main": [
[
{
"node": "Is Duplicate Application?",
"type": "main",
"index": 0
}
]
]
},
"Receive Application via Webhook": {
"main": [
[
{
"node": "Structure Job and Candidate Data",
"type": "main",
"index": 0
}
]
]
},
"Structure Job and Candidate Data": {
"main": [
[
{
"node": "Check for Duplicate Application",
"type": "main",
"index": 0
}
]
]
},
"Log Moderate Candidate to Waitlist": {
"main": [
[
{
"node": "Send Waitlist Holding Email",
"type": "main",
"index": 0
}
]
]
},
"Log Shortlisted Candidate to Sheet": {
"main": [
[
{
"node": "Send Shortlist Congratulations Email",
"type": "main",
"index": 0
}
]
]
},
"Send Shortlist Congratulations Email": {
"main": [
[
{
"node": "Notify HR Team on Slack",
"type": "main",
"index": 0
}
]
]
},
"Parse Score, Reason, Strengths and Gaps": {
"main": [
[
{
"node": "Route by Score Band",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automates candidate screening by receiving application data via a webhook and structuring it for AI evaluation. An AI agent analyzes the candidate profile and assigns a score with reasoning. The score is extracted and evaluated against a threshold to decide if the…
Source: https://n8n.io/workflows/14772/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Enhance your support, onboarding, and internal knowledge workflows with an intelligent RAG-powered chatbot that responds using live data stored in Google Sheets. 🤖📚 Built for teams that rely on struct
Know that feeling when a "low priority" ticket turns into a production fire? Or when your on-call rotation starts showing signs of serious burnout from alert overload?
🧾 Short Description
This workflow automates payment-related customer support escalation by validating reported issues against transaction data and coordinating all downstream actions in a controlled, auditable way. It is
This workflow automates the resume screening process using AI, enabling faster and more consistent candidate evaluation. It analyzes uploaded resumes, scores candidates based on job fit, and automatic