Proceso de reclutamiento impulsado por IA con GPT-4o-mini: de filtrado de CVs a agendamiento de entrevistas
Este es unHR, AI Summarizationflujo de automatización del dominio deautomatización que contiene 21 nodos.Utiliza principalmente nodos como Slack, Filter, Webhook, Airtable, EmailSend. Usar GPT-4o-mini en Airtable para automatizar contrataciones: desde el cribado de CVs hasta la programación de entrevistas
- •Bot Token de Slack o URL de Webhook
- •Punto final de HTTP Webhook (n8n generará automáticamente)
- •Clave de API de Airtable
- •Pueden requerirse credenciales de autenticación para la API de destino
- •Clave de API de OpenAI
Nodos utilizados (21)
Categoría
{
"id": "i7hRouNsQLAJJg4F",
"meta": {
"instanceId": "b91e510ebae4127f953fd2f5f8d40d58ca1e71c746d4500c12ae86aad04c1502"
},
"name": "AI-Powered GPT-4o-mini Recruitment Pipeline: CV Screening to Interview Scheduler",
"tags": [],
"nodes": [
{
"id": "2a69b990-5536-4825-81e2-682ef75fe7a2",
"name": "Webhook - Recibir CV",
"type": "n8n-nodes-base.webhook",
"position": [
112,
352
],
"webhookId": "21c60b52-4d15-48a2-9a70-d51be54905e1",
"parameters": {
"path": "candidate-cv",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode"
},
"typeVersion": 2
},
{
"id": "6e476a4e-e2bb-4298-9ddc-5829aeb8306f",
"name": "Airtable - Almacenar Candidato",
"type": "n8n-nodes-base.airtable",
"position": [
304,
208
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appXXXXXXXXXXXXXX",
"cachedResultName": "Candidates"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblCandidates",
"cachedResultName": "Candidates"
},
"columns": {
"value": {
"Name": "={{ $json.body.name }}",
"Email": "={{ $json.body.email }}",
"Phone": "={{ $json.body.phone }}",
"CV_URL": "={{ $json.body.cv_url }}",
"Status": "New Application",
"Application_Date": "={{ $now.toISO() }}",
"Position_Applied": "={{ $json.body.position }}"
},
"mappingMode": "defineBelow"
},
"options": {},
"operation": "create",
"authentication": "oAuth2"
},
"typeVersion": 2
},
{
"id": "56b8fd3c-8f51-44c5-a39c-80c002da4cc7",
"name": "HTTP Solicitud - Descargar CV",
"type": "n8n-nodes-base.httpRequest",
"position": [
272,
432
],
"parameters": {
"url": "={{ $('Webhook - Receive CV').item.json.body.cv_url }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "477e1bb2-ddce-4655-b148-5eddff7a0672",
"name": "IA - Extraer Datos del CV",
"type": "@n8n/n8n-nodes-langchain.informationExtractor",
"position": [
400,
432
],
"parameters": {
"options": {}
},
"typeVersion": 1
},
{
"id": "0fdb2b79-b63d-42be-9ddc-2cee4cf5a83c",
"name": "OpenAI Modelo de Chat",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
400,
592
],
"parameters": {
"options": {}
},
"typeVersion": 1
},
{
"id": "ea434fe7-5922-4413-9d94-a1bb049a1a13",
"name": "Airtable - Obtener Requisitos del Puesto",
"type": "n8n-nodes-base.airtable",
"position": [
464,
224
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appXXXXXXXXXXXXXX",
"cachedResultName": "Candidates"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblJobRequirements",
"cachedResultName": "Job Requirements"
},
"options": {},
"operation": "search",
"authentication": "oAuth2",
"filterByFormula": "=AND({Position}='{{ $('Webhook - Receive CV').item.json.body.position }}', {Active}=TRUE())"
},
"typeVersion": 2
},
{
"id": "529064ba-9f1e-4a4c-aa5e-ccbae81f2e57",
"name": "Agente de IA - Evaluación de Calificación",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
704,
352
],
"parameters": {
"text": "=You are a recruitment AI assistant. Analyze if this candidate matches the job requirements.\n\nCandidate Profile:\n{{ $json.text }}\n\nJob Requirements:\n- Position: {{ $('Airtable - Get Job Requirements').item.json.Position }}\n- Required Experience: {{ $('Airtable - Get Job Requirements').item.json.Required_Experience }} years\n- Required Skills: {{ $('Airtable - Get Job Requirements').item.json.Required_Skills }}\n- Education Required: {{ $('Airtable - Get Job Requirements').item.json.Education_Required }}\n- Nice to Have: {{ $('Airtable - Get Job Requirements').item.json.Nice_To_Have }}\n\nProvide:\n1. Match Score (0-100)\n2. Qualification Status (Highly Qualified / Qualified / Potentially Qualified / Not Qualified)\n3. Strengths (3 key points)\n4. Gaps (areas where candidate doesn't meet requirements)\n5. Recommendation (Interview / Phone Screen / Reject)\n\nFormat as JSON: {\"match_score\": number, \"status\": string, \"strengths\": [string], \"gaps\": [string], \"recommendation\": string, \"reasoning\": string}",
"options": {
"systemMessage": "You are an expert recruitment AI that provides objective, fair candidate assessments based on qualifications and job requirements."
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.7
},
{
"id": "2f34882a-fce9-4f89-9563-438f9aa82795",
"name": "OpenAI Modelo de Chat de Evaluación",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
704,
576
],
"parameters": {
"model": "gpt-4o",
"options": {
"temperature": 0.3
}
},
"typeVersion": 1
},
{
"id": "c68e5f48-5033-45f5-b7a7-75bfa8f472b6",
"name": "Analizador de Salida Estructurada",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
864,
576
],
"parameters": {},
"typeVersion": 1.2
},
{
"id": "259d8989-fd79-402d-8993-00eafc43e86c",
"name": "Airtable - Actualizar Evaluación",
"type": "n8n-nodes-base.airtable",
"position": [
976,
352
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appXXXXXXXXXXXXXX",
"cachedResultName": "Candidates"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblCandidates",
"cachedResultName": "Candidates"
},
"columns": {
"value": {
"Skills": "={{ $('AI - Extract CV Data').item.json.skills.join(', ') }}",
"Status": "={{ $json.recommendation === 'Reject' ? 'Rejected' : 'Qualified' }}",
"AI_Gaps": "={{ $json.gaps.join(', ') }}",
"Education": "={{ $('AI - Extract CV Data').item.json.education }}",
"Match_Score": "={{ $json.match_score }}",
"AI_Reasoning": "={{ $json.reasoning }}",
"AI_Strengths": "={{ $json.strengths.join(', ') }}",
"Years_Experience": "={{ $('AI - Extract CV Data').item.json.years_experience }}",
"AI_Recommendation": "={{ $json.recommendation }}",
"Qualification_Status": "={{ $json.status }}"
},
"mappingMode": "defineBelow"
},
"options": {},
"operation": "update",
"authentication": "oAuth2"
},
"typeVersion": 2
},
{
"id": "dda61fa4-8d96-40d3-aa9f-2feac1b03fe9",
"name": "Filtro - Candidatos Calificados",
"type": "n8n-nodes-base.filter",
"position": [
1136,
224
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "f8db4e5d-3c5e-4e0a-a0a5-d4c8e2d0a3f1",
"operator": {
"type": "string",
"operation": "notEquals"
},
"leftValue": "={{ $json.recommendation }}",
"rightValue": "Reject"
}
]
}
},
"typeVersion": 2.1
},
{
"id": "eb06c596-bfed-4bd2-8d5d-6eec33740b1b",
"name": "Agente de IA - Generar Correo",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1296,
224
],
"parameters": {
"text": "=Generate a personalized recruitment email for this candidate.\n\nCandidate: {{ $('Airtable - Store Candidate').item.json.Name }}\nPosition: {{ $('Webhook - Receive CV').item.json.body.position }}\nMatch Score: {{ $json.match_score }}\nStatus: {{ $json.status }}\nRecommendation: {{ $json.recommendation }}\n\nKey Strengths:\n{{ $json.strengths.join('\\n') }}\n\nEmail should:\n- Be professional and warm\n- Congratulate them on their application\n- Mention 1-2 specific strengths that stood out\n- {{ $json.recommendation === 'Interview' ? 'Invite them for a formal interview' : 'Suggest a preliminary phone screening' }}\n- Include next steps\n- Be concise (150-200 words)\n\nProvide: {\"subject\": string, \"body\": string}",
"options": {
"systemMessage": "You are a professional recruitment communications specialist. Write engaging, personalized emails that make candidates feel valued."
},
"promptType": "define"
},
"typeVersion": 1.7
},
{
"id": "558ed33e-f2e1-41a6-af31-699ba4324675",
"name": "OpenAI Modelo de Chat para Correo",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1296,
448
],
"parameters": {
"options": {}
},
"credentials": {
"openAiApi": {
"id": "OGYj7DgYv5GFLFZk",
"name": "OpenAi account 2"
}
},
"typeVersion": 1
},
{
"id": "12222fa6-a277-4af1-8cbb-7b27c67ea2d0",
"name": "Enviar Correo - Contactar Candidato",
"type": "n8n-nodes-base.emailSend",
"position": [
1584,
224
],
"webhookId": "88019c7f-4d4b-4fda-af01-f3021ccb399c",
"parameters": {
"options": {},
"subject": "={{ $json.subject }}",
"toEmail": "={{ $('Airtable - Store Candidate').item.json.Email }}",
"fromEmail": "recruitment@company.com"
},
"typeVersion": 2.1
},
{
"id": "72a2753a-535f-4e77-9901-a4007124c76a",
"name": "Filtro - Candidatos para Entrevista",
"type": "n8n-nodes-base.filter",
"position": [
1760,
224
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "a2c4f6e8-1b3d-4a7c-9e5f-0d8b2c4a6e1f",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $('AI Agent - Qualification Assessment').item.json.recommendation }}",
"rightValue": "Interview"
}
]
}
},
"typeVersion": 2.1
},
{
"id": "0a7e25e8-767a-4e1f-ae2e-c398efabca7c",
"name": "Google Calendario - Programar Entrevista",
"type": "n8n-nodes-base.googleCalendar",
"position": [
1984,
224
],
"parameters": {
"end": "={{ $now.plus({ days: 3, hours: 1 }).toISO() }}",
"start": "={{ $now.plus({ days: 3 }).toISO() }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": "primary",
"cachedResultName": "Primary"
},
"additionalFields": {}
},
"typeVersion": 1.2
},
{
"id": "7d6c9426-4719-4516-b8f5-dcd5e86170f3",
"name": "Airtable - Actualizar Detalles de Entrevista",
"type": "n8n-nodes-base.airtable",
"position": [
2208,
224
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appXXXXXXXXXXXXXX",
"cachedResultName": "Candidates"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblCandidates",
"cachedResultName": "Candidates"
},
"columns": {
"value": {
"Status": "Interview Scheduled",
"Interview_Link": "={{ $json.hangoutLink }}",
"Calendar_Event_ID": "={{ $json.id }}",
"Interview_Scheduled": "={{ $json.start.dateTime }}"
},
"mappingMode": "defineBelow"
},
"options": {},
"operation": "update",
"authentication": "oAuth2"
},
"typeVersion": 2
},
{
"id": "993a2d90-9ec0-4ba5-9c3f-0704704dd8ae",
"name": "Slack - Enviar Notificación",
"type": "n8n-nodes-base.slack",
"position": [
1664,
432
],
"webhookId": "e7445fd1-5292-4e82-923a-e979940ba3b3",
"parameters": {
"text": "=🎯 *New Candidate Processed*\n\n*Candidate:* {{ $('Airtable - Store Candidate').item.json.Name }}\n*Position:* {{ $('Webhook - Receive CV').item.json.body.position }}\n*Match Score:* {{ $('AI Agent - Qualification Assessment').item.json.match_score }}%\n*Status:* {{ $('AI Agent - Qualification Assessment').item.json.status }}\n*Recommendation:* {{ $('AI Agent - Qualification Assessment').item.json.recommendation }}\n\n*Key Strengths:*\n{{ $('AI Agent - Qualification Assessment').item.json.strengths.map((s, i) => `${i+1}. ${s}`).join('\\n') }}\n\n{{ $('AI Agent - Qualification Assessment').item.json.recommendation === 'Interview' ? '📅 *Interview Scheduled:* ' + $now.plus({ days: 3 }).toFormat('MMM dd, yyyy HH:mm') : '📞 *Next Step:* Phone screening' }}\n\n<https://airtable.com/appXXXXXXXXXXXXXX/tblCandidates/{{ $('Airtable - Store Candidate').item.json.id }}|View in Airtable>",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C0123456789",
"cachedResultName": "#recruitment"
},
"otherOptions": {}
},
"typeVersion": 2.2
},
{
"id": "9d640257-d798-4d6a-97ad-0e1344c459b9",
"name": "Responder a Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
2384,
352
],
"parameters": {
"options": {},
"respondWith": "json",
"responseBody": "={{ {\n \"success\": true,\n \"candidate_id\": $('Airtable - Store Candidate').item.json.id,\n \"name\": $('Airtable - Store Candidate').item.json.Name,\n \"match_score\": $('AI Agent - Qualification Assessment').item.json.match_score,\n \"status\": $('AI Agent - Qualification Assessment').item.json.status,\n \"recommendation\": $('AI Agent - Qualification Assessment').item.json.recommendation,\n \"message\": \"Application processed successfully\"\n} }}"
},
"typeVersion": 1.1
},
{
"id": "1ca1599c-5e50-4231-b384-73e58678fce9",
"name": "Nota Adhesiva",
"type": "n8n-nodes-base.stickyNote",
"position": [
-400,
-80
],
"parameters": {
"width": 480,
"height": 640,
"content": "## Introduction\nAutomate candidate evaluation from CV submission to interview booking. Perfect for HR teams and recruiters.\n## How It Works\nWebhook receives CVs, extracts Airtable data, AI assesses qualifications, filters candidates, sends emails, schedules Google Calendar interviews, and updates records.\n## Workflow Template\nWebhook → Airtable (Get Data) → AI Extract CV → AI Assessment → Filter Qualified → Generate Email → Send Email → Filter Interview Candidates → Schedule Calendar → Update Airtable → Slack Notification → Respond\n## Workflow Steps\n1. Receive & Store: Webhook receives CVs, saves to Airtable.\n2. Fetch & Download: Gets job criteria, downloads CVs.\n3. AI Assessment: Parses skills, scores candidates.\n4. Filter & Email: Routes qualified, sends messages.\n5. Schedule & Update: Books interviews, updates Airtable.\n6. Notify: Alerts via Slack, confirms status.\n## Setup Instructions\n1. **Webhook & Airtable:** Set URL, create tables, add credentials.\n2. **AI Configuration:** Add OpenAI key, define schema, customize scoring.\n3. **Communication:** Connect Gmail, Calendar, and Slack.\n"
},
"typeVersion": 1
},
{
"id": "7c2b3a99-8480-4344-a98f-7a223ad253ef",
"name": "Nota Adhesiva1",
"type": "n8n-nodes-base.stickyNote",
"position": [
640,
-80
],
"parameters": {
"color": 6,
"width": 448,
"height": 384,
"content": "\n## Prerequisites\n- Airtable account\n- OpenAI API key\n- Gmail and Google Calendar\n- Slack workspace (optional)\n\n## Customization\n- Multi-stage scheduling\n- ATS integration (Greenhouse, Lever)\n\n## Benefits\n- Reduces screening time by 90%\n- Ensures uniform evaluation\n- Cuts time-to-hire by 60%"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "32b604ba-da3d-49a1-89dc-7e8a37f787b7",
"connections": {
"0fdb2b79-b63d-42be-9ddc-2cee4cf5a83c": {
"ai_languageModel": [
[
{
"node": "477e1bb2-ddce-4655-b148-5eddff7a0672",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"477e1bb2-ddce-4655-b148-5eddff7a0672": {
"main": [
[
{
"node": "529064ba-9f1e-4a4c-aa5e-ccbae81f2e57",
"type": "main",
"index": 0
}
]
]
},
"2a69b990-5536-4825-81e2-682ef75fe7a2": {
"main": [
[
{
"node": "6e476a4e-e2bb-4298-9ddc-5829aeb8306f",
"type": "main",
"index": 0
},
{
"node": "56b8fd3c-8f51-44c5-a39c-80c002da4cc7",
"type": "main",
"index": 0
}
]
]
},
"558ed33e-f2e1-41a6-af31-699ba4324675": {
"ai_languageModel": [
[
{
"node": "eb06c596-bfed-4bd2-8d5d-6eec33740b1b",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"c68e5f48-5033-45f5-b7a7-75bfa8f472b6": {
"ai_outputParser": [
[
{
"node": "529064ba-9f1e-4a4c-aa5e-ccbae81f2e57",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"eb06c596-bfed-4bd2-8d5d-6eec33740b1b": {
"main": [
[
{
"node": "12222fa6-a277-4af1-8cbb-7b27c67ea2d0",
"type": "main",
"index": 0
}
]
]
},
"993a2d90-9ec0-4ba5-9c3f-0704704dd8ae": {
"main": [
[
{
"node": "9d640257-d798-4d6a-97ad-0e1344c459b9",
"type": "main",
"index": 0
}
]
]
},
"6e476a4e-e2bb-4298-9ddc-5829aeb8306f": {
"main": [
[
{
"node": "ea434fe7-5922-4413-9d94-a1bb049a1a13",
"type": "main",
"index": 0
}
]
]
},
"56b8fd3c-8f51-44c5-a39c-80c002da4cc7": {
"main": [
[
{
"node": "477e1bb2-ddce-4655-b148-5eddff7a0672",
"type": "main",
"index": 0
}
]
]
},
"259d8989-fd79-402d-8993-00eafc43e86c": {
"main": [
[
{
"node": "dda61fa4-8d96-40d3-aa9f-2feac1b03fe9",
"type": "main",
"index": 0
},
{
"node": "993a2d90-9ec0-4ba5-9c3f-0704704dd8ae",
"type": "main",
"index": 0
}
]
]
},
"2f34882a-fce9-4f89-9563-438f9aa82795": {
"ai_languageModel": [
[
{
"node": "529064ba-9f1e-4a4c-aa5e-ccbae81f2e57",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"72a2753a-535f-4e77-9901-a4007124c76a": {
"main": [
[
{
"node": "0a7e25e8-767a-4e1f-ae2e-c398efabca7c",
"type": "main",
"index": 0
}
]
]
},
"dda61fa4-8d96-40d3-aa9f-2feac1b03fe9": {
"main": [
[
{
"node": "eb06c596-bfed-4bd2-8d5d-6eec33740b1b",
"type": "main",
"index": 0
}
]
]
},
"ea434fe7-5922-4413-9d94-a1bb049a1a13": {
"main": [
[
{
"node": "529064ba-9f1e-4a4c-aa5e-ccbae81f2e57",
"type": "main",
"index": 0
}
]
]
},
"12222fa6-a277-4af1-8cbb-7b27c67ea2d0": {
"main": [
[
{
"node": "72a2753a-535f-4e77-9901-a4007124c76a",
"type": "main",
"index": 0
}
]
]
},
"529064ba-9f1e-4a4c-aa5e-ccbae81f2e57": {
"main": [
[
{
"node": "259d8989-fd79-402d-8993-00eafc43e86c",
"type": "main",
"index": 0
}
]
]
},
"7d6c9426-4719-4516-b8f5-dcd5e86170f3": {
"main": [
[
{
"node": "9d640257-d798-4d6a-97ad-0e1344c459b9",
"type": "main",
"index": 0
}
]
]
},
"0a7e25e8-767a-4e1f-ae2e-c398efabca7c": {
"main": [
[
{
"node": "7d6c9426-4719-4516-b8f5-dcd5e86170f3",
"type": "main",
"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 - Recursos Humanos, Resumen de IA
¿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
Cheng Siong Chin
@cschinProf. Cheng Siong CHIN serves as Chair Professor in Intelligent Systems Modelling and Simulation in Newcastle University, Singapore. His academic credentials include an M.Sc. in Advanced Control and Systems Engineering from The University of Manchester and a Ph.D. in Robotics from Nanyang Technological University.
Compartir este flujo de trabajo