Processus de recrutement piloté par l'IA avec GPT-4o-mini : du filtrage des CV à la planification des entretiens
Ceci est unHR, AI Summarizationworkflow d'automatisation du domainecontenant 21 nœuds.Utilise principalement des nœuds comme Slack, Filter, Webhook, Airtable, EmailSend. Automatisation du recrutement dans Airtable avec GPT-4o-mini : du criblage des CV à la planification des entretiens
- •Token Bot Slack ou URL Webhook
- •Point de terminaison HTTP Webhook (généré automatiquement par n8n)
- •Clé API Airtable
- •Peut nécessiter les informations d'identification d'authentification de l'API cible
- •Clé API OpenAI
Nœuds utilisés (21)
Catégorie
{
"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 - Recevoir le 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 - Stocker le Candidat",
"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 Requête - Télécharger le 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 - Extraire les Données du CV",
"type": "@n8n/n8n-nodes-langchain.informationExtractor",
"position": [
400,
432
],
"parameters": {
"options": {}
},
"typeVersion": 1
},
{
"id": "0fdb2b79-b63d-42be-9ddc-2cee4cf5a83c",
"name": "OpenAI Modèle de Chat",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
400,
592
],
"parameters": {
"options": {}
},
"typeVersion": 1
},
{
"id": "ea434fe7-5922-4413-9d94-a1bb049a1a13",
"name": "Airtable - Obtenir les Exigences du Poste",
"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": "Agent IA - Évaluation des Qualifications",
"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 Modèle de Chat Évaluation",
"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": "Analyseur de Sortie Structurée",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
864,
576
],
"parameters": {},
"typeVersion": 1.2
},
{
"id": "259d8989-fd79-402d-8993-00eafc43e86c",
"name": "Airtable - Mettre à Jour l'Évaluation",
"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": "Filtre - Candidats Qualifiés",
"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": "Agent IA - Générer un E-mail",
"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 Modèle de Chat E-mail",
"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": "Envoyer un E-mail - Contact Candidat",
"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": "Filtre - Candidats à l'Entretien",
"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 Calendrier - Planifier l'Entretien",
"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 - Mettre à Jour les Détails de l'Entretien",
"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 - Envoyer une Notification",
"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": "Répondre à 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": "Note Adhésive",
"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": "Note Adhésive1",
"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
}
]
]
}
}
}Comment utiliser ce workflow ?
Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.
Dans quelles scénarios ce workflow est-il adapté ?
Avancé - Ressources Humaines, Résumé IA
Est-ce payant ?
Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.
Workflows recommandés
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.
Partager ce workflow