{
  "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
          }
        ]
      ]
    }
  }
}