This workflow corresponds to n8n.io template #8531 — we link there as the canonical source.
This workflow follows the Agent → Google Drive 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 →
{
"id": "7Pytou63ro4Ht10d",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "JD match score",
"tags": [],
"nodes": [
{
"id": "b30ed071-9118-4b6c-9645-7f675c7f003a",
"name": "When clicking \u2018Execute workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-432,
-112
],
"parameters": {},
"typeVersion": 1
},
{
"id": "f9c22328-7675-4161-a984-a7704ad41e05",
"name": "Download file",
"type": "n8n-nodes-base.googleDrive",
"position": [
16,
-112
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "7f63f5cf-8b71-4235-9a38-5fe3b2d01467",
"name": "Extract from File",
"type": "n8n-nodes-base.extractFromFile",
"position": [
240,
-112
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "73d898cf-26f3-468a-adc1-bd18589bea19",
"name": "Download file1",
"type": "n8n-nodes-base.googleDrive",
"position": [
688,
-112
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "7ec0bfc6-497e-4121-bb5a-420067a9d63a",
"name": "Extract from File1",
"type": "n8n-nodes-base.extractFromFile",
"position": [
912,
-112
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "4958145c-c824-4606-b483-bad0f7a0ef4d",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1136,
-112
],
"parameters": {
"text": "=Compare the following job description and resume, then score and evaluate according to the instructions.\n\nJob Description (JD):\n{{ $('Extract from File').item.json.text }}\n\nCandidate Resume:\n{{ $json.text }}\n\nReturn the evaluation in the required JSON format.",
"options": {
"systemMessage": "You are an AI resume evaluator.\nYour task is to compare a candidate\u2019s resume against a provided job description and return a structured JSON evaluation.\nFollow these rules:\n\nEvaluate alignment between the job description (JD) and the resume.\n\nAssign a score (0\u2013100) where:\n\n90\u2013100 = Excellent fit\n\n70\u201389 = Good fit with some gaps\n\n50\u201369 = Moderate fit with significant gaps\n\nBelow 50 = Poor fit\n\nIdentify must_have_gaps \u2192 missing critical skills, experience, or qualifications explicitly required in the JD.\n\nIdentify nice_to_have_bonus \u2192 additional desirable skills, certifications, or achievements mentioned in the JD but not mandatory.\n\nProvide a summary (3\u20135 sentences) describing the overall fit and candidate potential.\n\nAlways return output in the following JSON format (no extra text, no markdown):"
},
"promptType": "define"
},
"typeVersion": 2.1
},
{
"id": "2c36bdc0-ec36-4b8c-bd1e-54e40fdb87a1",
"name": "Azure OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
"position": [
1232,
112
],
"parameters": {
"model": "gpt-4o-mini",
"options": {}
},
"credentials": {
"azureOpenAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "4cf138e8-9c52-4f5e-89cf-67e1d6b49f14",
"name": "Search JD",
"type": "n8n-nodes-base.googleDrive",
"position": [
-208,
-112
],
"parameters": {
"filter": {
"folderId": {
"__rl": true,
"mode": "list",
"value": "1KnopVQ7CIdUl5j9ICwijk1RG5w7050nW",
"cachedResultUrl": "https://drive.google.com/drive/folders/1KnopVQ7CIdUl5j9ICwijk1RG5w7050nW",
"cachedResultName": "JD store"
}
},
"options": {},
"resource": "fileFolder",
"returnAll": true
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "22daae51-9cb8-4584-8e1a-e8abcea3369f",
"name": "Search Resume",
"type": "n8n-nodes-base.googleDrive",
"position": [
464,
-112
],
"parameters": {
"filter": {
"folderId": {
"__rl": true,
"mode": "list",
"value": "1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
"cachedResultUrl": "https://drive.google.com/drive/folders/1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
"cachedResultName": "Resume_store"
}
},
"options": {},
"resource": "fileFolder",
"returnAll": true
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "274e9346-1bbc-413b-8a29-0ba32a37f7df",
"name": "Code",
"type": "n8n-nodes-base.code",
"position": [
1536,
-112
],
"parameters": {
"jsCode": "return items.map(item => {\n let text = item.json.output;\n\n // Remove code fences like ```json ... ```\n text = text.replace(/```json|```/g, \"\").trim();\n\n let parsed = {};\n try {\n parsed = JSON.parse(text);\n } catch (err) {\n parsed = { error: \"Failed to parse JSON\", raw: text };\n }\n\n return { json: parsed };\n});"
},
"typeVersion": 2
},
{
"id": "e812463c-3796-4f43-9586-efbbf04f1930",
"name": "Create file from text",
"type": "n8n-nodes-base.googleDrive",
"position": [
1760,
-112
],
"parameters": {
"name": "={{ $('Search Resume').item.json.name }}_result-summary",
"content": "=Score: {{ $json.score }}\nmust have gaps: {{ $json.must_have_gaps }}\nnice to have bonus: {{ $json.nice_to_have_bonus }}\nsummary: {{ $json.summary }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
"cachedResultUrl": "https://drive.google.com/drive/folders/1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
"cachedResultName": "Resume_store"
},
"operation": "createFromText"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "6403b230-16ca-4e09-83e4-eadfe14d0fb2",
"name": "Append or update row in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1984,
-112
],
"parameters": {
"columns": {
"value": {
"Name": "John Doe",
"Score": "={{ $('Code').item.json.score }}",
"Summary": "={{ $('Code').item.json.summary }}"
},
"schema": [
{
"id": "Name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Phone ",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Phone ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Years of experience",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Years of experience",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "skills",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "skills",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "curent role",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "curent role",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "education",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "education",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Score",
"type": "string",
"display": true,
"required": false,
"displayName": "Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Summary",
"type": "string",
"display": true,
"required": false,
"displayName": "Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Name"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1424038785,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1JlXxy90s0we_IqErHyvomrJSijb8pd4H91hOUCH6xCA/edit#gid=1424038785",
"cachedResultName": "Sheet2"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1JlXxy90s0we_IqErHyvomrJSijb8pd4H91hOUCH6xCA",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1JlXxy90s0we_IqErHyvomrJSijb8pd4H91hOUCH6xCA/edit?usp=drivesdk",
"cachedResultName": "Resume store"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "156e51d2-5eb1-4db4-a108-58845354ef06",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1024,
-528
],
"parameters": {
"width": 464,
"height": 1104,
"content": "## JD Match Score Workflow\n**Purpose:** Compares candidate resumes against job descriptions and calculates compatibility scores.\n\n**Node Descriptions:**\n\n**Manual Trigger**\nInitiates the job description matching process\nUsed for resume evaluation against specific roles\n\n**Search JD (Google Drive)**\nSearches for job description files in designated Google Drive folder\nRetrieves JD documents for comparison\n\n**Download File (JD)**\nDownloads job description PDF files from Google Drive\nPrepares files for content extraction\n\n**Extract from File (JD)**\nExtracts text content from job description PDFs\nConverts documents to readable text format\n\n**Search Resume (Google Drive)**\nLocates candidate resume files in resume storage folder\nRetrieves resume documents for analysis\n\n**Download File (Resume)**\nDownloads candidate resume PDF files\nPrepares resume files for processing\n\n**Extract from File (Resume)**\nExtracts text content from resume PDFs\nConverts resume documents to analyzable text\n\n**AI Agent**\nCompares job description against candidate resume using Azure OpenAI\nEvaluates alignment and compatibility (0-100 score)\nIdentifies must-have gaps and nice-to-have bonuses\nGenerates detailed summary of candidate fit\n\n**Code Node**\nParses AI evaluation results into structured JSON\nHandles JSON parsing and error management\nCleans evaluation output for database storage\n\n**Create File from Text**\nGenerates evaluation summary reports\nSaves detailed results as text files in Google Drive\nCreates audit trail of evaluations\n\n**Append or Update Row in Sheet**\nUpdates candidate database with JD match scores\nStores evaluation summaries and scores\nMaintains comprehensive candidate profiles"
},
"typeVersion": 1
},
{
"id": "fbba0640-0175-437d-9760-cdbbdcc75ef8",
"name": "Download Job Description PDF",
"type": "n8n-nodes-base.googleDrive",
"position": [
2032,
1584
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "27e2a0af-070e-424a-beef-864ac39eae1a",
"name": "Extract JD Text Content",
"type": "n8n-nodes-base.extractFromFile",
"position": [
2256,
1584
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "451af1bb-e02f-4964-afb2-6d7793954ec8",
"name": "Download Candidate Resume PDF",
"type": "n8n-nodes-base.googleDrive",
"position": [
2704,
1584
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "7f27b30a-b264-48a9-b42f-54ebca30becc",
"name": "Extract Resume Text Content",
"type": "n8n-nodes-base.extractFromFile",
"position": [
2928,
1584
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "db811ef4-01ad-4c2f-95f8-5513af29fa57",
"name": "AI Resume Evaluator Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
3152,
1584
],
"parameters": {
"text": "=Compare the following job description and resume, then score and evaluate according to the instructions.\n\nJob Description (JD):\n{{ $('Extract JD Text Content').item.json.text }}\n\nCandidate Resume:\n{{ $json.text }}\n\nReturn the evaluation in the required JSON format.",
"options": {
"systemMessage": "You are an AI resume evaluator.\nYour task is to compare a candidate's resume against a provided job description and return a structured JSON evaluation.\nFollow these rules:\n\nEvaluate alignment between the job description (JD) and the resume.\n\nAssign a score (0\u2013100) where:\n\n90\u2013100 = Excellent fit\n\n70\u201389 = Good fit with some gaps\n\n50\u201369 = Moderate fit with significant gaps\n\nBelow 50 = Poor fit\n\nIdentify must_have_gaps \u2192 missing critical skills, experience, or qualifications explicitly required in the JD.\n\nIdentify nice_to_have_bonus \u2192 additional desirable skills, certifications, or achievements mentioned in the JD but not mandatory.\n\nProvide a summary (3\u20135 sentences) describing the overall fit and candidate potential.\n\nAlways return output in the following JSON format (no extra text, no markdown):"
},
"promptType": "define"
},
"typeVersion": 2.1
},
{
"id": "ca6036ea-5fb9-4ca2-aa02-ef53dd890bec",
"name": "Azure OpenAI GPT-4 Model",
"type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
"position": [
3248,
1808
],
"parameters": {
"model": "gpt-4o-mini",
"options": {}
},
"credentials": {
"azureOpenAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "92b8dec7-6906-40fc-978a-864a2b3c693a",
"name": "Find Job Descriptions in Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
1808,
1584
],
"parameters": {
"filter": {
"folderId": {
"__rl": true,
"mode": "list",
"value": "1KnopVQ7CIdUl5j9ICwijk1RG5w7050nW",
"cachedResultUrl": "https://drive.google.com/drive/folders/1KnopVQ7CIdUl5j9ICwijk1RG5w7050nW",
"cachedResultName": "JD store"
}
},
"options": {},
"resource": "fileFolder",
"returnAll": true
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "ab51acb4-d1b4-456b-8570-e792678a0fdf",
"name": "Find Candidate Resumes in Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
2480,
1584
],
"parameters": {
"filter": {
"folderId": {
"__rl": true,
"mode": "list",
"value": "1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
"cachedResultUrl": "https://drive.google.com/drive/folders/1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
"cachedResultName": "Resume_store"
}
},
"options": {},
"resource": "fileFolder",
"returnAll": true
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "1ea350f8-a3f2-4570-ac74-21cea7088082",
"name": "Parse AI Response to JSON",
"type": "n8n-nodes-base.code",
"position": [
3552,
1584
],
"parameters": {
"jsCode": "return items.map(item => {\n let text = item.json.output;\n\n // Remove code fences like ```json ... ```\n text = text.replace(/```json|```/g, \"\").trim();\n\n let parsed = {};\n try {\n parsed = JSON.parse(text);\n } catch (err) {\n parsed = { error: \"Failed to parse JSON\", raw: text };\n }\n\n return { json: parsed };\n});"
},
"typeVersion": 2
},
{
"id": "96787a98-f91a-40a1-89b9-baceff8249ee",
"name": "Save Evaluation Report to Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
3776,
1584
],
"parameters": {
"name": "={{ $('Find Candidate Resumes in Drive').item.json.name }}_result-summary",
"content": "=Score: {{ $json.score }}\nmust have gaps: {{ $json.must_have_gaps }}\nnice to have bonus: {{ $json.nice_to_have_bonus }}\nsummary: {{ $json.summary }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
"cachedResultUrl": "https://drive.google.com/drive/folders/1MIvpHU_ZqG76Vov2-D5WlS5dD3UhOMSz",
"cachedResultName": "Resume_store"
},
"operation": "createFromText"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "dc9cb8cc-34f6-4ce2-ae33-d929126a7370",
"name": "Update Candidate Database",
"type": "n8n-nodes-base.googleSheets",
"position": [
4000,
1584
],
"parameters": {
"columns": {
"value": {
"Name": "John Doe",
"Score": "={{ $('Parse AI Response to JSON').item.json.score }}",
"Summary": "={{ $('Parse AI Response to JSON').item.json.summary }}"
},
"schema": [
{
"id": "Name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Phone ",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Phone ",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Years of experience",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Years of experience",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "skills",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "skills",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "curent role",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "curent role",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "education",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "education",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Score",
"type": "string",
"display": true,
"required": false,
"displayName": "Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Summary",
"type": "string",
"display": true,
"required": false,
"displayName": "Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Name"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1424038785,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1JlXxy90s0we_IqErHyvomrJSijb8pd4H91hOUCH6xCA/edit#gid=1424038785",
"cachedResultName": "Sheet2"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1JlXxy90s0we_IqErHyvomrJSijb8pd4H91hOUCH6xCA",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1JlXxy90s0we_IqErHyvomrJSijb8pd4H91hOUCH6xCA/edit?usp=drivesdk",
"cachedResultName": "Resume store"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "bb89e2d9-4f18-468f-8b28-a0aa8506b92b",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1072,
1728
],
"parameters": {
"width": 320,
"height": 240,
"content": "## \ud83d\ude80 START PROCESS\n\n**Start Resume Evaluation Process**\n\n\u2022 **Purpose**: Manually trigger the entire resume evaluation workflow\n\u2022 **Action**: Click to begin comparing candidate resumes against job descriptions\n\u2022 **Output**: Initiates the sequential processing of all workflow steps\n\u2022 **Best Practice**: Use this when you have new resumes to evaluate or want to re-run evaluations"
},
"typeVersion": 1
},
{
"id": "0343be16-153b-46f2-8675-b7928b289fb2",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1584,
1280
],
"parameters": {
"width": 320,
"height": 280,
"content": "## \ud83d\udcc1 JOB DESCRIPTION SEARCH\n\n**Find Job Descriptions in Drive**\n\n\u2022 **Purpose**: Locates all job description files stored in the designated Google Drive folder\n\u2022 **Folder**: Searches in 'JD store' folder\n\u2022 **File Types**: Looks for PDF job description documents\n\u2022 **Output**: Returns list of available JD files with their IDs and metadata\n\u2022 **Note**: Ensure JD files are properly uploaded to the correct folder"
},
"typeVersion": 1
},
{
"id": "2fe90bdf-4305-40a1-875c-1f773a4e0afb",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1904,
1792
],
"parameters": {
"width": 320,
"height": 260,
"content": "## \ud83d\udce5 DOWNLOAD JD FILE\n\n**Download Job Description PDF**\n\n\u2022 **Purpose**: Downloads the selected job description PDF file from Google Drive\n\u2022 **Input**: File ID from the search results\n\u2022 **Process**: Retrieves the actual PDF file content for processing\n\u2022 **Output**: Binary PDF data ready for text extraction\n\u2022 **Credentials**: Uses Google Drive OAuth2 API connection"
},
"typeVersion": 1
},
{
"id": "efca102d-d66d-4d66-b314-45ed34287b69",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
2144,
1280
],
"parameters": {
"width": 320,
"height": 260,
"content": "## \ud83d\udcc4 EXTRACT JD TEXT\n\n**Extract JD Text Content**\n\n\u2022 **Purpose**: Converts PDF job description into readable text format\n\u2022 **Input**: Binary PDF data from downloaded file\n\u2022 **Process**: Uses PDF parsing to extract all text content\n\u2022 **Output**: Plain text version of the job description\n\u2022 **Quality**: Maintains formatting and structure of original document"
},
"typeVersion": 1
},
{
"id": "02c627d4-877e-4d65-8e1d-7ccfbd0b5804",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
2352,
1792
],
"parameters": {
"width": 320,
"height": 280,
"content": "## \ud83d\udd0d RESUME SEARCH\n\n**Find Candidate Resumes in Drive**\n\n\u2022 **Purpose**: Searches for candidate resume files in the resume storage folder\n\u2022 **Folder**: Looks in 'Resume_store' folder\n\u2022 **File Types**: Identifies PDF resume documents\n\u2022 **Process**: Returns all available resume files for batch processing\n\u2022 **Organization**: Maintains separate folders for JDs and resumes"
},
"typeVersion": 1
},
{
"id": "13d3d43a-f1b0-45fb-8dfb-7b63496102f9",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
2576,
1264
],
"parameters": {
"width": 320,
"height": 260,
"content": "## \ud83d\udce5 DOWNLOAD RESUME\n\n**Download Candidate Resume PDF**\n\n\u2022 **Purpose**: Downloads individual candidate resume PDF files\n\u2022 **Input**: Resume file ID from search results\n\u2022 **Process**: Retrieves PDF file content for text extraction\n\u2022 **Output**: Binary resume data ready for processing\n\u2022 **Batch Processing**: Handles multiple resumes sequentially"
},
"typeVersion": 1
},
{
"id": "610649af-431e-43dd-9278-0b095b194955",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
2800,
1776
],
"parameters": {
"width": 320,
"height": 260,
"content": "## \ud83d\udcc4 EXTRACT RESUME TEXT\n\n**Extract Resume Text Content**\n\n\u2022 **Purpose**: Converts PDF resume into analyzable text format\n\u2022 **Input**: Binary PDF resume data\n\u2022 **Process**: Parses PDF to extract all textual information\n\u2022 **Output**: Clean text version of candidate resume\n\u2022 **Quality**: Preserves resume structure and content integrity"
},
"typeVersion": 1
},
{
"id": "0c35ebd4-20fa-4ccc-bf38-65814afbbb5a",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
3088,
1216
],
"parameters": {
"width": 320,
"height": 320,
"content": "## \ud83e\udd16 AI EVALUATION ENGINE\n\n**AI Resume Evaluator Agent**\n\n\u2022 **Purpose**: Intelligently compares resume against job description using AI\n\u2022 **Scoring System**: \n - 90-100: Excellent fit\n - 70-89: Good fit with minor gaps\n - 50-69: Moderate fit with gaps\n - Below 50: Poor fit\n\u2022 **Analysis**: Identifies must-have gaps and nice-to-have bonuses\n\u2022 **Output**: Structured JSON evaluation with detailed summary"
},
"typeVersion": 1
},
{
"id": "32715c21-bd37-4edd-906c-73285919b97c",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
3168,
1968
],
"parameters": {
"width": 320,
"height": 260,
"content": "## \u2699\ufe0f AI MODEL CONFIG\n\n**Azure OpenAI GPT-4 Model**\n\n\u2022 **Model**: GPT-4o-mini for cost-effective evaluation\n\u2022 **Purpose**: Powers the AI evaluation agent\n\u2022 **Capabilities**: Natural language understanding and structured output\n\u2022 **Connection**: Links to Azure OpenAI service\n\u2022 **Performance**: Optimized for resume analysis tasks"
},
"typeVersion": 1
},
{
"id": "458a71d5-705e-4107-b827-55188bbba6dc",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
3472,
1264
],
"parameters": {
"width": 320,
"height": 280,
"content": "## \ud83d\udd27 JSON PARSER\n\n**Parse AI Response to JSON**\n\n\u2022 **Purpose**: Converts AI text output into structured JSON format\n\u2022 **Process**: Removes markdown formatting and parses JSON\n\u2022 **Error Handling**: Manages parsing failures gracefully\n\u2022 **Output**: Clean JSON object with score, gaps, bonuses, and summary\n\u2022 **Data Quality**: Ensures consistent data structure for downstream processing"
},
"typeVersion": 1
},
{
"id": "3c10aefc-1be1-415e-8707-8e5d44853dcf",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
3680,
1824
],
"parameters": {
"width": 320,
"height": 280,
"content": "## \ud83d\udcca SAVE REPORT\n\n**Save Evaluation Report to Drive**\n\n\u2022 **Purpose**: Creates detailed evaluation report as text file\n\u2022 **Content**: Includes score, gaps, bonuses, and summary\n\u2022 **Naming**: Uses candidate name + '_result-summary' format\n\u2022 **Storage**: Saves to Resume_store folder for organization\n\u2022 **Audit Trail**: Maintains permanent record of all evaluations"
},
"typeVersion": 1
},
{
"id": "a7615e89-8b92-4266-b9b6-95d574b5aca6",
"name": "Sticky Note12",
"type": "n8n-nodes-base.stickyNote",
"position": [
3904,
1280
],
"parameters": {
"width": 320,
"height": 280,
"content": "## \ud83d\udcc8 DATABASE UPDATE\n\n**Update Candidate Database**\n\n\u2022 **Purpose**: Updates Google Sheets database with evaluation results\n\u2022 **Data**: Stores candidate score and summary\n\u2022 **Matching**: Uses candidate name to update existing records\n\u2022 **Tracking**: Maintains comprehensive candidate evaluation history\n\u2022 **Integration**: Enables easy data analysis and reporting"
},
"typeVersion": 1
},
{
"id": "9b3d9948-3d7f-4491-abd5-2e7def378c83",
"name": "Sticky Note13",
"type": "n8n-nodes-base.stickyNote",
"position": [
1008,
1056
],
"parameters": {
"width": 400,
"height": 600,
"content": "## \ud83d\udccb JD MATCH SCORE WORKFLOW OVERVIEW\n\n**\ud83c\udfaf Purpose:** Automated system to evaluate candidate resumes against job descriptions and generate compatibility scores\n\n**\ud83d\udd04 Workflow Steps:**\n1. **Search & Download**: Locate JD and resume files from Google Drive\n2. **Extract Content**: Convert PDF documents to text format\n3. **AI Analysis**: Use GPT-4 to compare and score candidate fit\n4. **Process Results**: Parse AI output and structure data\n5. **Store Results**: Save reports and update candidate database\n\n**\ud83d\udcca Scoring System:**\n\u2022 90-100: Excellent match (hire immediately)\n\u2022 70-89: Good fit with minor training needed\n\u2022 50-69: Moderate fit requiring skill development\n\u2022 Below 50: Poor fit for this role\n\n**\ud83d\udca1 Benefits:**\n\u2022 Objective, consistent evaluation process\n\u2022 Detailed gap analysis for each candidate\n\u2022 Automated report generation and storage\n\u2022 Comprehensive candidate database tracking"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "7e773013-c40d-4eab-b3ed-6f96bc6fe260",
"connections": {
"Code": {
"main": [
[
{
"node": "Create file from text",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"Search JD": {
"main": [
[
{
"node": "Download file",
"type": "main",
"index": 0
}
]
]
},
"Download file": {
"main": [
[
{
"node": "Extract from File",
"type": "main",
"index": 0
}
]
]
},
"Search Resume": {
"main": [
[
{
"node": "Download file1",
"type": "main",
"index": 0
}
]
]
},
"Download file1": {
"main": [
[
{
"node": "Extract from File1",
"type": "main",
"index": 0
}
]
]
},
"Extract from File": {
"main": [
[
{
"node": "Search Resume",
"type": "main",
"index": 0
}
]
]
},
"Extract from File1": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Create file from text": {
"main": [
[
{
"node": "Append or update row in sheet",
"type": "main",
"index": 0
}
]
]
},
"Azure OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Extract JD Text Content": {
"main": [
[
{
"node": "Find Candidate Resumes in Drive",
"type": "main",
"index": 0
}
]
]
},
"Azure OpenAI GPT-4 Model": {
"ai_languageModel": [
[
{
"node": "AI Resume Evaluator Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"AI Resume Evaluator Agent": {
"main": [
[
{
"node": "Parse AI Response to JSON",
"type": "main",
"index": 0
}
]
]
},
"Parse AI Response to JSON": {
"main": [
[
{
"node": "Save Evaluation Report to Drive",
"type": "main",
"index": 0
}
]
]
},
"Extract Resume Text Content": {
"main": [
[
{
"node": "AI Resume Evaluator Agent",
"type": "main",
"index": 0
}
]
]
},
"Download Job Description PDF": {
"main": [
[
{
"node": "Extract JD Text Content",
"type": "main",
"index": 0
}
]
]
},
"Download Candidate Resume PDF": {
"main": [
[
{
"node": "Extract Resume Text Content",
"type": "main",
"index": 0
}
]
]
},
"Find Job Descriptions in Drive": {
"main": [
[
{
"node": "Download Job Description PDF",
"type": "main",
"index": 0
}
]
]
},
"Find Candidate Resumes in Drive": {
"main": [
[
{
"node": "Download Candidate Resume PDF",
"type": "main",
"index": 0
}
]
]
},
"Save Evaluation Report to Drive": {
"main": [
[
{
"node": "Update Candidate Database",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "Search JD",
"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.
azureOpenAiApigoogleDriveOAuth2ApigoogleSheetsOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Automatically compare candidate resumes to job descriptions (PDFs) from Google Drive, generate a 0–100 fit score with gap analysis, and update Google Sheets—powered by Azure OpenAI (GPT-4o-mini). Fast, consistent screening with saved reports in Drive. 📈📄 Fetches job descriptions…
Source: https://n8n.io/workflows/8531/ — 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.
This workflow is designed for marketers, content creators, agencies, and solo founders who want to publish long‑form posts with visuals on autopilot using n8n and AI agents.
This workflow automates the creation, storage, and reporting of personalized sales collateral for booked leads using GPT-4o, Google Sheets, Google Drive, and Gmail. It pulls leads from a central sheet
This workflow automates end-to-end validation, assessment, and reporting of n8n workflow JSON templates using Google Drive, Azure OpenAI GPT-4o, Gmail, and Slack. It retrieves workflows from a Drive f
Automatically generate polished, n8n-ready template descriptions from your saved JSON workflows in Google Drive. This AI-powered automation processes workflow files, drafts compliant descriptions, and
Automate dress image handling end-to-end: search files, download them, upload to Cloudinary, invoke Azure OpenAI (GPT-4o), parse structured output, and append rows to a sheet. Gain a repeatable, low-t