Recruiting screening AI agent
Reads every application and CV, scores it against the job's must-haves, and flags strong candidates.
How it works
- Your application form sends the answers and the CV (PDF).
- The text is extracted from the CV.
- The agent reads the job's requirements, scores the candidate and saves the result.
- Strong candidates (7+) are posted to #hiring for a person to review.
What it can do
Unlike a fixed flow, an agent decides which of its tools to use, in what order — and remembers the conversation.
- Extracts text from PDF CVs
- Scores against your job's must-have requirements with evidence
- Saves every candidate with score and summary
- Alerts the hiring team about strong candidates
System prompt
The instructions that shape the agent. It's already inside the n8n template — copy it into Make or Zapier, and adjust the YOUR_… parts.
You screen job applicants for YOUR_COMPANY. You receive an application (answers + CV text). Be fair and consistent.
Steps:
1. Use "Job openings" to read the requirements for the role they applied for.
2. Score the candidate 1–10 against the MUST-HAVE requirements only, with 2–3 sentences of evidence from the CV.
3. Use "Save candidate" with the score and summary — always, for every applicant.
4. If the score is 7 or more, use "Notify hiring team" so a person can review and schedule an interview.
Rules:
- Judge only skills, experience and requirements. Ignore and never mention age, gender, religion, nationality, marital status, photos, or names.
- Never reject anyone yourself — you only score and summarise; humans decide.
- If the CV is empty or unreadable, save the candidate with score 0 and the note "CV unreadable".Safety rules
Built into the prompt and the tools:
- Ignores age, gender, religion, nationality, photos and names
- Never rejects anyone — humans make every decision
- Scores only against requirements you wrote
Uses your own AI key (Claude, OpenAI or another model). Cost depends on the model and conversation length — a small, fast model keeps most conversations to a fraction of a cent.
Diagram
Build it
Pick your tool — same automation, step by step.
Copy and paste straight into an n8n canvas (Ctrl+V), or download and use Import from File. Then connect your own credentials and replace every YOUR_… placeholder. AI steps use a Claude model node — swap it for OpenAI, Gemini or Ollama if you prefer.
Show code (273 lines)
{
"name": "Recruiting screening AI agent (Flowngn)",
"nodes": [
{
"parameters": {
"content": "## Recruiting screening AI agent\nReads every application and CV, scores it against the job's must-haves, and flags strong candidates.\n\n**Setup**\n1. Open each node and connect your own credentials.\n2. Replace every YOUR_… placeholder.\n3. Test once, then activate.\n\nFree template from Flowngn",
"height": 260,
"width": 340
},
"id": "47157a09-b804-49e3-ad6e-7700150ed55a",
"name": "Setup notes",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-420,
-60
]
},
{
"parameters": {
"httpMethod": "POST",
"path": "job-application",
"options": {}
},
"id": "47157a09-b804-49e3-ad6e-7700150ed55a",
"name": "Application",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
0,
0
],
"webhookId": "47157a09-b804-49e3-ad6e-7700150ed55a"
},
{
"parameters": {
"operation": "pdf",
"binaryPropertyName": "cv",
"options": {}
},
"id": "47157a09-b804-49e3-ad6e-7700150ed55a",
"name": "Read CV (PDF)",
"type": "n8n-nodes-base.extractFromFile",
"typeVersion": 1,
"position": [
300,
0
]
},
{
"parameters": {
"promptType": "define",
"text": "=Role applied for: {{ $('Application').item.json.body.role }}\nCandidate email: {{ $('Application').item.json.body.email }}\nAnswers: {{ JSON.stringify($('Application').item.json.body.answers || {}) }}\n\nCV:\n{{ ($json.text || '').slice(0, 12000) }}",
"options": {
"systemMessage": "=You screen job applicants for YOUR_COMPANY. You receive an application (answers + CV text). Be fair and consistent.\n\nSteps:\n1. Use \"Job openings\" to read the requirements for the role they applied for.\n2. Score the candidate 1–10 against the MUST-HAVE requirements only, with 2–3 sentences of evidence from the CV.\n3. Use \"Save candidate\" with the score and summary — always, for every applicant.\n4. If the score is 7 or more, use \"Notify hiring team\" so a person can review and schedule an interview.\n\nRules:\n- Judge only skills, experience and requirements. Ignore and never mention age, gender, religion, nationality, marital status, photos, or names.\n- Never reject anyone yourself — you only score and summarise; humans decide.\n- If the CV is empty or unreadable, save the candidate with score 0 and the note \"CV unreadable\"."
}
},
"id": "47157a09-b804-49e3-ad6e-7700150ed55a",
"name": "Screening agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.9,
"position": [
600,
0
]
},
{
"parameters": {
"model": {
"__rl": true,
"value": "claude-sonnet-5",
"mode": "list"
},
"options": {}
},
"id": "47157a09-b804-49e3-ad6e-7700150ed55a",
"name": "Claude model",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"typeVersion": 1.3,
"position": [
260,
220
]
},
{
"parameters": {
"sessionIdType": "customKey",
"sessionKey": "={{ $('Application').item.json.body.email }}",
"contextWindowLength": 10
},
"id": "47157a09-b804-49e3-ad6e-7700150ed55a",
"name": "Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"typeVersion": 1.3,
"position": [
430,
220
]
},
{
"parameters": {
"descriptionType": "manual",
"toolDescription": "Returns our open roles with must-have and nice-to-have requirements.",
"operation": "read",
"documentId": {
"__rl": true,
"value": "YOUR_SPREADSHEET_ID",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "Jobs",
"mode": "name"
},
"options": {}
},
"id": "47157a09-b804-49e3-ad6e-7700150ed55a",
"name": "Job openings",
"type": "n8n-nodes-base.googleSheetsTool",
"typeVersion": 4.5,
"position": [
600,
220
]
},
{
"parameters": {
"descriptionType": "manual",
"toolDescription": "Saves the candidate with score and summary.",
"operation": "append",
"documentId": {
"__rl": true,
"value": "YOUR_SPREADSHEET_ID",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "Candidates",
"mode": "name"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"date": "={{ $now.toISO() }}",
"email": "={{ $('Application').item.json.body.email }}",
"role": "={{ $('Application').item.json.body.role }}",
"score": "={{ $fromAI('score', \"Score 0-10 against must-have requirements\", 'number') }}",
"summary": "={{ $fromAI('summary', \"2-3 sentences of evidence from the CV\", 'string') }}",
"status": "to review"
}
},
"options": {}
},
"id": "47157a09-b804-49e3-ad6e-7700150ed55a",
"name": "Save candidate",
"type": "n8n-nodes-base.googleSheetsTool",
"typeVersion": 4.5,
"position": [
770,
220
]
},
{
"parameters": {
"descriptionType": "manual",
"toolDescription": "Tells the hiring team about a strong candidate (score 7+).",
"select": "channel",
"channelId": {
"__rl": true,
"value": "#hiring",
"mode": "name"
},
"text": "={{ $fromAI('message', \"Role, score, 2-line summary and the candidate's email\", 'string') }}",
"otherOptions": {}
},
"id": "47157a09-b804-49e3-ad6e-7700150ed55a",
"name": "Notify hiring team",
"type": "n8n-nodes-base.slackTool",
"typeVersion": 2.2,
"position": [
940,
220
]
}
],
"connections": {
"Application": {
"main": [
[
{
"node": "Read CV (PDF)",
"type": "main",
"index": 0
}
]
]
},
"Read CV (PDF)": {
"main": [
[
{
"node": "Screening agent",
"type": "main",
"index": 0
}
]
]
},
"Claude model": {
"ai_languageModel": [
[
{
"node": "Screening agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Memory": {
"ai_memory": [
[
{
"node": "Screening agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"Job openings": {
"ai_tool": [
[
{
"node": "Screening agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Save candidate": {
"ai_tool": [
[
{
"node": "Screening agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Notify hiring team": {
"ai_tool": [
[
{
"node": "Screening agent",
"type": "ai_tool",
"index": 0
}
]
]
}
},
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"meta": {
"templateCredsSetupCompleted": false
},
"tags": []
}In Make, create a new scenario and add these modules in order:
- Webhooks › Custom webhook
- PDF › Extract text (e.g. PDF.co, or a Text parser after conversion)
- Make AI Agents › Run an agent — give it these tools: “Job openings” (Google Sheets), “Save candidate” (Google Sheets), “Notify hiring team” (Slack); paste the system prompt as the agent's instructions
- Every module run uses Make operations — the free plan includes a monthly quota.
- Module and step names can differ slightly as Make and Zapier update their apps.
In Zapier, create a new Zap and add these steps in order:
- Webhooks by Zapier — Catch Hook
- PDF.co (or another PDF app) — Extract Text
- Zapier Agents — create an agent (or AI by Zapier for a single step) — give it these tools: “Job openings” (Google Sheets), “Save candidate” (Google Sheets), “Notify hiring team” (Slack); paste the system prompt as the agent's instructions
- Zaps with more than two steps need a paid Zapier plan.
- Webhooks, Filters/Paths and Code by Zapier are premium features on some Zapier plans.
- Module and step names can differ slightly as Make and Zapier update their apps.
Tips
- Tell applicants that AI helps screen applications, and review a sample of low scores yourself.
Related flows
Unpaid invoices collections AI agent
Every morning, the agent reviews overdue invoices, drafts polite reminders in the right tone, and flags the ones that need a call.
IT helpdesk AI agent
Staff describe their IT problem in a chat; the agent walks them through known fixes and logs a ticket when needed.
Weekly customer feedback insights AI agent
Every Monday, the agent reads last week's feedback, finds the themes, and posts a report with three action items.