AutomationFlowsAI & RAG › Automate Recruitment with Gpt-4o-mini: Cv Screening to Interview Scheduling…

Automate Recruitment with Gpt-4o-mini: Cv Screening to Interview Scheduling…

Original n8n title: Automate Recruitment with Gpt-4o-mini: Cv Screening to Interview Scheduling in Airtable

ByCheng Siong Chin @cschin on n8n.io

Automate candidate evaluation from CV submission to interview booking. Perfect for HR teams and recruiters.

Webhook trigger★★★★☆ complexityAI-powered21 nodesAirtableHTTP RequestInformation ExtractorOpenAI ChatAgentOutput Parser StructuredEmail SendGoogle Calendar
AI & RAG Trigger: Webhook Nodes: 21 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #10292 — we link there as the canonical source.

This workflow follows the Agent → Airtable recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "i7hRouNsQLAJJg4F",
  "name": "AI-Powered GPT-4o-mini Recruitment Pipeline: CV Screening to Interview Scheduler",
  "tags": [],
  "nodes": [
    {
      "id": "2a69b990-5536-4825-81e2-682ef75fe7a2",
      "name": "Webhook - Receive CV",
      "type": "n8n-nodes-base.webhook",
      "position": [
        112,
        352
      ],
      "parameters": {
        "path": "candidate-cv",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 2
    },
    {
      "id": "6e476a4e-e2bb-4298-9ddc-5829aeb8306f",
      "name": "Airtable - Store Candidate",
      "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 Request - Download 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": "AI - Extract CV Data",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "position": [
        400,
        432
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "0fdb2b79-b63d-42be-9ddc-2cee4cf5a83c",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        400,
        592
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "ea434fe7-5922-4413-9d94-a1bb049a1a13",
      "name": "Airtable - Get Job Requirements",
      "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": "AI Agent - Qualification Assessment",
      "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 Chat Model Assessment",
      "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": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        864,
        576
      ],
      "parameters": {},
      "typeVersion": 1.2
    },
    {
      "id": "259d8989-fd79-402d-8993-00eafc43e86c",
      "name": "Airtable - Update Assessment",
      "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": "Filter - Qualified Candidates",
      "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": "AI Agent - Generate Email",
      "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 Chat Model Email",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1296,
        448
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "12222fa6-a277-4af1-8cbb-7b27c67ea2d0",
      "name": "Send Email - Candidate Outreach",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        1584,
        224
      ],
      "parameters": {
        "options": {},
        "subject": "={{ $json.subject }}",
        "toEmail": "={{ $('Airtable - Store Candidate').item.json.Email }}",
        "fromEmail": "user@example.com"
      },
      "typeVersion": 2.1
    },
    {
      "id": "72a2753a-535f-4e77-9901-a4007124c76a",
      "name": "Filter - Interview Candidates",
      "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 Calendar - Schedule Interview",
      "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 - Update Interview Details",
      "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 - Send Notification",
      "type": "n8n-nodes-base.slack",
      "position": [
        1664,
        432
      ],
      "parameters": {
        "text": "=\ud83c\udfaf *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' ? '\ud83d\udcc5 *Interview Scheduled:* ' + $now.plus({ days: 3 }).toFormat('MMM dd, yyyy HH:mm') : '\ud83d\udcde *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": "Respond to 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": "Sticky Note",
      "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 \u2192 Airtable (Get Data) \u2192 AI Extract CV \u2192 AI Assessment \u2192 Filter Qualified \u2192 Generate Email \u2192 Send Email \u2192 Filter Interview Candidates \u2192 Schedule Calendar \u2192 Update Airtable \u2192 Slack Notification \u2192 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": "Sticky Note1",
      "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,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "32b604ba-da3d-49a1-89dc-7e8a37f787b7",
  "connections": {
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI - Extract CV Data",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "AI - Extract CV Data": {
      "main": [
        [
          {
            "node": "AI Agent - Qualification Assessment",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook - Receive CV": {
      "main": [
        [
          {
            "node": "Airtable - Store Candidate",
            "type": "main",
            "index": 0
          },
          {
            "node": "HTTP Request - Download CV",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model Email": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent - Generate Email",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent - Qualification Assessment",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent - Generate Email": {
      "main": [
        [
          {
            "node": "Send Email - Candidate Outreach",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Slack - Send Notification": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Airtable - Store Candidate": {
      "main": [
        [
          {
            "node": "Airtable - Get Job Requirements",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request - Download CV": {
      "main": [
        [
          {
            "node": "AI - Extract CV Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Airtable - Update Assessment": {
      "main": [
        [
          {
            "node": "Filter - Qualified Candidates",
            "type": "main",
            "index": 0
          },
          {
            "node": "Slack - Send Notification",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model Assessment": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent - Qualification Assessment",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Filter - Interview Candidates": {
      "main": [
        [
          {
            "node": "Google Calendar - Schedule Interview",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter - Qualified Candidates": {
      "main": [
        [
          {
            "node": "AI Agent - Generate Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Airtable - Get Job Requirements": {
      "main": [
        [
          {
            "node": "AI Agent - Qualification Assessment",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Email - Candidate Outreach": {
      "main": [
        [
          {
            "node": "Filter - Interview Candidates",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent - Qualification Assessment": {
      "main": [
        [
          {
            "node": "Airtable - Update Assessment",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Airtable - Update Interview Details": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Calendar - Schedule Interview": {
      "main": [
        [
          {
            "node": "Airtable - Update Interview Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Automate candidate evaluation from CV submission to interview booking. Perfect for HR teams and recruiters.

Source: https://n8n.io/workflows/10292/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

This workflow transforms natural language queries into research reports through a five-stage AI pipeline. When triggered via webhook (typically from Google Sheets using the companion [](https://gist.g

Redis, Agent, Output Parser Structured +7
AI & RAG

This workflow automates veterinary clinic operations and client communications for animal hospitals and veterinary practices managing appointments, inventory, and patient care. It solves the dual chal

HTTP Request, Agent, OpenAI Chat +4
AI & RAG

Automates scholarship tracking by scraping university sites, assessing eligibility via AI, and publishing results to WordPress or Slack. Eliminates manual searches for students, counselors, and educat

HTTP Request, OpenAI Chat, Agent +4
AI & RAG

The system collects real-time wearable health data, normalizes it, and uses AI to analyze trends and risk scores. It detects anomalies by comparing with historical patterns and automatically triggers

Postgres, Agent, OpenAI Chat +7
AI & RAG

🧾 An intelligent automation system that turns Google Meet recordings into structured meeting notes — integrating Fireflies.ai, OpenAI GPT-4.1-mini, Notion, Slack, Google Drive, and Gmail via n8n.

Google Drive, OpenAI Chat, Output Parser Structured +8