Filtrado automatizado de currículos con GPT-4o y manejo de errores - Proceso de Google Sheets y Google Drive
Este es unContent Creation, Multimodal AIflujo de automatización del dominio deautomatización que contiene 34 nodos.Utiliza principalmente nodos como If, Set, Gmail, Merge, Switch. Filtrado automatizado de currículums con GPT-4o y manejo de errores: proceso de Google Sheets y Drive
- •Cuenta de Google y credenciales de API de Gmail
- •Credenciales de API de Google Drive
- •Pueden requerirse credenciales de autenticación para la API de destino
- •Credenciales de API de Google Sheets
- •Clave de API de OpenAI
Nodos utilizados (34)
Categoría
{
"meta": {
"instanceId": "2000c64071c20843606b95c63795bb0797c41036047055a6586498e855b96efc"
},
"nodes": [
{
"id": "548b4ba3-85c0-4e01-a89d-53c345910b22",
"name": "Guía de Configuración",
"type": "n8n-nodes-base.stickyNote",
"position": [
-4752,
-160
],
"parameters": {
"width": 600,
"height": 1152,
"content": "# 🎯 AI Resume Screening & Candidate Pipeline\n\n**Enhanced with Error Handling & Recovery**\n\n**Created by:** **David Olusola**\n\n## 🚀 What This Workflow Does\n\n- **Monitors Gmail** for resume submissions\n- **Processes multiple file formats** (PDF, DOCX, TXT)\n- **Uses AI analysis** with GPT-4o for candidate evaluation \n- **Extracts contact info** automatically\n- **Scores candidates** against job requirements\n- **Logs everything** to Google Sheets dashboard\n- **Handles errors gracefully** with notifications\n\n## ⚡ Error Handling Features\n\n✅ File extraction validation\n✅ AI processing failure recovery\n✅ Email notifications for errors\n✅ Data validation before logging\n✅ Resume quality checks\n✅ Timeout protection\n\n## 📋 Required Setup\n\n- Gmail credentials\n- Google Drive & Sheets credentials \n- OpenAI API key\n- Error notification email\n\n Copy the [Google Sheet Template](https://docs.google.com/spreadsheets/d/1vucZgBrULNToEQMAQrFyWczpOzXxBU6rzCX0waIZyeM/edit?gid=0#gid=0) \nMake a copy of the sheet in your own Google Drive. This is where the workflow will write the parsed data back.\n\n## 🎯 Use Cases\n\n- HR departments screening applicants\n- Recruiting agencies processing candidates\n- Startups managing hiring pipelines\n- Remote teams coordinating interviews"
},
"typeVersion": 1
},
{
"id": "c84f6d81-dec5-458d-b298-617752318f87",
"name": "Monitorear Hojas de Vida",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
-3952,
560
],
"parameters": {
"simple": false,
"filters": {},
"options": {
"downloadAttachments": true
},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
}
},
"credentials": {
"gmailOAuth2": {
"id": "LVRUgE95PAvkE1Mc",
"name": "Gmail account 2"
}
},
"typeVersion": 1.2
},
{
"id": "ddd0aa5e-dd9c-4658-9ccb-eb183bd75062",
"name": "Monitoreo de Correo",
"type": "n8n-nodes-base.stickyNote",
"position": [
-4080,
320
],
"parameters": {
"color": 2,
"width": 350,
"height": 392,
"content": "## 📧 Email Monitoring\n\nWatches Gmail inbox for:\n- Resume attachments\n- Job application emails\n- Candidate submissions\n\nSupports multiple file formats:\n- PDF documents\n- Word documents (.docx)\n- Plain text files (.txt)"
},
"typeVersion": 1
},
{
"id": "e0a4d380-edc6-48c0-b655-f7ffc2d11603",
"name": "Guardar en Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
-3728,
560
],
"parameters": {
"name": "={{ $json.subject.replace(/[^a-zA-Z0-9]/g, '_') }}_resume_{{ $now.format('yyyy-MM-dd_HH-mm') }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "root",
"cachedResultName": "/ (Root folder)"
},
"inputDataFieldName": "attachment_0"
},
"credentials": {
"googleDriveOAuth2Api": {
"id": "IPz4dCJVFC8uaoHw",
"name": "Google Drive account 2"
}
},
"typeVersion": 3
},
{
"id": "37bb352f-14f9-4286-9a0b-9b3e3680f733",
"name": "¿Subida Exitosa?",
"type": "n8n-nodes-base.if",
"position": [
-3504,
560
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "upload-success",
"operator": {
"type": "boolean",
"operation": "equals"
},
"leftValue": "={{ $json.id !== undefined && $json.webViewLink !== undefined }}",
"rightValue": true
}
]
}
},
"typeVersion": 2
},
{
"id": "6ee6f742-ce91-4bdc-a3ea-769a06cf2512",
"name": "Enrutar por Tipo de Archivo",
"type": "n8n-nodes-base.switch",
"position": [
-3280,
352
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "PDF",
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "pdf-check",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.mimeType }}",
"rightValue": "application/pdf"
}
]
},
"renameOutput": true
},
{
"outputKey": "DOCX",
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "docx-check",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.mimeType }}",
"rightValue": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
}
]
},
"renameOutput": true
},
{
"outputKey": "TXT",
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "txt-check",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.mimeType }}",
"rightValue": "text/plain"
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "899b217d-9258-4fd6-be41-fdd5fe52c5d3",
"name": "Extraer Texto de PDF",
"type": "n8n-nodes-base.extractFromFile",
"position": [
-2864,
128
],
"parameters": {
"options": {
"maxPages": 10
},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "3f93e040-46e2-4c71-b0b2-548bcfe04235",
"name": "Convertir DOCX a Docs",
"type": "n8n-nodes-base.httpRequest",
"position": [
-3056,
368
],
"parameters": {
"url": "=https://www.googleapis.com/drive/v2/files/{{ $json.id }}/copy",
"method": "POST",
"options": {
"timeout": 30000
},
"jsonBody": "{\n \"title\": \"{{ $json.name }}_converted\",\n \"mimeType\": \"application/vnd.google-apps.document\"\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleDriveOAuth2Api"
},
"credentials": {
"googleDriveOAuth2Api": {
"id": "IPz4dCJVFC8uaoHw",
"name": "Google Drive account 2"
}
},
"typeVersion": 4.2
},
{
"id": "64cf332a-2691-4181-a244-4cc18f9a1b13",
"name": "Obtener Doc como Texto",
"type": "n8n-nodes-base.googleDrive",
"position": [
-2832,
368
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {
"googleFileConversion": {
"conversion": {
"docsToFormat": "text/plain"
}
}
},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"id": "IPz4dCJVFC8uaoHw",
"name": "Google Drive account 2"
}
},
"typeVersion": 3
},
{
"id": "6b5e1a57-2c26-4bbe-b104-99ef776f867c",
"name": "Descargar TXT",
"type": "n8n-nodes-base.googleDrive",
"position": [
-3056,
576
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"id": "IPz4dCJVFC8uaoHw",
"name": "Google Drive account 2"
}
},
"typeVersion": 3
},
{
"id": "2255b19e-1842-4e23-9fcf-0c69b036226b",
"name": "Extraer Contenido TXT",
"type": "n8n-nodes-base.extractFromFile",
"position": [
-2832,
576
],
"parameters": {
"options": {},
"operation": "text",
"destinationKey": "resumeText"
},
"typeVersion": 1
},
{
"id": "ee8c0749-6302-420d-9fff-cb57dfef3b9e",
"name": "¿Texto Extraído?",
"type": "n8n-nodes-base.if",
"position": [
-2544,
288
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "text-validation",
"operator": {
"type": "boolean",
"operation": "equals"
},
"leftValue": "={{ ($json.text && $json.text.length > 50) || ($json.data && $json.data.length > 50) || ($json.resumeText && $json.resumeText.length > 50) }}",
"rightValue": true
}
]
}
},
"typeVersion": 2
},
{
"id": "cd20f833-a887-46c4-9702-94e53780552d",
"name": "Estandarizar Datos de Hoja de Vida",
"type": "n8n-nodes-base.set",
"position": [
-2320,
192
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "resume-text",
"name": "candidateResume",
"type": "string",
"value": "={{ $json.text || $json.data || $json.resumeText }}"
},
{
"id": "original-email",
"name": "originalEmail",
"type": "object",
"value": "={{ $('Monitor Resumes').item.json }}"
},
{
"id": "drive-link",
"name": "driveLink",
"type": "string",
"value": "={{ $('Save to Drive').item.json.webViewLink }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "87bae272-a305-4573-b651-8a0428d13fce",
"name": "Verificación de Calidad de Hoja de Vida",
"type": "n8n-nodes-base.if",
"position": [
-2096,
192
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "quality-check",
"operator": {
"type": "boolean",
"operation": "equals"
},
"leftValue": "={{ $json.candidateResume && $json.candidateResume.length > 100 && ($json.candidateResume.toLowerCase().includes('experience') || $json.candidateResume.toLowerCase().includes('skills') || $json.candidateResume.toLowerCase().includes('education')) }}",
"rightValue": true
}
]
}
},
"typeVersion": 2
},
{
"id": "0a211848-c56f-4602-a8f5-e0a63e9c0631",
"name": "Descripción del Puesto",
"type": "n8n-nodes-base.set",
"position": [
-1872,
80
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "job-description",
"name": "jobDescription",
"type": "string",
"value": "Job Title: Senior Software Engineer\n\nWe are seeking a Senior Software Engineer to join our growing team. The ideal candidate will have:\n\nRequired Skills:\n- 5+ years of software development experience\n- Strong proficiency in JavaScript, Python, or Java\n- Experience with cloud platforms (AWS, GCP, Azure)\n- Database design and optimization experience\n- Agile development methodology experience\n\nPreferred Skills:\n- Full-stack development experience\n- DevOps and CI/CD pipeline experience\n- Team leadership experience\n- Experience with microservices architecture\n\nResponsibilities:\n- Design and develop scalable software solutions\n- Collaborate with cross-functional teams\n- Mentor junior developers\n- Participate in code reviews\n- Contribute to technical decision making"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "53dbdfb5-0e9e-4e03-81d3-ed01714978ba",
"name": "Análisis de Reclutador con IA",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-1648,
80
],
"parameters": {
"text": "=**CANDIDATE RESUME:**\n\n{{ $('Extract PDF Text').item.json.text }}\n\n**JOB DESCRIPTION:**\n\n{{ $json.jobDescription }}",
"options": {
"systemMessage": "You are an expert technical recruiter and hiring manager with 15+ years of experience evaluating candidates across technology, business, and creative roles.\n\n# Your Mission\nAnalyze the candidate's resume against the provided job description and deliver a comprehensive, actionable screening report that helps hiring teams make informed decisions quickly.\n\n# Analysis Framework\nEvaluate the candidate across these dimensions:\n1. **Technical Skills Match** - Hard skills, tools, technologies\n2. **Experience Relevance** - Industry background, role progression\n3. **Cultural & Soft Skills Fit** - Leadership, communication, teamwork\n4. **Growth Potential** - Learning ability, adaptability, ambition\n5. **Red Flags** - Gaps, inconsistencies, concerns\n\n# Output Requirements\nProvide your analysis in this exact JSON structure - be specific and reference actual resume content.\n\n# Quality Standards\n- Reference specific resume content, not generalities\n- Consider both immediate needs and long-term potential\n- Balance optimism with realistic assessment\n- Provide actionable insights for hiring managers\n- Score from 1-10 where 8+ means \"definitely interview\""
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2
},
{
"id": "416be5d3-78da-4837-b312-5edd184216b5",
"name": "Analizador de Salida Estructurada",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-1504,
304
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n \"type\": \"object\",\n \"properties\": {\n \"candidate_strengths\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"description\": \"List of candidate's key strengths with evidence\"\n },\n \"candidate_weaknesses\": {\n \"type\": \"array\", \n \"items\": { \"type\": \"string\" },\n \"description\": \"List of areas where candidate falls short\"\n },\n \"risk_assessment\": {\n \"type\": \"object\",\n \"properties\": {\n \"level\": {\n \"type\": \"string\",\n \"enum\": [\"Low\", \"Medium\", \"High\"]\n },\n \"explanation\": {\n \"type\": \"string\",\n \"description\": \"Detailed risk analysis\"\n }\n }\n },\n \"opportunity_assessment\": {\n \"type\": \"object\",\n \"properties\": {\n \"level\": {\n \"type\": \"string\", \n \"enum\": [\"Low\", \"Medium\", \"High\"]\n },\n \"explanation\": {\n \"type\": \"string\",\n \"description\": \"Upside potential analysis\"\n }\n }\n },\n \"overall_score\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 10,\n \"description\": \"Overall fit score 1-10\"\n },\n \"score_justification\": {\n \"type\": \"string\",\n \"description\": \"Detailed explanation of the score\"\n },\n \"next_steps_recommendation\": {\n \"type\": \"string\",\n \"description\": \"Recommended next actions\"\n }\n },\n \"required\": [\"candidate_strengths\", \"candidate_weaknesses\", \"risk_assessment\", \"opportunity_assessment\", \"overall_score\", \"score_justification\", \"next_steps_recommendation\"]\n}"
},
"typeVersion": 1.3
},
{
"id": "ea66c7e3-1572-4824-8eae-a5b637e5df33",
"name": "Modelo GPT-4o",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-1632,
304
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "gpt-4o-mini"
},
"options": {
"maxTokens": 2000,
"temperature": 0.3
}
},
"credentials": {
"openAiApi": {
"id": "BXMUxnyGzjtZQOK4",
"name": "OpenAi account Dave"
}
},
"typeVersion": 1.2
},
{
"id": "101a971e-3fae-445e-96ac-878650a6d14a",
"name": "¿Análisis con IA Exitoso?",
"type": "n8n-nodes-base.if",
"position": [
-1296,
80
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "ai-success",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json.output && $json.output.overall_score && $json.output.candidate_strengths.join(\"/n/n\") }}",
"rightValue": true
}
]
}
},
"typeVersion": 2
},
{
"id": "df2d7bc1-4628-4a08-8a55-6de9111eea4c",
"name": "Extraer Información del Candidato",
"type": "@n8n/n8n-nodes-langchain.informationExtractor",
"position": [
-1136,
-160
],
"parameters": {
"text": "={{ $('Standardize Resume Data').item.json.candidateResume }}",
"options": {},
"attributes": {
"attributes": [
{
"name": "full_name",
"required": true,
"description": "Candidate's full name (first and last name combined)"
},
{
"name": "email_address",
"required": true,
"description": "Primary email address of the candidate"
},
{
"name": "phone_number",
"description": "Phone number or mobile number"
},
{
"name": "current_title",
"description": "Current job title or most recent position"
},
{
"name": "years_experience",
"description": "Total years of relevant work experience"
},
{
"name": "key_skills",
"description": "Top 5 technical or professional skills mentioned"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "e5ac2a2d-bbdd-4582-b019-d8ba5ba6c57c",
"name": "¿Datos Finales Válidos?",
"type": "n8n-nodes-base.if",
"position": [
-784,
-160
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "data-validation",
"operator": {
"type": "number",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json.output?.full_name && $json.output?.email_address && $('AI Recruiter Analysis').item.json.output?.overall_score }}",
"rightValue": true
}
]
}
},
"typeVersion": 2
},
{
"id": "168334bc-97c8-490b-a1fc-0acb8066912d",
"name": "Registrar Procesamiento Exitoso",
"type": "n8n-nodes-base.googleSheets",
"position": [
-736,
-336
],
"parameters": {
"columns": {
"value": {
"Date": "={{ $('Save to Drive').item.json.createdTime }}",
"Email": "={{ $json.output.email_address || $json.originalEmail.from }}",
"Resume": "={{ $('Save to Drive').item.json.webViewLink }}",
"Full Name": "={{ $json.output.full_name }}",
"Strengths": "={{ $('AI Recruiter Analysis').item.json.output.candidate_strengths.join(' • ') }}",
"Key Skills": "={{ $json.output.key_skills }}",
"Weaknesses": "={{ $('AI Recruiter Analysis').item.json.output.candidate_weaknesses.join(' • ') }}",
"Overall Fit": "={{ $('AI Recruiter Analysis').item.json.output.overall_score }}",
"Risk Factor": "={{ $('AI Recruiter Analysis').item.json.output.risk_assessment.level }} \n{{ $('AI Recruiter Analysis').item.json.output.risk_assessment.explanation }}",
"Justification": "={{ $('AI Recruiter Analysis').item.json.output.score_justification }}",
"Reward Factor": "={{ $('AI Recruiter Analysis').item.json.output.opportunity_assessment.level }} \n{{ $('AI Recruiter Analysis').item.json.output.opportunity_assessment.explanation }}"
},
"schema": [
{
"id": "Date",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Resume",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Resume",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Full Name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Full Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Strengths",
"type": "string",
"display": true,
"required": false,
"displayName": "Strengths",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Weaknesses",
"type": "string",
"display": true,
"required": false,
"displayName": "Weaknesses",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Risk Factor",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Risk Factor",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Reward Factor",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Reward Factor",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Overall Fit",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Overall Fit",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Justification",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Justification",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Key Skills",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Key Skills",
"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/spreadsheets/d/1vucZgBrULNToEQMAQrFyWczpOzXxBU6rzCX0waIZyeM/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1vucZgBrULNToEQMAQrFyWczpOzXxBU6rzCX0waIZyeM",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1vucZgBrULNToEQMAQrFyWczpOzXxBU6rzCX0waIZyeM/edit?usp=drivesdk",
"cachedResultName": "Resume Screener (file -> make a copy)"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "9bWZzYQ7NvMBs1Xg",
"name": "Google Sheets account 2"
}
},
"typeVersion": 4.6
},
{
"id": "95d4e4e5-63bd-4a2b-bc26-ea15144d76af",
"name": "Establecer Error de Subida",
"type": "n8n-nodes-base.set",
"position": [
-560,
752
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "error-type",
"name": "error_type",
"type": "string",
"value": "Upload Failed"
},
{
"id": "error-message",
"name": "error_message",
"type": "string",
"value": "Failed to upload resume to Google Drive"
},
{
"id": "original-data",
"name": "original_email",
"type": "object",
"value": "={{ $('Monitor Resumes').item.json }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "56635bec-8887-4b1d-90fd-a4cf35484f57",
"name": "Establecer Error de Extracción",
"type": "n8n-nodes-base.set",
"position": [
-560,
528
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "error-type",
"name": "error_type",
"type": "string",
"value": "Text Extraction Failed"
},
{
"id": "error-message",
"name": "error_message",
"type": "string",
"value": "Unable to extract readable text from file"
},
{
"id": "file-info",
"name": "file_info",
"type": "object",
"value": "={{ $('Save to Drive').item.json }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "825c2125-1914-4e4b-9d6e-b67a2e3b11ce",
"name": "Establecer Error de Calidad",
"type": "n8n-nodes-base.set",
"position": [
-560,
336
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "error-type",
"name": "error_type",
"type": "string",
"value": "Poor Resume Quality"
},
{
"id": "error-message",
"name": "error_message",
"type": "string",
"value": "Resume does not contain sufficient content for analysis"
},
{
"id": "resume-data",
"name": "resume_data",
"type": "string",
"value": "={{ $json.candidateResume?.substring(0, 200) }}..."
}
]
}
},
"typeVersion": 3.4
},
{
"id": "57f8e9fb-3175-4975-9775-e134e94eb6e4",
"name": "Establecer Error de IA",
"type": "n8n-nodes-base.set",
"position": [
-560,
112
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "error-type",
"name": "error_type",
"type": "string",
"value": "AI Processing Failed"
},
{
"id": "error-message",
"name": "error_message",
"type": "string",
"value": "AI analysis did not complete successfully"
},
{
"id": "ai-output",
"name": "ai_output",
"type": "object",
"value": "={{ $json }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "f7b1385e-6a0a-470c-93cd-55ba1da56ee4",
"name": "Establecer Error de Validación",
"type": "n8n-nodes-base.set",
"position": [
-560,
-80
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "error-type",
"name": "error_type",
"type": "string",
"value": "Data Validation Failed"
},
{
"id": "error-message",
"name": "error_message",
"type": "string",
"value": "Missing required candidate information or AI analysis data"
},
{
"id": "available-data",
"name": "available_data",
"type": "string",
"value": "={{ JSON.stringify({ candidateInfo: $json.output, aiAnalysis: $('AI Recruiter Analysis').item.json.output }) }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "3b4b6746-99e0-4d6b-a620-fc8c89974eee",
"name": "Combinar Todos los Errores",
"type": "n8n-nodes-base.merge",
"position": [
-336,
352
],
"parameters": {
"mode": "combine",
"options": {}
},
"typeVersion": 3
},
{
"id": "5c692947-9802-43d7-848a-61d9fa01f02a",
"name": "Enviar Notificación de Error",
"type": "n8n-nodes-base.gmail",
"position": [
-112,
352
],
"webhookId": "8b233cc7-a903-4afe-9179-14923fcad8a7",
"parameters": {
"sendTo": "your-error-notification-email@company.com",
"message": "=⚠️ **Resume Processing Failed**\n\n**Error Type:** {{ $json.error_type }}\n**Error Message:** {{ $json.error_message }}\n**Timestamp:** {{ $now.format('yyyy-MM-dd HH:mm:ss') }}\n\n**Original Email Details:**\n- From: {{ $json.original_email?.from || 'Unknown' }}\n- Subject: {{ $json.original_email?.subject || 'Unknown' }}\n- Date: {{ $json.original_email?.date || 'Unknown' }}\n\n**Next Steps:**\n- Review the error details above\n- Check file format and quality\n- Manually process if needed\n- Contact IT support if errors persist",
"options": {},
"subject": "=Resume Processing Error - {{ $json.error_type }}"
},
"credentials": {
"gmailOAuth2": {
"id": "Aecq49wES5aLVPPq",
"name": "Gmail account 4"
}
},
"typeVersion": 2.1
},
{
"id": "803eb0cb-f941-44cb-89dc-3813ec26d3c9",
"name": "Registrar Error en Hoja",
"type": "n8n-nodes-base.googleSheets",
"disabled": true,
"position": [
112,
352
],
"parameters": {
"columns": {
"value": {
"Status": "Requires Manual Review",
"File_Link": "={{ $json.file_info?.webViewLink || 'Not available' }}",
"Timestamp": "={{ $now.format('yyyy-MM-dd HH:mm:ss') }}",
"Error_Type": "={{ $json.error_type }}",
"Error_Message": "={{ $json.error_message }}",
"Original_From": "={{ $json.original_email?.from || 'Unknown' }}",
"Original_Subject": "={{ $json.original_email?.subject || 'Unknown' }}"
},
"mappingMode": "defineBelow"
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/your-error-sheet-id/edit#gid=0",
"cachedResultName": "Errors"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "your-error-log-spreadsheet-id",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/your-error-sheet-id/edit",
"cachedResultName": "Error Log Sheet"
}
},
"typeVersion": 4.6
},
{
"id": "52ea629f-2f47-4b03-9498-98701026de61",
"name": "Procesamiento de Archivo",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3104,
-464
],
"parameters": {
"color": 6,
"width": 400,
"height": 1224,
"content": "## 🔄 File Processing\n\nRoutes different file types:\n- **PDF**: Direct text extraction\n- **DOCX**: Convert to Google Doc first\n- **TXT**: Simple text processing\n\nAll paths converge to standardized text output"
},
"typeVersion": 1
},
{
"id": "82d07dc3-aac4-4d04-94ce-89555c5c5abd",
"name": "Manejo de Errores",
"type": "n8n-nodes-base.stickyNote",
"position": [
-592,
-480
],
"parameters": {
"color": 8,
"width": 400,
"height": 1340,
"content": "## ⚠️ Error Handling\n\n**Multi-layer Validation:**\n- Upload success verification\n- Text extraction validation\n- Resume quality checks\n- AI processing validation\n- Final data verification\n\n**Error Recovery:**\n- Email notifications to admin\n- Error logging to spreadsheet\n- Graceful failure handling\n- Manual review triggers"
},
"typeVersion": 1
},
{
"id": "e14473a9-91b4-43b7-8279-de2e3a47711f",
"name": "Motor de Análisis con IA",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1648,
-512
],
"parameters": {
"color": 5,
"width": 736,
"height": 828,
"content": "## 🤖 AI Analysis Engine\n\n**Powered by GPT-4o**\n\nAnalyzes candidates across:\n- Technical skills alignment\n- Experience relevance \n- Cultural fit indicators\n- Growth potential\n- Risk factors\n\nOutputs structured JSON with:\n- Strengths & weaknesses\n- Risk/opportunity assessment\n- 1-10 scoring with justification\n- Next steps recommendation"
},
"typeVersion": 1
},
{
"id": "087335ab-ae10-46c5-8608-eafa51d47ed7",
"name": "Obtener Doc",
"type": "n8n-nodes-base.googleDrive",
"position": [
-3088,
128
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {
"googleFileConversion": {
"conversion": {
"docsToFormat": "application/pdf"
}
}
},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"id": "IPz4dCJVFC8uaoHw",
"name": "Google Drive account 2"
}
},
"typeVersion": 3
}
],
"pinData": {},
"connections": {
"087335ab-ae10-46c5-8608-eafa51d47ed7": {
"main": [
[
{
"node": "899b217d-9258-4fd6-be41-fdd5fe52c5d3",
"type": "main",
"index": 0
}
]
]
},
"6b5e1a57-2c26-4bbe-b104-99ef776f867c": {
"main": [
[
{
"node": "2255b19e-1842-4e23-9fcf-0c69b036226b",
"type": "main",
"index": 0
}
]
]
},
"ea66c7e3-1572-4824-8eae-a5b637e5df33": {
"ai_languageModel": [
[
{
"node": "53dbdfb5-0e9e-4e03-81d3-ed01714978ba",
"type": "ai_languageModel",
"index": 0
},
{
"node": "df2d7bc1-4628-4a08-8a55-6de9111eea4c",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"57f8e9fb-3175-4975-9775-e134e94eb6e4": {
"main": [
[
{
"node": "3b4b6746-99e0-4d6b-a620-fc8c89974eee",
"type": "main",
"index": 1
}
]
]
},
"e0a4d380-edc6-48c0-b655-f7ffc2d11603": {
"main": [
[
{
"node": "37bb352f-14f9-4286-9a0b-9b3e3680f733",
"type": "main",
"index": 0
}
]
]
},
"64cf332a-2691-4181-a244-4cc18f9a1b13": {
"main": [
[
{
"node": "ee8c0749-6302-420d-9fff-cb57dfef3b9e",
"type": "main",
"index": 0
}
]
]
},
"0a211848-c56f-4602-a8f5-e0a63e9c0631": {
"main": [
[
{
"node": "53dbdfb5-0e9e-4e03-81d3-ed01714978ba",
"type": "main",
"index": 0
}
]
]
},
"c84f6d81-dec5-458d-b298-617752318f87": {
"main": [
[
{
"node": "e0a4d380-edc6-48c0-b655-f7ffc2d11603",
"type": "main",
"index": 0
}
]
]
},
"ee8c0749-6302-420d-9fff-cb57dfef3b9e": {
"main": [
[
{
"node": "cd20f833-a887-46c4-9702-94e53780552d",
"type": "main",
"index": 0
}
],
[
{
"node": "56635bec-8887-4b1d-90fd-a4cf35484f57",
"type": "main",
"index": 0
}
]
]
},
"37bb352f-14f9-4286-9a0b-9b3e3680f733": {
"main": [
[
{
"node": "6ee6f742-ce91-4bdc-a3ea-769a06cf2512",
"type": "main",
"index": 0
}
],
[
{
"node": "95d4e4e5-63bd-4a2b-bc26-ea15144d76af",
"type": "main",
"index": 0
}
]
]
},
"899b217d-9258-4fd6-be41-fdd5fe52c5d3": {
"main": [
[
{
"node": "ee8c0749-6302-420d-9fff-cb57dfef3b9e",
"type": "main",
"index": 0
}
]
]
},
"3b4b6746-99e0-4d6b-a620-fc8c89974eee": {
"main": [
[
{
"node": "5c692947-9802-43d7-848a-61d9fa01f02a",
"type": "main",
"index": 0
}
]
]
},
"95d4e4e5-63bd-4a2b-bc26-ea15144d76af": {
"main": [
[
{
"node": "3b4b6746-99e0-4d6b-a620-fc8c89974eee",
"type": "main",
"index": 0
}
]
]
},
"e5ac2a2d-bbdd-4582-b019-d8ba5ba6c57c": {
"main": [
[
{
"node": "168334bc-97c8-490b-a1fc-0acb8066912d",
"type": "main",
"index": 0
}
],
[
{
"node": "f7b1385e-6a0a-470c-93cd-55ba1da56ee4",
"type": "main",
"index": 0
}
]
]
},
"825c2125-1914-4e4b-9d6e-b67a2e3b11ce": {
"main": [
[
{
"node": "3b4b6746-99e0-4d6b-a620-fc8c89974eee",
"type": "main",
"index": 1
}
]
]
},
"6ee6f742-ce91-4bdc-a3ea-769a06cf2512": {
"main": [
[
{
"node": "087335ab-ae10-46c5-8608-eafa51d47ed7",
"type": "main",
"index": 0
}
],
[
{
"node": "3f93e040-46e2-4c71-b0b2-548bcfe04235",
"type": "main",
"index": 0
}
],
[
{
"node": "6b5e1a57-2c26-4bbe-b104-99ef776f867c",
"type": "main",
"index": 0
}
]
]
},
"2255b19e-1842-4e23-9fcf-0c69b036226b": {
"main": [
[
{
"node": "ee8c0749-6302-420d-9fff-cb57dfef3b9e",
"type": "main",
"index": 0
}
]
]
},
"101a971e-3fae-445e-96ac-878650a6d14a": {
"main": [
[
{
"node": "df2d7bc1-4628-4a08-8a55-6de9111eea4c",
"type": "main",
"index": 0
}
],
[
{
"node": "57f8e9fb-3175-4975-9775-e134e94eb6e4",
"type": "main",
"index": 0
}
]
]
},
"3f93e040-46e2-4c71-b0b2-548bcfe04235": {
"main": [
[
{
"node": "64cf332a-2691-4181-a244-4cc18f9a1b13",
"type": "main",
"index": 0
}
]
]
},
"87bae272-a305-4573-b651-8a0428d13fce": {
"main": [
[
{
"node": "0a211848-c56f-4602-a8f5-e0a63e9c0631",
"type": "main",
"index": 0
}
],
[
{
"node": "825c2125-1914-4e4b-9d6e-b67a2e3b11ce",
"type": "main",
"index": 0
}
]
]
},
"56635bec-8887-4b1d-90fd-a4cf35484f57": {
"main": [
[
{
"node": "3b4b6746-99e0-4d6b-a620-fc8c89974eee",
"type": "main",
"index": 1
}
]
]
},
"f7b1385e-6a0a-470c-93cd-55ba1da56ee4": {
"main": [
[
{
"node": "3b4b6746-99e0-4d6b-a620-fc8c89974eee",
"type": "main",
"index": 1
}
]
]
},
"53dbdfb5-0e9e-4e03-81d3-ed01714978ba": {
"main": [
[
{
"node": "101a971e-3fae-445e-96ac-878650a6d14a",
"type": "main",
"index": 0
}
]
]
},
"df2d7bc1-4628-4a08-8a55-6de9111eea4c": {
"main": [
[
{
"node": "e5ac2a2d-bbdd-4582-b019-d8ba5ba6c57c",
"type": "main",
"index": 0
}
]
]
},
"5c692947-9802-43d7-848a-61d9fa01f02a": {
"main": [
[
{
"node": "803eb0cb-f941-44cb-89dc-3813ec26d3c9",
"type": "main",
"index": 0
}
]
]
},
"cd20f833-a887-46c4-9702-94e53780552d": {
"main": [
[
{
"node": "87bae272-a305-4573-b651-8a0428d13fce",
"type": "main",
"index": 0
}
]
]
},
"416be5d3-78da-4837-b312-5edd184216b5": {
"ai_outputParser": [
[
{
"node": "53dbdfb5-0e9e-4e03-81d3-ed01714978ba",
"type": "ai_outputParser",
"index": 0
}
]
]
}
}
}¿Cómo usar este flujo de trabajo?
Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.
¿En qué escenarios es adecuado este flujo de trabajo?
Avanzado - Creación de contenido, IA Multimodal
¿Es de pago?
Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.
Flujos de trabajo relacionados recomendados
David Olusola
@dae221I design enterprise-grade automation systems that eliminate bottlenecks, cut manual work by 70%+, and unlock millions in lost revenue opportunities. My clients — typically achieve 5–10x ROI within the first 90 days. Currently partnering with select high-growth companies ready to scale faster with AI automation. david@daexai.com
Compartir este flujo de trabajo