Système de filtrage et de planification d'entretiens pour les candidats par IA
Ceci est unHR, AI Summarizationworkflow d'automatisation du domainecontenant 18 nœuds.Utilise principalement des nœuds comme If, Code, Webhook, EmailSend, GoogleSheets. Sélection des candidats et planification des entretiens basées sur l'IA (OpenAI GPT et Google Workspace)
- •Point de terminaison HTTP Webhook (généré automatiquement par n8n)
- •Informations d'identification Google Sheets API
- •Clé API OpenAI
Catégorie
{
"id": "pHbBtdjeo2u8avrY",
"meta": {
"instanceId": "dd69efaf8212c74ad206700d104739d3329588a6f3f8381a46a481f34c9cc281",
"templateCredsSetupCompleted": true
},
"name": "AI Candidate Screening & Interview Scheduler",
"tags": [],
"nodes": [
{
"id": "6bb2e121-0353-43a0-96f3-1e881f9ea9e9",
"name": "Webhook - Recevoir la Candidature",
"type": "n8n-nodes-base.webhook",
"notes": "📥 ENTRY POINT\n\nThis webhook receives job applications from candidates.\n\nExpected data:\n- Candidate Name\n- Email\n- Phone\n- Resume (URL or text)\n- Cover Letter\n- Years of Experience\n- Skills\n\nURL: https://your-n8n-instance.com/webhook/job-application",
"position": [
-1008,
1552
],
"webhookId": "job-application-webhook",
"parameters": {
"path": "job-application",
"options": {},
"responseMode": "responseNode"
},
"typeVersion": 1
},
{
"id": "8fa4ef36-d737-446c-a4aa-ca7eef8654dc",
"name": "Note - Aperçu du Workflow",
"type": "n8n-nodes-base.stickyNote",
"position": [
-832,
576
],
"parameters": {
"color": 3,
"width": 350,
"height": 400,
"content": "## 📋 Workflow Overview\n\nThis workflow automates the complete recruitment process:\n\n1️⃣ Receive applications via webhook\n2️⃣ Store in database/spreadsheet\n3️⃣ AI evaluates candidate fit\n4️⃣ Score and rank candidates\n5️⃣ Send notifications\n6️⃣ Schedule interviews for qualified candidates\n\n**Role:** Automation Specialist\n**AI Used:** OpenAI GPT for evaluation"
},
"typeVersion": 1
},
{
"id": "a34130de-94c4-4760-8883-3b778afe6319",
"name": "Google Sheets - Stocker la Candidature",
"type": "n8n-nodes-base.googleSheets",
"notes": "💾 DATA STORAGE\n\nStores all application data in Google Sheets for:\n- Easy tracking and management\n- Historical record keeping\n- Team collaboration\n- Backup of all applications\n\nAlternative: Can use Airtable, PostgreSQL, or MySQL instead",
"position": [
-784,
1552
],
"parameters": {
"columns": {
"value": {},
"schema": [],
"mappingMode": "autoMapInputData",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "=Applications"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "=34yuhedwqre"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"id": "ScSS2KxGQULuPtdy",
"name": "Google Sheets- test"
}
},
"typeVersion": 4
},
{
"id": "47f948e2-6945-4b41-95fb-7ffc04d488af",
"name": "Note - Informations de Stockage",
"type": "n8n-nodes-base.stickyNote",
"position": [
-848,
1136
],
"parameters": {
"color": 5,
"width": 220,
"height": 584,
"content": "## 📊 Database Storage\n\nApplications are stored with:\n- Timestamp\n- Contact information\n- Experience details\n- Skills list\n- Resume link\n- Current status\n\nThis creates an applicant tracking system (ATS)"
},
"typeVersion": 1
},
{
"id": "dc349940-72dc-49bf-b44f-68510c5e923a",
"name": "OpenAI - Évaluation des Candidats par IA",
"type": "@n8n/n8n-nodes-langchain.openAi",
"notes": "🤖 AI EVALUATION ENGINE\n\nUses GPT-4 to:\n- Analyze candidate qualifications\n- Match skills against job requirements\n- Identify strengths and gaps\n- Provide objective scoring (0-100)\n- Generate hiring recommendation\n\nBenefits:\n- Consistent evaluation criteria\n- Unbiased initial screening\n- Faster processing\n- Detailed insights",
"position": [
-560,
1552
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "id",
"value": "=add your model"
},
"options": {
"temperature": 0.3
},
"messages": {
"values": [
{
"content": "=Your name is Rayan and you are an expert technical recruiter evaluating candidates for an Automation Specialist position.\n\nJob Requirements:\n- 3+ years of experience in automation\n- Strong skills in n8n, Make.com, or Zapier\n- Programming: Python, JavaScript\n- API integration experience\n- Workflow design expertise\n- Problem-solving abilities\n\nCandidate Information:\nName: {{ $json.body.name }}\nExperience: {{ $json.body.experience }} years\nSkills: {{ $json.body.skills }}\nResume Summary: {{ $json.body.resume }}\n\nEvaluate this candidate and provide:\n1. Overall Score (0-100)\n2. Strengths (3-5 points)\n3. Weaknesses (2-3 points)\n4. Recommendation (Strong Hire / Hire / Maybe / Reject)\n5. Key concerns or highlights\n\nFormat your response as JSON:\n{\n \"score\": 85,\n \"recommendation\": \"Hire\",\n \"strengths\": [\"...\"],\n \"weaknesses\": [\"...\"],\n \"summary\": \"...\"\n}"
}
]
}
},
"credentials": {
"openAiApi": {
"id": "CDQ16eImh6D4tY15",
"name": "OpenAi account 2 - test"
}
},
"typeVersion": 1
},
{
"id": "a99cf7ab-03db-4a7e-98fe-4a8025a03cd2",
"name": "Note - Processus IA",
"type": "n8n-nodes-base.stickyNote",
"position": [
-608,
1136
],
"parameters": {
"color": 5,
"width": 204,
"height": 584,
"content": "## 🧠 AI Evaluation\n\nThe AI analyzes:\n✓ Experience level match\n✓ Technical skills alignment\n✓ Automation tool proficiency\n✓ Programming capabilities\n✓ Overall candidate fit\n\nOutput: Structured evaluation report"
},
"typeVersion": 1
},
{
"id": "2a7f8223-ee02-4c1a-90c4-9cda4ac86831",
"name": "Code - Traiter l'Évaluation",
"type": "n8n-nodes-base.code",
"notes": "⚙️ DATA PROCESSING\n\nThis node:\n- Parses AI evaluation response\n- Extracts structured data (score, recommendation)\n- Combines candidate + evaluation data\n- Determines next step (Interview or Reject)\n- Handles errors gracefully\n\nThreshold: Score ≥ 70 → Interview",
"position": [
-336,
1552
],
"parameters": {
"jsCode": "// Parse AI response and structure data\nconst aiResponse = $input.first().json.message.content;\nlet evaluation;\n\ntry {\n // Extract JSON from AI response\n const jsonMatch = aiResponse.match(/\\{[\\s\\S]*\\}/);\n evaluation = JSON.parse(jsonMatch[0]);\n} catch (error) {\n // Fallback if JSON parsing fails\n evaluation = {\n score: 50,\n recommendation: \"Needs Review\",\n strengths: [\"Unable to parse\"],\n weaknesses: [\"AI response format error\"],\n summary: aiResponse\n };\n}\n\n// Get original application data\nconst applicationData = $('Webhook - Receive Application').first().json.body;\n\n// Combine all data\nreturn {\n json: {\n candidate: {\n name: applicationData.name,\n email: applicationData.email,\n phone: applicationData.phone,\n experience: applicationData.experience,\n skills: applicationData.skills\n },\n evaluation: {\n score: evaluation.score,\n recommendation: evaluation.recommendation,\n strengths: evaluation.strengths,\n weaknesses: evaluation.weaknesses,\n summary: evaluation.summary,\n evaluatedAt: new Date().toISOString()\n },\n decision: evaluation.score >= 70 ? \"Interview\" : \"Reject\"\n }\n};"
},
"typeVersion": 2
},
{
"id": "890d9265-4b7c-4cee-8541-08ac6dd7832d",
"name": "IF - Vérifier le Seuil de Score",
"type": "n8n-nodes-base.if",
"notes": "🔀 DECISION POINT\n\nRoutes candidates based on evaluation:\n\n✅ TRUE (Score ≥ 70):\n- Send interview invitation\n- Schedule meeting\n- Update status to 'Interview Scheduled'\n\n❌ FALSE (Score < 70):\n- Send rejection email\n- Update status to 'Rejected'\n- Archive application",
"position": [
-112,
1552
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $json.decision }}",
"value2": "Interview",
"operation": "equals"
}
]
}
},
"typeVersion": 1
},
{
"id": "d9d8619f-79bf-47d8-b0fd-7f7e9d1054e1",
"name": "Note - Logique de Décision",
"type": "n8n-nodes-base.stickyNote",
"position": [
-368,
1216
],
"parameters": {
"color": 5,
"width": 380,
"height": 496,
"content": "## 🎯 Scoring Logic\n\nScore ≥ 70: Qualified for interview\nScore < 70: Not a fit\n\nThis threshold can be adjusted based on:\n- Role requirements\n- Application volume\n- Hiring urgency"
},
"typeVersion": 1
},
{
"id": "5ee3c07a-d3b2-4c73-aadc-54ef03bf7ec9",
"name": "Email - Invitation à l'Entretien",
"type": "n8n-nodes-base.emailSend",
"notes": "✉️ INTERVIEW INVITATION\n\nSends personalized email to qualified candidates:\n- Congratulatory message\n- Evaluation highlights\n- Next steps information\n- Request for confirmation\n\nAlternative: Use SendGrid, Gmail, or Outlook node",
"position": [
112,
1456
],
"webhookId": "e0dcc54e-4b72-4a8f-af17-f5dd7843f753",
"parameters": {
"text": "=Dear {{ $json.candidate.name }},\n\nCongratulations! We were impressed with your application for the Automation Specialist position.\n\nEvaluation Summary:\n- Overall Score: {{ $json.evaluation.score }}/100\n- Recommendation: {{ $json.evaluation.recommendation }}\n\nStrengths:\n{{ $json.evaluation.strengths.join('\\n- ') }}\n\nWe would like to invite you for an interview. Our team will reach out shortly to schedule a convenient time.\n\nPlease reply to confirm your continued interest.\n\nBest regards,\nHR Team",
"options": {},
"subject": "Interview Invitation - Automation Specialist Position",
"toEmail": "={{ $json.candidate.email }}",
"fromEmail": "hr@company.com"
},
"credentials": {
"smtp": {
"id": "3QSx1pWoS0BZcK4c",
"name": "SMTP account"
}
},
"typeVersion": 2
},
{
"id": "695c0973-9c31-47a2-88ec-24b7989089b4",
"name": "Email - Lettre de Rejet",
"type": "n8n-nodes-base.emailSend",
"notes": "✉️ REJECTION NOTICE\n\nSends professional rejection email:\n- Respectful and kind tone\n- Thanks candidate for interest\n- Encourages future applications\n- Maintains company reputation\n\nBest practice: Always send closure to candidates",
"position": [
336,
1648
],
"webhookId": "1c10023a-2b19-46de-a049-c4fb38cb13a0",
"parameters": {
"text": "=Dear {{ $json.candidate.name }},\n\nThank you for your interest in the Automation Specialist position at our company.\n\nAfter careful review of your application, we have decided to move forward with other candidates whose experience more closely matches our current requirements.\n\nWe appreciate the time you invested in your application and encourage you to apply for future opportunities that align with your skills.\n\nWe wish you the best in your job search.\n\nBest regards,\nHR Team",
"options": {},
"subject": "Application Update - Automation Specialist Position",
"toEmail": "={{ $json.candidate.email }}",
"fromEmail": "hr@company.com"
},
"credentials": {
"smtp": {
"id": "3QSx1pWoS0BZcK4c",
"name": "SMTP account"
}
},
"typeVersion": 2
},
{
"id": "37081a08-cac7-403e-a6a1-f67b00efd078",
"name": "Google Calendar - Planifier l'Entretien",
"type": "n8n-nodes-base.googleCalendar",
"notes": "📅 INTERVIEW SCHEDULING\n\nAutomatically creates calendar event:\n- Scheduled 3 days in advance\n- 1-hour duration\n- Includes candidate details\n- Adds evaluation summary\n- Invites candidate + hiring manager\n- Sends calendar invites\n\nAlternative: Use Calendly API integration",
"position": [
336,
1456
],
"parameters": {
"end": "={{ $now.plus(3, 'days').set({ hour: 11, minute: 0 }).toISO() }}",
"start": "={{ $now.plus(3, 'days').set({ hour: 10, minute: 0 }).toISO() }}",
"calendar": {
"__rl": true,
"mode": "id",
"value": "=9ikjnhy65trfdser4"
},
"additionalFields": {}
},
"credentials": {
"googleCalendarOAuth2Api": {
"id": "6ldLmzzYtaqng4pw",
"name": "Google Calendar account - test"
}
},
"typeVersion": 1
},
{
"id": "56ed8c49-514c-47e2-a83e-e453ce7894ea",
"name": "Note - Logique des Emails",
"type": "n8n-nodes-base.stickyNote",
"position": [
64,
1152
],
"parameters": {
"color": 5,
"width": 428,
"height": 656,
"content": "## 📧 Email Notifications\n\nTwo paths:\n\n1️⃣ HIGH SCORE:\n- Interview invitation\n- Positive feedback\n- Schedule interview\n\n2️⃣ LOW SCORE:\n- Professional rejection\n- Kind closure\n- Future encouragement"
},
"typeVersion": 1
},
{
"id": "56eeb778-14d9-41db-b9a6-279d8c4d9027",
"name": "Update Sheet - Statut de l'Entretien",
"type": "n8n-nodes-base.googleSheets",
"notes": "📝 STATUS UPDATE - INTERVIEW\n\nUpdates Google Sheet with:\n- Status: 'Interview Scheduled'\n- AI evaluation score\n- Recommendation level\n- Interview date\n\nThis keeps the ATS current for HR team tracking",
"position": [
560,
1456
],
"parameters": {
"columns": {
"value": {},
"schema": [],
"mappingMode": "autoMapInputData",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": "Applications",
"documentId": {
"__rl": true,
"mode": "id",
"value": "=koi8uhbvfgtyuj"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"id": "ScSS2KxGQULuPtdy",
"name": "Google Sheets- test"
}
},
"typeVersion": 4
},
{
"id": "7e36df56-3674-4f34-af49-e3809b946f4b",
"name": "Update Sheet - Statut du Rejet",
"type": "n8n-nodes-base.googleSheets",
"notes": "📝 STATUS UPDATE - REJECTION\n\nUpdates Google Sheet with:\n- Status: 'Rejected'\n- AI evaluation score\n- Recommendation (for records)\n- Rejection date\n\nMaintains complete audit trail",
"position": [
560,
1648
],
"parameters": {
"columns": {
"value": {},
"schema": [],
"mappingMode": "autoMapInputData",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "id",
"value": "=Applications"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "=hgt567ikmnhjuio9"
},
"authentication": "serviceAccount"
},
"credentials": {
"googleApi": {
"id": "ScSS2KxGQULuPtdy",
"name": "Google Sheets- test"
}
},
"typeVersion": 4
},
{
"id": "140accea-6390-4317-ae76-cfad1da6b1ee",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"notes": "📤 WEBHOOK RESPONSE\n\nSends confirmation back to application form:\n- Success status\n- Confirmation message\n- Processing status\n\nThis closes the webhook connection and confirms receipt to the applicant",
"position": [
784,
1552
],
"parameters": {
"options": {},
"respondWith": "json",
"responseBody": "={{ {\"success\": true, \"message\": \"Application received and processed\", \"candidateName\": $json.candidate.name, \"status\": $json.decision} }}"
},
"typeVersion": 1
},
{
"id": "2611d5c3-fedf-4a2b-ac0b-21a42ad532eb",
"name": "Note - Finalisation",
"type": "n8n-nodes-base.stickyNote",
"position": [
528,
1088
],
"parameters": {
"color": 5,
"width": 396,
"height": 728,
"content": "## 🎉 Workflow Complete!\n\nFinal steps:\n1. Status updated in database\n2. Emails sent to candidate\n3. Calendar scheduled (if interview)\n4. Response sent to form\n\n**Metrics to Track:**\n- Applications received\n- Average AI score\n- Interview rate\n- Time to process"
},
"typeVersion": 1
},
{
"id": "80c5dc1a-90c0-4323-8fa9-a92811241fba",
"name": "Note - Instructions de Configuration",
"type": "n8n-nodes-base.stickyNote",
"position": [
-400,
672
],
"parameters": {
"color": 4,
"width": 398,
"height": 412,
"content": "## 🔧 Configuration Required\n\n**Environment Variables:**\n- GOOGLE_SHEET_ID: Your Google Sheet ID\n\n**Credentials Needed:**\n1. Google Sheets OAuth2\n2. OpenAI API Key\n3. SMTP Email Account\n4. Google Calendar OAuth2\n\n**Customize:**\n- Job requirements in AI prompt\n- Score threshold (currently 70)\n- Email templates\n- Interview scheduling time"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "1f088f30-607a-4797-9576-0dd517138820",
"connections": {
"695c0973-9c31-47a2-88ec-24b7989089b4": {
"main": [
[
{
"node": "7e36df56-3674-4f34-af49-e3809b946f4b",
"type": "main",
"index": 0
}
]
]
},
"2a7f8223-ee02-4c1a-90c4-9cda4ac86831": {
"main": [
[
{
"node": "890d9265-4b7c-4cee-8541-08ac6dd7832d",
"type": "main",
"index": 0
}
]
]
},
"890d9265-4b7c-4cee-8541-08ac6dd7832d": {
"main": [
[
{
"node": "5ee3c07a-d3b2-4c73-aadc-54ef03bf7ec9",
"type": "main",
"index": 0
}
],
[
{
"node": "695c0973-9c31-47a2-88ec-24b7989089b4",
"type": "main",
"index": 0
}
]
]
},
"5ee3c07a-d3b2-4c73-aadc-54ef03bf7ec9": {
"main": [
[
{
"node": "37081a08-cac7-403e-a6a1-f67b00efd078",
"type": "main",
"index": 0
}
]
]
},
"6bb2e121-0353-43a0-96f3-1e881f9ea9e9": {
"main": [
[
{
"node": "a34130de-94c4-4760-8883-3b778afe6319",
"type": "main",
"index": 0
}
]
]
},
"56eeb778-14d9-41db-b9a6-279d8c4d9027": {
"main": [
[
{
"node": "140accea-6390-4317-ae76-cfad1da6b1ee",
"type": "main",
"index": 0
}
]
]
},
"7e36df56-3674-4f34-af49-e3809b946f4b": {
"main": [
[
{
"node": "140accea-6390-4317-ae76-cfad1da6b1ee",
"type": "main",
"index": 0
}
]
]
},
"dc349940-72dc-49bf-b44f-68510c5e923a": {
"main": [
[
{
"node": "2a7f8223-ee02-4c1a-90c4-9cda4ac86831",
"type": "main",
"index": 0
}
]
]
},
"a34130de-94c4-4760-8883-3b778afe6319": {
"main": [
[
{
"node": "dc349940-72dc-49bf-b44f-68510c5e923a",
"type": "main",
"index": 0
}
]
]
},
"37081a08-cac7-403e-a6a1-f67b00efd078": {
"main": [
[
{
"node": "56eeb778-14d9-41db-b9a6-279d8c4d9027",
"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
Oneclick AI Squad
@oneclick-aiThe AI Squad Initiative is a pioneering effort to build, automate and scale AI-powered workflows using n8n.io. Our mission is to help individuals and businesses integrate AI agents seamlessly into their daily operations from automating tasks and enhancing productivity to creating innovative, intelligent solutions. We design modular, reusable AI workflow templates that empower creators, developers and teams to supercharge their automation with minimal effort and maximum impact.
Partager ce workflow