Recruiting screening AI agent

Reads every application and CV, scores it against the job's must-haves, and flags strong candidates.

AI agentAdvanced Saves ~15 hours/month AI AgentsBy Flowngn team

Works with n8n · Make · Zapier

How it works

Trigger: Webhook — a job application with a PDF CV
  1. Your application form sends the answers and the CV (PDF).
  2. The text is extracted from the CV.
  3. The agent reads the job's requirements, scores the candidate and saves the result.
  4. 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.

System prompt
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

ApplicationWebhookRead CV (PDF)Extract from FileScreening agentAI AgentClaude modelAnthropic Chat Mo…◷MemorySimple MemoryGJob openingsGoogle Sheets ToolGSave candidateGoogle Sheets ToolSNotify hiring …Slack Tool
Trigger Logic AI Agent tool

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.

Workflow JSON
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": []
}

Open in the playground to edit →

Tips

  • Tell applicants that AI helps screen applications, and review a sample of low scores yourself.

Related flows