This workflow corresponds to n8n.io template #8530 — 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": "I2RxYTHy30vIWRmh",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Skill matrix extractor",
"tags": [],
"nodes": [
{
"id": "7119286f-4f1b-41ac-9aa0-8e0ba5e9a2be",
"name": "When clicking \u2018Execute workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
0,
0
],
"parameters": {},
"typeVersion": 1
},
{
"id": "be3bdafb-8250-4580-809b-84df5a18587e",
"name": "Azure OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
"position": [
992,
224
],
"parameters": {
"model": "gpt-4o-mini",
"options": {}
},
"credentials": {
"azureOpenAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "539bdc67-0f64-409c-afbb-83bcef1d164c",
"name": "Search Resume",
"type": "n8n-nodes-base.googleDrive",
"position": [
224,
0
],
"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": "550324ac-717b-4749-b885-e78777a107f6",
"name": "Download Resume",
"type": "n8n-nodes-base.googleDrive",
"position": [
448,
0
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "4c59808e-dd0d-4957-9738-b813cb2d3e70",
"name": "Extract content from File",
"type": "n8n-nodes-base.extractFromFile",
"position": [
672,
0
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "fdece73f-e3a0-4678-bd79-733f91ac38f3",
"name": "Skill analyser",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
896,
0
],
"parameters": {
"text": "=Analyze the following resume and extract the skills into the required JSON format.\n\nResume:\n{{ $json.text }}",
"options": {
"systemMessage": "You are an AI assistant that analyzes resumes and extracts a structured skills matrix. \n\nRules:\n- Only include skills relevant to this predefined tech stack: [React, Node.js, Angular, Python, Java, SQL, Docker, Kubernetes, AWS, Azure, GCP, HTML, CSS, JavaScript]. \n- For each skill, return:\n - name (string)\n - level (1\u20135, where 1 = beginner and 5 = expert)\n - years (integer, number of years of experience if mentioned, otherwise estimate or set to null). \n- Always return valid JSON in this exact format:\n{\n \"skills\": [\n {\"name\": \"React\", \"level\": 4, \"years\": 5},\n {\"name\": \"Node.js\", \"level\": 3, \"years\": 2}\n ]\n}\n- Do not include text outside of the JSON.\n"
},
"promptType": "define"
},
"typeVersion": 2.1
},
{
"id": "810daa5b-6b4e-4960-9951-b7693a5a9e2c",
"name": "Parse structure json",
"type": "n8n-nodes-base.code",
"position": [
1296,
0
],
"parameters": {
"jsCode": "// Get AI output string\nconst rawOutput = $json[\"output\"];\n\n// Parse string into JSON\nlet parsed;\ntry {\n parsed = JSON.parse(rawOutput);\n} catch (e) {\n throw new Error(\"Invalid JSON from AI: \" + e.message);\n}\n\n// Extract skills\nlet skills = parsed.skills || [];\n\n// Filter skills where level > 2\nskills = skills.filter(skill => skill.level > 2);\n\n// Return cleaned result\nreturn skills.map(skill => ({ json: skill }));\n"
},
"typeVersion": 2
},
{
"id": "676a04bd-ed64-46ee-a97c-428b9d3d1555",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-224,
-272
],
"parameters": {
"height": 272,
"content": "## Manual Trigger Node\n\n**Purpose:** Starts the workflow execution\n**How it works:** Click the \"Execute workflow\" button to begin processing\nWhen to use: Run this when you want to analyze new resumes that have been added to the resume folder"
},
"typeVersion": 1
},
{
"id": "42f2c726-7b9d-4b11-85a1-a10b0a54bfda",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
112,
-352
],
"parameters": {
"height": 336,
"content": "## Search Resume (Google Drive)\n\n**Purpose:** Locates resume files in a designated Google Drive folder\n\n**Configuration:**\nConnected to a specific folder named \"Resume_store\"\nSearches for all files in the folder\n\n**Output:** List of all resume files found in the folder"
},
"typeVersion": 1
},
{
"id": "3ae4d01a-6b6a-43b9-bb63-cbce538d3513",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
336,
160
],
"parameters": {
"height": 304,
"content": "## Download Resume (Google Drive)\n\n**Purpose:** Downloads each resume file from Google Drive\n\n**How it works:** Takes the file IDs from the search step and downloads the actual PDF files\n\n**Security:** Uses secure Google Drive API credentials (details hidden for security)"
},
"typeVersion": 1
},
{
"id": "78e6ef99-d11b-4423-b846-20052eeb357e",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
512,
-336
],
"parameters": {
"height": 304,
"content": "## Extract Content from File\n\n**Purpose:** Converts PDF resumes into readable text\n\n**Functionality:**\nProcesses PDF files\nExtracts all text content for analysis\n\n**Output:** Plain text version of each resume"
},
"typeVersion": 1
},
{
"id": "2a0c837d-b006-4d75-a1f2-f4f4f7d10098",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
720,
304
],
"parameters": {
"height": 304,
"content": "## . Azure OpenAI Chat Model\n\n**Purpose:** Provides AI language model for skill analysis\n\n**Configuration:**\nUses GPT-4o-mini model\nConnected via secure Azure OpenAI credentials\n\n**Role:** Powers the skill analysis agent with AI capabilities"
},
"typeVersion": 1
},
{
"id": "aa4ef7a5-8ef9-49a9-88f5-acf32b0fa7d1",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
848,
-416
],
"parameters": {
"height": 400,
"content": "## Skill Analyser (AI Agent)\n\n**Purpose:** Main intelligence of the workflow - analyzes resume text for technical skills\n\n**System Instructions:**\nFocuses on predefined tech stack: React, Node.js, Angular, Python, Java, SQL, Docker, Kubernetes, AWS, Azure, GCP, HTML, CSS, JavaScript\nEvaluates skill levels on 1-5 scale (1=beginner, 5=expert)\nEstimates years of experience for each skill\nReturns structured JSON format"
},
"typeVersion": 1
},
{
"id": "52d9bd11-c8be-4337-b799-195d1b267b52",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1104,
176
],
"parameters": {
"height": 336,
"content": "## Parse Structured JSON\n\n**Purpose:** Processes and filters the AI analysis results\n\n**JavaScript Code Logic:**\nParses the JSON output from the AI agent\nFilters skills to only include those with proficiency level > 2\nStructures data for database storage\nHandles error cases for invalid JSON"
},
"typeVersion": 1
},
{
"id": "e6fd03e9-307d-470c-b904-b7852271b9ae",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
1296,
-528
],
"parameters": {
"height": 512,
"content": "## Update sheet with Skill matrix (Google Sheets)\n\n**Purpose:** Stores the extracted skills in a Google Sheets database\nTarget Sheet: \"Resume store\" spreadsheet, \"Sheet2\" tab\n\n**Data Mapping:**\nSkill name \u2192 extracted skill name\nSkill level \u2192 proficiency rating (1-5)\nSkill years \u2192 years of experience\nName \u2192 \"John Doe\" (hardcoded candidate name)\n\n\n**Operation:** Appends new rows or updates existing ones based on Name field"
},
"typeVersion": 1
},
{
"id": "9fa44b2f-4e20-471f-aa01-9d4e6ffc1a67",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-640,
-48
],
"parameters": {
"height": 496,
"content": "## Workflow Process Flow\n\n**Start \u2192 Manual trigger initiates the process**\n\n**Search \u2192 Finds all resume files in Google Drive folder**\n\n**Download \u2192 Retrieves each resume file**\n\n**Extract \u2192 Converts PDF to text**\n\n**Analyze \u2192 AI evaluates skills and proficiency levels**\n\n**Filter \u2192 Keeps only intermediate to advanced skills (level > 2)**\n\n**Store \u2192 Saves results to Google Sheets database**"
},
"typeVersion": 1
},
{
"id": "1fe999a3-5f03-4c31-9dd5-de285bbc510d",
"name": "Update sheet with skill matrix",
"type": "n8n-nodes-base.googleSheets",
"position": [
1520,
0
],
"parameters": {
"columns": {
"value": {
"Name": "John Doe",
"Skill name": "={{ $json.name }}",
"Skill level": "={{ $json.level }}",
"Skill years": "={{ $json.years }}"
},
"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,
"removed": true,
"required": false,
"displayName": "Score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Summary",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Skill name",
"type": "string",
"display": true,
"required": false,
"displayName": "Skill name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Skill level",
"type": "string",
"display": true,
"required": false,
"displayName": "Skill level",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Skill years",
"type": "string",
"display": true,
"required": false,
"displayName": "Skill years",
"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
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "80d15093-7694-4da9-8e07-7c82f9221cba",
"connections": {
"Search Resume": {
"main": [
[
{
"node": "Download Resume",
"type": "main",
"index": 0
}
]
]
},
"Skill analyser": {
"main": [
[
{
"node": "Parse structure json",
"type": "main",
"index": 0
}
]
]
},
"Download Resume": {
"main": [
[
{
"node": "Extract content from File",
"type": "main",
"index": 0
}
]
]
},
"Parse structure json": {
"main": [
[
{
"node": "Update sheet with skill matrix",
"type": "main",
"index": 0
}
]
]
},
"Azure OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Skill analyser",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Extract content from File": {
"main": [
[
{
"node": "Skill analyser",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "Search Resume",
"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 extract a structured skill matrix from PDF resumes in a Google Drive folder and store results in Google Sheets. Uses Azure OpenAI (GPT-4o-mini) to analyze predefined tech stacks and filters for relevant proficiency. Fast, consistent insights ready for review. 🔍📊…
Source: https://n8n.io/workflows/8530/ — 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.
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
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