This workflow corresponds to n8n.io template #10722 — we link there as the canonical source.
This workflow follows the Agent → Emailsend 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": "751d1f9a-b16e-40ac-83f0-88c7fa47792e",
"name": "On form submission",
"type": "n8n-nodes-base.formTrigger",
"position": [
-1456,
208
],
"parameters": {
"options": {
"ignoreBots": true,
"appendAttribution": false
},
"formTitle": "Job Application (HR Digital Consulting)",
"formFields": {
"values": [
{
"fieldLabel": "Full Name",
"placeholder": "Name",
"requiredField": true
},
{
"fieldType": "dropdown",
"fieldLabel": "Application Position",
"fieldOptions": {
"values": [
{
"option": "Accounting"
},
{
"option": "ICT"
},
{
"option": "Customer Care"
},
{
"option": "HR"
}
]
},
"requiredField": true
},
{
"fieldLabel": "Email",
"placeholder": "user@example.com",
"requiredField": true
},
{
"fieldType": "file",
"fieldLabel": "Resume/CV",
"multipleFiles": false,
"requiredField": true,
"acceptFileTypes": ".pdf"
}
]
},
"formDescription": "Fill in all the required details, all attachments must be in pdf format"
},
"typeVersion": 2.3
},
{
"id": "39a56ac4-aacb-4068-80a8-2dfa7106d17b",
"name": "Extract from File",
"type": "n8n-nodes-base.extractFromFile",
"position": [
-576,
-48
],
"parameters": {
"options": {},
"operation": "pdf",
"binaryPropertyName": "=Resume_CV"
},
"typeVersion": 1
},
{
"id": "f5178513-1675-4ad2-b9c7-061922723012",
"name": "Upload file",
"type": "n8n-nodes-base.googleDrive",
"position": [
-192,
-384
],
"parameters": {
"name": "={{ $json['Resume/CV'].filename }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "19ZtGqdSuGKrzWnWVSA8zDnHIln4VeSUh",
"cachedResultUrl": "https://drive.google.com/drive/folders/19ZtGqdSuGKrzWnWVSA8zDnHIln4VeSUh",
"cachedResultName": "Job Pool HR Digital"
},
"inputDataFieldName": "Resume_CV"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "a69042af-61af-4a6c-9fb6-c6369dd61068",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
288,
1136
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.5-pro"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "9689ee83-b677-4a44-a332-264ff46c2ff6",
"name": "Extract from File1",
"type": "n8n-nodes-base.extractFromFile",
"position": [
-592,
320
],
"parameters": {
"options": {},
"operation": "pdf",
"binaryPropertyName": "=Resume_CV"
},
"typeVersion": 1
},
{
"id": "6c2d5ecf-1c2c-46fa-92ba-c6207ea64ce1",
"name": "Extract from File2",
"type": "n8n-nodes-base.extractFromFile",
"position": [
-560,
640
],
"parameters": {
"options": {},
"operation": "pdf",
"binaryPropertyName": "=Resume_CV"
},
"typeVersion": 1
},
{
"id": "8c8ca4a8-d076-45dd-be0f-ceb8f54a8073",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
16,
32
],
"parameters": {
"jsonSchemaExample": "{\n\t\"resume summary\": \"\",\n\t\"Total Score\": \"\"\n}"
},
"typeVersion": 1.3
},
{
"id": "d6de42bf-9c1f-48d2-88c6-540591fb0671",
"name": "Append row in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
448,
112
],
"parameters": {
"columns": {
"value": {
"Email": "={{ $('On form submission').item.json.Email }}",
"Position": "={{ $('On form submission').item.json['Application Position'] }}",
"Sent = 1": "={{ \"\"*1 }}",
"Timestamp": "={{ $now.format('yyyy-MM-dd HH:mm') }}",
"AI Summary": "={{ $json.output['resume summary'] }}",
"HR Comment": "={{ \"\" }}",
"Resume Link": "={{ $('Upload file').item.json.webViewLink }}",
"Resume Score": "={{ $json.output['Total Score'] }}",
"Candidate Name": "={{ $('On form submission').item.json['Full Name'] }}"
},
"schema": [
{
"id": "Timestamp",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Candidate Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Candidate Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Position",
"type": "string",
"display": true,
"required": false,
"displayName": "Position",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "AI Summary",
"type": "string",
"display": true,
"required": false,
"displayName": "AI Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Resume Score",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Resume Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Sent = 1",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Sent = 1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Resume Link",
"type": "string",
"display": true,
"required": false,
"displayName": "Resume Link",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "HR Comment",
"type": "string",
"display": true,
"required": false,
"displayName": "HR Comment",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/YOUR_AWS_SECRET_KEY_HERE-PVmGefaAlwOwR980Jk/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1XbMRGqX6N2xP92ZF73LFd09f-PVmGefaAlwOwR980Jk",
"cachedResultUrl": "https://docs.google.com/YOUR_AWS_SECRET_KEY_HERE-PVmGefaAlwOwR980Jk/edit?usp=drivesdk",
"cachedResultName": "Job pool sheet"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "23fee698-23e3-4030-9050-58cd8c0e2f74",
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
-240,
32
],
"parameters": {
"sessionKey": "={{ $('On form submission').item.json.Email }}",
"sessionIdType": "customKey"
},
"typeVersion": 1.3
},
{
"id": "3b28a33e-e15b-42b5-acc5-d49894dca168",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
224,
112
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3.2
},
{
"id": "719c2bb1-5350-4675-ad65-56f0da200f4b",
"name": "Structured Output Parser1",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-48,
432
],
"parameters": {
"jsonSchemaExample": "{\n\t\"resume summary\": \"\",\n\t\"Total Score\": \"\"\n}"
},
"typeVersion": 1.3
},
{
"id": "86e5a732-c802-4dbc-9e34-80f3a5fa5fb6",
"name": "Structured Output Parser2",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-128,
864
],
"parameters": {
"jsonSchemaExample": "{\n\t\"resume summary\": \"\",\n\t\"Total Score\": \"\"\n}"
},
"typeVersion": 1.3
},
{
"id": "ceb7f29a-0504-44b7-8bc8-89d1e0562ec0",
"name": "ICT Analysis",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-256,
-192
],
"parameters": {
"text": "={{ $json.text }}",
"options": {
"systemMessage": "You are an ICT CV analyst. Input: raw resume/CV text. Task: extract key details and evaluate fit for an ICT position. REQUIRED checks:\n- Look for candidate name, contact info, relevant education, relevant certifications, technical skills, and work experience duration.\n- Candidate must have at least 2 years of relevant work experience to score well.\n- Give more weight to relevant degrees/certifications and demonstrated technical skills (languages, frameworks, tools, cloud, networking, security, automation).\n- If information is missing, note it in the summary and lower the score.\n\nOUTPUT RULES (strict):\n- Reply ONLY with valid JSON and nothing else.\n- JSON schema:\n {\n \"resume summary\": \"<short, 1-3 sentences highlighting strengths, gaps, and key facts>\",\n \"Score\": <integer 1-10>\n }\n- \"resume summary\": max 150 words.\n- \"Score\": integer between 1 (poor fit/missing essentials) and 10 (excellent fit). Give 1 if almost nothing relevant is found.\n- Ensure no trailing text outside the JSON.\n\nMake a concise, evidence-based judgement using the text provided.\n\nIf the candindate has online project/profile link use \"Web search\" tool to review project details"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "8d8aa4fd-9f6d-4037-8bbc-0461b8cdc72e",
"name": "Customer Care Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-256,
208
],
"parameters": {
"text": "={{ $json.text }}",
"options": {
"systemMessage": "You are a Customer Care Resume Analyst. Input: raw resume/CV text. Task: evaluate suitability for a customer service or customer experience position.\n\nREQUIRED CHECKS:\n- Candidate must have at least 2 years of relevant customer-facing experience (customer care, call center, support, or client relations).\n- Look for strong communication, empathy, problem-solving, CRM software experience (e.g., Zendesk, Salesforce, Freshdesk), and ability to handle high-volume interactions.\n- Education: At least a diploma or degree in business, communication, marketing, or a related field preferred.\n- Look for evidence of achievements such as improved satisfaction scores, reduced response times, or process improvements.\n- Extra points for multilingual skills, teamwork, and customer retention initiatives.\n\nSCORING CRITERIA:\n- 9\u201310: Meets all requirements with clear achievements and relevant tools/skills.\n- 6\u20138: Meets most criteria, minor gaps.\n- 3\u20135: Limited experience or vague achievements.\n- 1\u20132: Little or no relevant experience.\n\nOUTPUT RULES (strict):\n- Respond ONLY in valid JSON, no extra text or commentary.\n- JSON schema:\n {\n \"resume summary\": \"<1\u20133 concise sentences summarizing key strengths, achievements, and any gaps>\",\n \"Score\": <integer 1\u201310>\n }\n- Summary max 150 words.\n- Penalize missing customer care experience or unclear achievements.\n\nExample output:\n{\n \"resume summary\": \"Customer service professional with 3 years in call center operations, skilled in Zendesk and CRM ticketing. Improved customer satisfaction scores by 25% and consistently exceeded response-time targets. Strong communication and conflict-resolution abilities.\",\n \"Score\": 9\n}\n"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "821d0a63-6946-4094-a906-08f117c10763",
"name": "Accountant",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-320,
672
],
"parameters": {
"text": "={{ $json.text }}",
"options": {
"systemMessage": "You are an Accountant Resume Analyst. Input: raw resume/CV text. Task: evaluate suitability for an accounting position. REQUIRED checks:\n- Candidate must hold a degree in Accounting, Finance, or a related field.\n- Must have at least 2 years of relevant accounting or finance experience.\n- Must possess CPA certification or equivalent recognition from a professional accounting body.\n- Identify and highlight measurable achievements (e.g., audit success, cost savings, financial reporting improvements, ERP implementation).\n- Consider clarity, professional tone, and completeness of financial skills (e.g., QuickBooks, SAP, Excel, tax filing, auditing, reconciliation).\n\nSCORING CRITERIA:\n- 9\u201310: Meets all requirements with strong achievements and certifications.\n- 6\u20138: Meets most requirements, minor gaps or unclear results.\n- 3\u20135: Partial fit or missing certification/experience.\n- 1\u20132: Poor fit or unrelated background.\n\nOUTPUT RULES (strict):\n- Respond ONLY in valid JSON, no extra text.\n- JSON schema:\n {\n \"resume summary\": \"<1\u20133 concise sentences summarizing strengths, achievements, and gaps>\",\n \"Score\": <integer 1\u201310>\n }\n- Max 150 words for summary.\n- Penalize missing certification or less than 2 years\u2019 experience.\n\nExample output:\n{\n \"resume summary\": \"Certified Public Accountant with 4 years in financial reporting and tax compliance. Holds a B.Com in Accounting and implemented a cost-tracking system that reduced audit discrepancies by 20%. Excellent fit for senior accounting roles.\",\n \"Score\": 9\n}\n"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "21ecb5cc-7552-40d0-81fc-9b79d9315a16",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
208,
-64
],
"parameters": {
"content": "Option 1 (Technical):\n\"Merges resume upload & AI analysis into 1 record. Use 'Merge By Position' in n8n to combine Google Drive URL + agent scores before updating Google Sheets CRM.\"\nOption 2 (Simple):\n\"Combines resume file link & AI score into single row. Fix: Change merge mode to 'By Position' to get 1 item instead of 2 before Google Sheets update.\"\nOption 3 (Action-focused):\n\"Resume submission \u2192 Upload to Drive + AI analysis \u2192 Merge outputs \u2192 Save to Sheets. Set merge mode: 'By Position' to combine data into one record.\"\nPick the one that matches your note-taking style!"
},
"typeVersion": 1
},
{
"id": "fa72d55c-57c3-4298-bfbd-872e4be632a5",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1104,
-240
],
"parameters": {
"color": 6,
"width": 320,
"height": 256,
"content": "This is a workflow that automate Recruitment process. Unlike traditional ATS where candidates are matched by keywords, this agent analyses the candindates resume indepth, relevant, certifications, and even searches the internet on the mentioned projects and companies "
},
"typeVersion": 1
},
{
"id": "479e0929-5d56-42a1-b699-3e4f81f6666c",
"name": "No Operation, do nothing",
"type": "n8n-nodes-base.noOp",
"position": [
-848,
-864
],
"parameters": {},
"typeVersion": 1
},
{
"id": "4ac39c0c-5f6e-41f2-9212-5df59476625d",
"name": "Send email",
"type": "n8n-nodes-base.emailSend",
"position": [
-592,
-816
],
"parameters": {
"text": "Congratulation you have been accepted for interview\nPlease Come prepared \n10 Oct 2025",
"options": {
"appendAttribution": false
},
"subject": "Invitation for interview",
"toEmail": "={{ $json.Email }}",
"fromEmail": "user@example.com",
"emailFormat": "text"
},
"credentials": {
"smtp": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "60924b5b-c6b1-4e21-b592-3a8051af415d",
"name": "Google Sheets Trigger",
"type": "n8n-nodes-base.googleSheetsTrigger",
"position": [
-1456,
-704
],
"parameters": {
"event": "rowAdded",
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/YOUR_AWS_SECRET_KEY_HERE-PVmGefaAlwOwR980Jk/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1XbMRGqX6N2xP92ZF73LFd09f-PVmGefaAlwOwR980Jk",
"cachedResultUrl": "https://docs.google.com/YOUR_AWS_SECRET_KEY_HERE-PVmGefaAlwOwR980Jk/edit?usp=drivesdk",
"cachedResultName": "Job pool sheet HR"
}
},
"credentials": {
"googleSheetsTriggerOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "5c5ff85c-204b-4329-bfdc-80852d9c8e4d",
"name": "Rejection mail",
"type": "n8n-nodes-base.emailSend",
"position": [
-592,
-576
],
"parameters": {
"text": "Unfortunaly we couldn't proceed with you",
"options": {},
"subject": "Invitation for interview",
"toEmail": "={{ $json.Email }}",
"fromEmail": "user@example.com",
"emailFormat": "text"
},
"credentials": {
"smtp": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "50211e21-7f65-4047-9236-2ddebcaa155f",
"name": "Update row in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
-336,
-832
],
"parameters": {
"columns": {
"value": {
"Email": "={{ $('Google Sheets Trigger').item.json.Email }}",
"Position": "={{ $('Google Sheets Trigger').item.json.Position }}",
"Sent = 1": "1",
"Timestamp": "={{ $('Google Sheets Trigger').item.json.Timestamp }}",
"AI Summary": "={{ $('Google Sheets Trigger').item.json['AI Summary'] }}",
"HR Comment": "={{ $('Google Sheets Trigger').item.json['HR Comment'] }}",
"Resume Link": "={{ $('Google Sheets Trigger').item.json['Resume Link'] }}",
"Resume Score": "={{ $('Google Sheets Trigger').item.json['Resume Score'] }}",
"Candidate Name": "={{ $('Google Sheets Trigger').item.json['Candidate Name'] }}"
},
"schema": [
{
"id": "Timestamp",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Candidate Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Candidate Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Position",
"type": "string",
"display": true,
"required": false,
"displayName": "Position",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "AI Summary",
"type": "string",
"display": true,
"required": false,
"displayName": "AI Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Resume Score",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Resume Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Sent = 1",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Sent = 1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Resume Link",
"type": "string",
"display": true,
"required": false,
"displayName": "Resume Link",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "HR Comment",
"type": "string",
"display": true,
"required": false,
"displayName": "HR Comment",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Timestamp"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/YOUR_AWS_SECRET_KEY_HERE-PVmGefaAlwOwR980Jk/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1XbMRGqX6N2xP92ZF73LFd09f-PVmGefaAlwOwR980Jk",
"cachedResultUrl": "https://docs.google.com/YOUR_AWS_SECRET_KEY_HERE-PVmGefaAlwOwR980Jk/edit?usp=drivesdk",
"cachedResultName": "Job pool sheet"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "c13787e3-a000-4621-90c8-5baf5d41579f",
"name": "Update row in sheet1",
"type": "n8n-nodes-base.googleSheets",
"position": [
-352,
-560
],
"parameters": {
"columns": {
"value": {
"Email": "={{ $('Google Sheets Trigger').item.json.Email }}",
"Position": "={{ $('Google Sheets Trigger').item.json.Position }}",
"Sent = 1": "1",
"Timestamp": "={{ $('Google Sheets Trigger').item.json.Timestamp }}",
"AI Summary": "={{ $('Google Sheets Trigger').item.json['AI Summary'] }}",
"HR Comment": "={{ $('Google Sheets Trigger').item.json['HR Comment'] }}",
"Resume Link": "={{ $('Google Sheets Trigger').item.json['Resume Link'] }}",
"Resume Score": "={{ $('Google Sheets Trigger').item.json['Resume Score'] }}",
"Candidate Name": "={{ $('Google Sheets Trigger').item.json['Candidate Name'] }}"
},
"schema": [
{
"id": "Timestamp",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Candidate Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Candidate Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Position",
"type": "string",
"display": true,
"required": false,
"displayName": "Position",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "AI Summary",
"type": "string",
"display": true,
"required": false,
"displayName": "AI Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Resume Score",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Resume Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Sent = 1",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Sent = 1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Resume Link",
"type": "string",
"display": true,
"required": false,
"displayName": "Resume Link",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "HR Comment",
"type": "string",
"display": true,
"required": false,
"displayName": "HR Comment",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Timestamp"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/YOUR_AWS_SECRET_KEY_HERE-PVmGefaAlwOwR980Jk/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1XbMRGqX6N2xP92ZF73LFd09f-PVmGefaAlwOwR980Jk",
"cachedResultUrl": "https://docs.google.com/YOUR_AWS_SECRET_KEY_HERE-PVmGefaAlwOwR980Jk/edit?usp=drivesdk",
"cachedResultName": "Job pool sheet"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "a22c87c9-c5b8-4b36-b228-3539ad2d1b31",
"name": "Structured Output Parser3",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-176,
1344
],
"parameters": {
"jsonSchemaExample": "{\n\t\"resume summary\": \"\",\n\t\"Total Score\": \"\"\n}"
},
"typeVersion": 1.3
},
{
"id": "219c6d67-c114-4d2b-bf31-63316f695f86",
"name": "Simple Memory1",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
-432,
1344
],
"parameters": {
"sessionKey": "={{ $('On form submission').item.json.Email }}",
"sessionIdType": "customKey"
},
"typeVersion": 1.3
},
{
"id": "98bfe483-e1a9-4d6e-8a99-76e9724d658d",
"name": "HR Analysis",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-448,
1120
],
"parameters": {
"text": "={{ $json.text }}",
"options": {
"systemMessage": "# HR Resume Analysis Agent - System Prompt\n\nYou are an expert HR Resume Analysis Agent with 15+ years of experience in talent acquisition and candidate evaluation. Your role is to conduct rigorous, objective assessments of candidate resumes against job requirements.\n\n## Your Analysis Framework\n\n**1. Experience Evaluation (Weight: 35%)**\n- Total years of relevant work experience\n- Progression and career growth trajectory\n- Leadership and management experience\n- Industry-specific experience\n- Gap analysis (career breaks, job-hopping patterns)\n\n**2. Technical Competency Assessment (Weight: 30%)**\n- Core technical skills alignment with job requirements\n- Certifications and professional credentials\n- Tool and platform proficiency\n- Hands-on project experience\n- Technology stack diversity and depth\n\n**3. Educational Background (Weight: 15%)**\n- Degree level and field of study relevance\n- Institution reputation (if discernible)\n- Academic achievements and honors\n- Continuous learning indicators (courses, training)\n\n**4. Soft Skills & Leadership Indicators (Weight: 15%)**\n- Communication abilities (presentations, publications, training roles)\n- Team leadership and people management\n- Problem-solving evidence (achievements, quantified results)\n- Strategic thinking (process improvements, innovations)\n- Cross-functional collaboration\n\n**5. Professional Development & Engagement (Weight: 5%)**\n- Professional body memberships\n- Conference attendance or speaking engagements\n- Community contributions (open source, mentoring)\n- Industry certifications maintenance\n\n## Scoring Methodology\n\n**10/10 - Exceptional Match**\nExceeds all requirements significantly. 10+ years experience, advanced certifications, proven leadership, strong technical depth, measurable achievements, active professional engagement.\n\n**8-9/10 - Strong Match**\nMeets or exceeds most requirements. 7-10 years experience, relevant certifications, demonstrated leadership, solid technical skills, clear career progression.\n\n**6-7/10 - Good Match**\nMeets core requirements with minor gaps. 5-7 years experience, some certifications, technical competency evident, potential for growth.\n\n**4-5/10 - Marginal Match**\nMeets some requirements but has notable gaps. 3-5 years experience, limited certifications, basic technical skills, requires significant development.\n\n**1-3/10 - Poor Match**\nSignificant misalignment with requirements. Insufficient experience, lacking key technical skills or education, major qualification gaps.\n\n## Analysis Instructions\n\n1. **Read thoroughly**: Extract all relevant details from the resume\n2. **Cross-reference**: Compare against the provided job requirements\n3. **Quantify**: Identify specific metrics (years, numbers, percentages)\n4. **Flag gaps**: Note missing qualifications or experience\n5. **Highlight strengths**: Identify standout achievements and qualifications\n6. **Be objective**: Base assessment on evidence, not assumptions\n7. **Consider context**: Account for career transitions or non-traditional paths\n\n## Red Flags to Note\n- Frequent job changes (>4 jobs in 5 years without clear progression)\n- Unexplained employment gaps (>6 months)\n- Lack of progression over time\n- Misalignment between job titles and described responsibilities\n- Missing critical technical skills for the role\n- No evidence of continued learning or professional development\n\n## Green Flags to Highlight\n- Consistent career progression with increasing responsibility\n- Relevant certifications obtained recently\n- Quantified achievements (cost savings, efficiency gains, team size)\n- Leadership in professional organizations\n- Speaking engagements or publications\n- Cross-functional project leadership\n- Technology migration or transformation experience\n\n## Output Format\n\nReturn ONLY valid JSON in the following structure:\n- If information is missing, note it in the summary and lower the score.\n\nOUTPUT RULES (strict):\n- Reply ONLY with valid JSON and nothing else.\n- JSON schema:\n {\n \"resume summary\": \"<short, 1-3 sentences highlighting strengths, gaps, and key facts>\",\n \"Score\": <integer 1-10>\n }\n- \"resume summary\": max 150 words.\n-Use plain texts, no bold, italics, esterics nor other fancy symbols"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.2
},
{
"id": "b61f5f0a-92e2-4f26-9b1c-0af1d1eb38f0",
"name": "Extract from File3",
"type": "n8n-nodes-base.extractFromFile",
"position": [
-656,
880
],
"parameters": {
"options": {},
"operation": "pdf",
"binaryPropertyName": "=Resume_CV"
},
"typeVersion": 1
},
{
"id": "55beb023-baa9-44bf-b663-e6ca311fd6e5",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1808,
-736
],
"parameters": {
"color": 5,
"width": 336,
"height": 304,
"content": "## Update CRM\nOnce applications have been received this automation updates the CRM and sends the email to candidates. Those who have a score of above 7 get an invite for interview, while those who scored 6 and below gets a rejection email. ## These values can be adjusted appropriately"
},
"typeVersion": 1
},
{
"id": "36841d58-fb29-467e-afca-72fe009344d4",
"name": "If the application is sent",
"type": "n8n-nodes-base.if",
"position": [
-1136,
-704
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "91a630d2-142f-473d-9d02-43694c8896e0",
"operator": {
"type": "number",
"operation": "equals"
},
"leftValue": "={{ Number($json['Sent = 1']) }}",
"rightValue": 1
}
]
}
},
"typeVersion": 2.2
},
{
"id": "1d80bb4c-e23e-42c6-8284-2cb284ded1ab",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1200,
-576
],
"parameters": {
"width": 192,
"height": 144,
"content": "this node prevents sending repeated emails. emails that had already been sent are filtered out"
},
"typeVersion": 1
},
{
"id": "f0bf576e-4400-49cd-a0e9-9a47bfe5c244",
"name": "Filters based on the score",
"type": "n8n-nodes-base.if",
"position": [
-880,
-656
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "91a630d2-142f-473d-9d02-43694c8896e0",
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{Number($json['Resume Score']) }}",
"rightValue": 5
}
]
}
},
"typeVersion": 2.2
},
{
"id": "c51bdbdf-648f-4814-b625-908c073cb7b3",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-896,
-512
],
"parameters": {
"content": "Candidates with higher score get invitation letter while those with low score gets rejection letter"
},
"typeVersion": 1
},
{
"id": "90f51112-8f76-46ef-91a9-5c2b02d1c9af",
"name": "Switch based on position",
"type": "n8n-nodes-base.switch",
"position": [
-832,
320
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "ICT",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "2b16a98b-41d4-4294-a13b-7063d3455e37",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $('On form submission').item.json['Application Position'] }}",
"rightValue": "={{ \"ICT\" }}"
}
]
},
"renameOutput": true
},
{
"outputKey": "Customer Care",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "b2674281-18bd-4a42-87f1-0ca19b8d0cff",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $('On form submission').item.json['Application Position'] }}",
"rightValue": "{{\"Customer Care\"}}"
}
]
},
"renameOutput": true
},
{
"outputKey": "Accounting",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "6de38972-7f4f-40ee-a374-e6b137d84d15",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $('On form submission').item.json['Application Position'] }}",
"rightValue": "{{\"Accounting\"}}"
}
]
},
"renameOutput": true
},
{
"outputKey": "HR",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "9aab7533-0a34-48cc-a6ac-c42666f0464b",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $('On form submission').item.json['Application Position'] }}",
"rightValue": "={{\"HR\"}}"
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.3
},
{
"id": "e1421839-213e-4b9b-9ed4-44eaefaa9296",
"name": "Searches the internet",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
304,
816
],
"parameters": {
"url": "https://api.tavily.com/search",
"method": "POST",
"options": {},
"sendBody": true,
"sendHeaders": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "query"
}
]
},
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "e9a81ab8-d092-48d6-b83a-482d2ef3b560",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-112,
-448
],
"parameters": {
"width": 352,
"height": 352,
"content": "Candidates resume gets uploaded to google drive for later review"
},
"typeVersion": 1
},
{
"id": "3faada68-8e63-4078-a371-aabf91aa4e85",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2192,
-16
],
"parameters": {
"color": 3,
"width": 448,
"height": 848,
"content": "## \ud83d\udccb Workflow Summary\nPurpose: Automated AI-powered resume screening system that replaces keyword-based ATS with intelligent analysis.\nProcess Flow:\n\nCandidate submits application form \u2192 Resume saved to Google Drive\nSwitch node routes application by position (ICT/Customer Care/Accounting/HR)\nPDF text extraction \u2192 Position-specific AI agent analyzes resume\nAI scores candidate (1-10 scale) with detailed comments\nAll data merged and logged to Google Sheets CRM\nAutomated emails sent: 7-10 = Interview invite | <7 = Rejection\n\nKey Advantage: AI understands context and qualifications, not just keywords. HR can close applications anytime without manual screening.\nConfiguration Needed:\n\nGoogle Drive & Sheets credentials\nAI provider API keys\nEmail service setup\nCustomize AI prompts per position (see agent nodes)"
},
"typeVersion": 1
}
],
"connections": {
"Merge": {
"main": [
[
{
"node": "Append row in sheet",
"type": "main",
"index": 0
}
]
]
},
"Accountant": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Send email": {
"main": [
[
{
"node": "Update row in sheet",
"type": "main",
"index": 0
}
]
]
},
"HR Analysis": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Upload file": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"ICT Analysis": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "ICT Analysis",
"type": "ai_memory",
"index": 0
}
]
]
},
"Rejection mail": {
"main": [
[
{
"node": "Update row in sheet1",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory1": {
"ai_memory": [
[
{
"node": "HR Analysis",
"type": "ai_memory",
"index": 0
}
]
]
},
"Extract from File": {
"main": [
[
{
"node": "ICT Analysis",
"type": "main",
"index": 0
}
]
]
},
"Extract from File1": {
"main": [
[
{
"node": "Customer Care Agent",
"type": "main",
"index": 0
}
]
]
},
"Extract from File2": {
"main": [
[
{
"node": "Accountant",
"type": "main",
"index": 0
}
]
]
},
"Extract from File3": {
"main": [
[
{
"node": "HR Analysis",
"type": "main",
"index": 0
}
]
]
},
"On form submission": {
"main": [
[
{
"node": "Switch based on position",
"type": "main",
"index": 0
},
{
"node": "Upload file",
"type": "main",
"index": 0
}
]
]
},
"Customer Care Agent": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Google Sheets Trigger": {
"main": [
[
{
"node": "If the application is sent",
"type": "main",
"index": 0
}
]
]
},
"Searches the internet": {
"ai_tool": [
[
{
"node": "ICT Analysis",
"type": "ai_tool",
"index": 0
},
{
"node": "Customer Care Agent",
"type": "ai_tool",
"index": 0
},
{
"node": "Accountant",
"type": "ai_tool",
"index": 0
},
{
"node": "HR Analysis",
"type": "ai_tool",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "ICT Analysis",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Customer Care Agent",
"type": "ai_languageModel",
"index": 0
},
{
"node": "Accountant",
"type": "ai_languageModel",
"index": 0
},
{
"node": "HR Analysis",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "ICT Analysis",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Switch based on position": {
"main": [
[
{
"node": "Extract from File",
"type": "main",
"index": 0
}
],
[
{
"node": "Extract from File1",
"type": "main",
"index": 0
}
],
[
{
"node": "Extract from File2",
"type": "main",
"index": 0
}
],
[
{
"node": "Extract from File3",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser1": {
"ai_outputParser": [
[
{
"node": "Customer Care Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Structured Output Parser2": {
"ai_outputParser": [
[
{
"node": "Accountant",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Structured Output Parser3": {
"ai_outputParser": [
[
{
"node": "HR Analysis",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Filters based on the score": {
"main": [
[
{
"node": "Send email",
"type": "main",
"index": 0
}
],
[
{
"node": "Rejection mail",
"type": "main",
"index": 0
}
]
]
},
"If the application is sent": {
"main": [
[
{
"node": "No Operation, do nothing",
"type": "main",
"index": 0
}
],
[
{
"node": "Filters based on the score",
"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.
googleDriveOAuth2ApigooglePalmApigoogleSheetsOAuth2ApigoogleSheetsTriggerOAuth2ApihttpHeaderAuthsmtp
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Streamline your recruitment process with AI-powered resume analysis that goes beyond keyword matching.
Source: https://n8n.io/workflows/10722/ — 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.
How it Works
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.
This end-to-end AI-powered recruitment automation workflow helps HR and talent acquisition teams automate the complete hiring pipeline—from resume intake and parsing to GPT-4-based evaluation, TA appr
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
Categories: Business Automation, Content Creation, SEO, AI