TalentFlow AI - 배치 이력서 필터링 및 직업 설명 매칭
고급
이것은HR, AI Summarization분야의자동화 워크플로우로, 30개의 노드를 포함합니다.주로 If, Code, Merge, Slack, Filter 등의 노드를 사용하며. GPT-4를 사용하여 HR 팀의 대량 이력서 필터링 및 직위 설명 매칭
사전 요구사항
- •Slack Bot Token 또는 Webhook URL
- •Google Drive API 인증 정보
- •Google Sheets API 인증 정보
- •OpenAI API Key
사용된 노드 (30)
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "Q2sJeZnm8cbDfiEP",
"meta": {
"instanceId": "4a2e6764ba7a6bc9890d9225f4b21d570ce88fc9bd57549c89057fcee58fed0f",
"templateId": "5453",
"templateCredsSetupCompleted": true
},
"name": "TalentFlow AI – Bulk Resume Screening with JD Matching",
"tags": [
{
"id": "OcQfoQT2ejtrpKfF",
"name": "HR Workflow",
"createdAt": "2025-07-30T05:57:04.113Z",
"updatedAt": "2025-07-30T05:57:04.113Z"
}
],
"nodes": [
{
"id": "f007fbd5-f154-4497-ad34-6f90c3e78631",
"name": "고정 메모1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1136,
1936
],
"parameters": {
"width": 748,
"height": 80,
"content": "## 1. HR/TA upload multiple resumes & select the position (job role)"
},
"typeVersion": 1
},
{
"id": "23581b43-6d12-4868-818c-f267ae9535c1",
"name": "고정 메모5",
"type": "n8n-nodes-base.stickyNote",
"position": [
976,
1920
],
"parameters": {
"width": 632,
"height": 768,
"content": "## 3. HR AI Agent evaluate candidate matching based on profile & job description\n- Evaluate candidate profile against the selected position job description (download from google drive)\n- Output follow structured template (defined by JSON)"
},
"typeVersion": 1
},
{
"id": "31815a99-970e-45dd-9eac-19b04fe6afbe",
"name": "지원서 양식",
"type": "n8n-nodes-base.formTrigger",
"position": [
-528,
2176
],
"webhookId": "c0275bde-d427-49f0-b497-a648da2788e7",
"parameters": {
"options": {
"customCss": ":root {\n\t--font-family: 'Open Sans', sans-serif;\n\t--font-weight-normal: 400;\n\t--font-weight-bold: 600;\n\t--font-size-body: 12px;\n\t--font-size-label: 14px;\n\t--font-size-test-notice: 12px;\n\t--font-size-input: 14px;\n\t--font-size-header: 20px;\n\t--font-size-paragraph: 14px;\n\t--font-size-link: 12px;\n\t--font-size-error: 12px;\n\t--font-size-html-h1: 28px;\n\t--font-size-html-h2: 20px;\n\t--font-size-html-h3: 16px;\n\t--font-size-html-h4: 14px;\n\t--font-size-html-h5: 12px;\n\t--font-size-html-h6: 10px;\n\t--font-size-subheader: 14px;\n\n\t/* Colors */\n\t--color-background: #fbfcfe;\n\t--color-test-notice-text: #e6a23d;\n\t--color-test-notice-bg: #fefaf6;\n\t--color-test-notice-border: #f6dcb7;\n\t--color-card-bg: #ffffff;\n\t--color-card-border: #dbdfe7;\n\t--color-card-shadow: rgba(99, 77, 255, 0.06);\n\t--color-link: #7e8186;\n\t--color-header: #525356;\n\t--color-label: #555555;\n\t--color-input-border: #dbdfe7;\n\t--color-input-text: #71747A;\n\t--color-focus-border: rgb(90, 76, 194);\n\t--color-submit-btn-bg: #0000FF; /* Changed to blue */\n\t--color-submit-btn-text: #ffffff;\n\t--color-error: #ea1f30;\n\t--color-required: #ff6d5a;\n\t--color-clear-button-bg: #7e8186;\n\t--color-html-text: #555;\n\t--color-html-link: #ff6d5a;\n\t--color-header-subtext: #7e8186;\n\n\t/* Border Radii */\n\t--border-radius-card: 8px;\n\t--border-radius-input: 6px;\n\t--border-radius-clear-btn: 50%;\n\t--card-border-radius: 8px;\n\n\t/* Spacing */\n\t--padding-container-top: 24px;\n\t--padding-card: 24px;\n\t--padding-test-notice-vertical: 12px;\n\t--padding-test-notice-horizontal: 24px;\n\t--margin-bottom-card: 16px;\n\t--padding-form-input: 12px;\n\t--card-padding: 24px;\n\t--card-margin-bottom: 16px;\n\n\t/* Dimensions */\n\t--container-width: 448px;\n\t--submit-btn-height: 48px;\n\t--checkbox-size: 18px;\n\n\t/* Others */\n\t--box-shadow-card: 0px 4px 16px 0px var(--color-card-shadow);\n\t--opacity-placeholder: 0.5;\n}\n",
"appendAttribution": false
},
"formTitle": "Resume Review Form",
"formFields": {
"values": [
{
"fieldType": "file",
"fieldLabel": "CV",
"requiredField": true,
"acceptFileTypes": ".pdf"
},
{
"fieldType": "dropdown",
"fieldLabel": "Job Role",
"fieldOptions": {
"values": [
{
"option": "Talent acquisition Specialist (Intermediate)"
},
{
"option": "Senior Tester/QC (Web Apps, Mobile, API, Database)"
},
{
"option": "Lead Full-stack Developer (.NET, Angular/React.js)"
},
{
"option": "Manual Tester/QC (Senior level)"
}
]
},
"requiredField": true
}
]
},
"formDescription": "Upload all applicant resumes below and select the corresponding job positions. Our SmartHR Agent will review each submission and provide a detailed evaluation for your consideration."
},
"typeVersion": 2.2
},
{
"id": "ff46db6c-5f77-4c45-b0a2-d8997760f363",
"name": "프로필 추출",
"type": "n8n-nodes-base.extractFromFile",
"position": [
-192,
2064
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "4e80f14b-b866-4966-ad8b-b92276dfc676",
"name": "json 파서",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
80,
2208
],
"parameters": {
"jsonSchemaExample": "{\n \"full_name\": \"\",\n \"job_title\": \"\",\n \"summary\": \"\",\n \"contact\": {\n \"email\": \"\",\n \"phone\": \"\",\n \"address\": \"\",\n \"linkedin\": \"\",\n \"website\": \"\"\n },\n \"education\": [\n {\n \"degree\": \"\",\n \"field_of_study\": \"\",\n \"institution\": \"\",\n \"location\": \"\",\n \"start_year\": \"\",\n \"end_year\": \"\"\n }\n ],\n \"certifications\": [\n {\n \"name\": \"\",\n \"issuer\": \"\",\n \"date_obtained\": \"\",\n \"expiration_date\": \"\"\n }\n ],\n \"work_experience\": [\n {\n \"company\": \"\",\n \"position\": \"\",\n \"location\": \"\",\n \"start_date\": \"\",\n \"end_date\": \"\",\n \"responsibilities\": [\n \"\"\n ],\n \"achievements\": [\n \"\"\n ]\n }\n ],\n \"skills\": {\n \"technical_skills\": [\n \"\"\n ],\n \"soft_skills\": [\n \"\"\n ],\n \"languages\": [\n {\n \"language\": \"\",\n \"proficiency\": \"\"\n }\n ],\n \"tools_and_technologies\": [\n \"\"\n ]\n },\n \"projects\": [\n {\n \"name\": \"\",\n \"description\": \"\",\n \"technologies_used\": [\n \"\"\n ],\n \"role\": \"\",\n \"duration\": \"\"\n }\n ],\n \"awards\": [\n {\n \"title\": \"\",\n \"issuer\": \"\",\n \"date\": \"\",\n \"description\": \"\"\n }\n ],\n \"volunteer_experience\": [\n {\n \"organization\": \"\",\n \"role\": \"\",\n \"description\": \"\",\n \"start_date\": \"\",\n \"end_date\": \"\"\n }\n ],\n \"additional_information\": {\n \"availability\": \"\",\n \"preferred_location\": \"\",\n \"salary_expectation\": \"\",\n \"work_authorization\": \"\",\n \"other_notes\": \"\"\n }\n}"
},
"typeVersion": 1.3
},
{
"id": "8a0d545c-b28d-4a0b-ba77-d3533597d155",
"name": "gpt4-1 모델",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-48,
2208
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "PPSwAKeLQYgAPobT",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "291e6b3e-0a21-459c-9340-291effc1d941",
"name": "포지션 직무 설명 가져오기",
"type": "n8n-nodes-base.googleSheets",
"position": [
-304,
2592
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupValue": "={{ $('Application form').item.json['Job Role'] }}",
"lookupColumn": "Job Role"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/15CZPMbxmz-RVYji1fev_6vYeEwpPa3MjewGEPf6aSoA/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "15CZPMbxmz-RVYji1fev_6vYeEwpPa3MjewGEPf6aSoA",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/15CZPMbxmz-RVYji1fev_6vYeEwpPa3MjewGEPf6aSoA/edit?usp=drivesdk",
"cachedResultName": "Positions"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "L670Nly6gZGo71br",
"name": "Google Sheets account 2"
}
},
"typeVersion": 4.6,
"alwaysOutputData": true
},
{
"id": "02ccf47d-e039-477c-9028-7ccf08f7b58f",
"name": "파일 다운로드",
"type": "n8n-nodes-base.googleDrive",
"position": [
-112,
2592
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "url",
"value": "={{ $json['Job Description'] }}"
},
"options": {},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"id": "fC471es5gk5Mm900",
"name": "Google Drive account"
}
},
"typeVersion": 3
},
{
"id": "bffa78db-6f40-488f-a4ef-fce685acc8cc",
"name": "직무 설명 추출",
"type": "n8n-nodes-base.extractFromFile",
"position": [
112,
2592
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "ec4ff009-360f-4ff6-943b-3cf87a6b87e5",
"name": "고정 메모",
"type": "n8n-nodes-base.stickyNote",
"position": [
-352,
1648
],
"parameters": {
"width": 588,
"height": 676,
"content": "## 2.1. Candidate profiles analyzer\n- Upload all candidate profile to Google Drive folder for later processing\n- Extract each candidate information from PDF file\n- Transform each candidate information to expected JSON format for later use (send message, add to evaluation sheet)"
},
"typeVersion": 1
},
{
"id": "8aac80ce-2afd-4b28-a5c1-67319dc7c3b8",
"name": "고정 메모2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-352,
2400
],
"parameters": {
"width": 636,
"height": 372,
"content": "## 2.2. Download selected job description\n- Get position name & job description URL from google sheet based on candidate application form\n- Download job description file from Google Drive\n- Extract data from job description PDF file to be used in the next steps"
},
"typeVersion": 1
},
{
"id": "15ce288c-a8e6-4016-a26c-059de23ba6d6",
"name": "고정 메모6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1744,
1920
],
"parameters": {
"width": 1032,
"height": 768,
"content": "## 4. Update evaluation result to target platform\n- Candidate with overall fit score under 8 will be considered as unqualified, config in the \"Candidate qualified\" node\n- Send message to Slack, Email\n- Add new rows in CV evaluation tracking sheet (Google Drive), you need config \"Update evaluation sheet\" node with your own URL (empty sheet, column header and rows will be auto-populated)"
},
"typeVersion": 1
},
{
"id": "1e3e7898-f264-4446-b2a0-c0d6445a6637",
"name": "HR 전문가 에이전트",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
1264,
2272
],
"parameters": {
"text": "=Evaluate the candidate for the following position ({{ $json.position }}) with job description: {{ $json.job_description }}\n------------------------\nBelow is the extracted candidate profile:\n{{ $json.candidate_profile.toJsonString() }}",
"messages": {
"messageValues": [
{
"message": "You are a professional AI hiring assistant tasked with evaluating job candidates based on their structured resume data and a provided job description. Your goal is to assess the candidate’s suitability for the role, identifying key matches and gaps in skills, experience, and qualifications. You will receive: - `candidate_profile`: a JSON object containing extracted information from the candidate's resume. - `job_description`: a plain text description of the role. Your job is to: 1. Parse and understand the key job requirements (e.g., required skills, years of experience, qualifications). 2. Match the candidate's profile to the job requirements. 3. Provide a structured evaluation with ratings and reasoning. Always be objective, use professional language, and format your output clearly using markdown."
}
]
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.5
},
{
"id": "8e4f9f63-86ac-43f3-a535-4c49b4ea3863",
"name": "프로필 분석기 에이전트",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-48,
2064
],
"parameters": {
"text": "=Please extract all relevant information from this candiadte:\nCV Content:\n===\n{{ $json[\"text\"] }}\n===",
"options": {
"systemMessage": ""
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.1
},
{
"id": "e637352c-bc2c-4c50-a217-f7072c4515a6",
"name": "평가 시트 업데이트",
"type": "n8n-nodes-base.googleSheets",
"position": [
2224,
2528
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "overall_fit_score",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "overall_fit_score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "recommendation",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "recommendation",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "required_experience",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "required_experience",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "skill_match",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "skill_match",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "education_certifications",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "education_certifications",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "soft_skills_traits",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "soft_skills_traits",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "strengths",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "strengths",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "concerns_or_gaps",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "concerns_or_gaps",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "final_notes",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "final_notes",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [
"output"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": "https://docs.google.com/spreadsheets/d/1gpuTL7iK2LoDJAdHE-LBFiBEU6hLqSTxWjThMJyi7SY/edit?usp=drive_link"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "L670Nly6gZGo71br",
"name": "Google Sheets account 2"
}
},
"typeVersion": 4.6
},
{
"id": "1cfcfbec-2206-4d24-985c-5a7307f045a8",
"name": "열 매핑",
"type": "n8n-nodes-base.code",
"position": [
1808,
2272
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "const evaluationResult = item.json.output;\n\nreturn {\n json: {\n full_name: evaluationResult.full_name || '',\n email: evaluationResult.email || '',\n phone: evaluationResult.phone || '',\n position: evaluationResult.applied_position,\n overall_fit_score: evaluationResult.overall_fit_score,\n recommendation: evaluationResult.recommendation,\n strengths: Array.isArray(evaluationResult.strengths) ? evaluationResult.strengths.join(', ') : '',\n concerns_or_gaps: Array.isArray(evaluationResult.concerns_or_gaps) ? evaluationResult.concerns_or_gaps.join(', ') : '',\n final_notes: evaluationResult.final_notes || '',\n submitted_date: $now.toFormat(\"yyyyLLdd-HHmmss\")\n }\n };"
},
"typeVersion": 2
},
{
"id": "8b7ae83f-27ac-4ecc-8180-fd46ce375cc2",
"name": "Google 드라이브에 업로드",
"type": "n8n-nodes-base.googleDrive",
"position": [
-80,
1808
],
"parameters": {
"name": "=cv-{{ $now.toFormat(\"yyyyLLdd-HHmmss\") }}-{{$binary.data.fileName}}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive",
"cachedResultUrl": "https://drive.google.com/drive/my-drive",
"cachedResultName": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "url",
"value": "https://drive.google.com/drive/u/0/folders/1J9GnGlJ70ppf88eZGrhLIo3jxIaqT1u7"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"id": "fC471es5gk5Mm900",
"name": "Google Drive account"
}
},
"typeVersion": 3
},
{
"id": "bc0cc422-0789-466f-a485-9615bea31687",
"name": "gpt-4-1 모델 2",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1248,
2496
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "PPSwAKeLQYgAPobT",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "a9f1c1b2-b75b-49c8-84e2-e3b328824c1a",
"name": "json 파서 2",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1456,
2496
],
"parameters": {
"jsonSchemaExample": "{\n \"full_name\":\"\",\n \"phone\":\"\",\n \"address\":\"\",\n \"email\":\"\",\n \"applied_position\":\"\",\n \"overall_fit_score\": 0,\n \"recommendation\": \"\", \n \"job_match_summary\": {\n \"required_experience\": \"\",\n \"skill_match\": \"\",\n \"education_certifications\": \"\",\n \"soft_skills_traits\": \"\"\n },\n \"strengths\": [\n \"\"\n ],\n \"concerns_or_gaps\": [\n \"\"\n ],\n \"final_notes\": \"\"\n}"
},
"typeVersion": 1.3
},
{
"id": "9f431dbc-4b1a-45cc-b8f8-d68d7ad74536",
"name": "고정 메모7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2096,
1856
],
"parameters": {
"width": 912,
"height": 1760,
"content": "## TalentFlow AI – Bulk Resume Screening with JD Matching\n\n- Automatically extract, evaluate, and shortlist multiple resumes against a selected job description using GPT-4. This smart, scalable n8n workflow helps HR/TA teams streamline hiring decisions while keeping results structured, auditable, and easy to share.\n\n---\n\n## 👤 Who’s it for\n\nThis workflow is designed for:\n- HR or Talent Acquisition (TA) teams handling **multiple candidates** per role\n- Recruiters who want **AI-assisted resume screening** to save time and reduce bias\n- Organizations that want to **automatically log evaluations** and keep stakeholders updated in real-time via Slack or Sheets\n\n---\n\n## ⚙️ How it works / What it does\n\n1. HR/TA uploads multiple candidate resumes and selects a job role\n2. Each resume is:\n - Uploaded to Google Drive\n - Parsed with GPT-4 to extract structured profile data\n3. The job description for the selected role is:\n - Retrieved from Google Sheets\n - Downloaded from Drive and parsed\n4. The profile + JD are sent to an AI agent to generate:\n - Fit score\n - Strengths & gaps\n - Final recommendation\n5. Results are:\n - Appended to the evaluation tracking sheet\n - Optionally shared with the hiring team on Slack\n - Used to trigger emails to qualified or unqualified candidates\n\n---\n\n## 🛠️ How to set up\n\n1. **Clone or import the workflow** into your n8n instance\n2. **Connect your integrations**:\n - Google Sheets (positions & evaluation form)\n - Google Drive (CV & JD folders)\n - OpenAI API (GPT-4)\n - Slack (for notifications)\n - (Optional) SendGrid or SMTP for email notifications\n3. **Update Google Sheets structure**:\n - `Positions` sheet: maps Job Role → JD file link\n - `Evaluation form`: stores evaluation results\n4. **Prepare Drive folders**:\n - `/cv` folder for uploaded resumes\n - `/jd` folder for job description PDFs\n\n---\n\n## 📋 Requirements\n\n- n8n (hosted or self-hosted)\n- OpenAI GPT-4 account (used in Profile & JD evaluator agents)\n- Google Drive + Google Sheets access\n- (Optional) Slack workspace + bot token\n- (Optional) SendGrid or email credentials for candidate follow-up\n\n---\n\n## 🎨 How to customize the workflow\n\n- Change the **fit score threshold** in the `Candidate qualified?` node\n- Edit Slack message content/formatting to match your company tone\n- Add additional candidate metadata to Sheets or Slack messages\n- Use a webhook trigger to integrate with your ATS or job board\n- Swap GPT-4 with Claude or Gemini if you prefer other AI services\n- Expand to include multi-position batch screening logic\n\n---\n\nHappy Hiring! 🚀 \n_Automated with love using [n8n](https://n8n.io)_"
},
"typeVersion": 1
},
{
"id": "6bd0f5cc-8830-49a6-9003-4e74c84a56b2",
"name": "고정 메모4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-352,
2800
],
"parameters": {
"width": 640,
"height": 128,
"content": ""
},
"typeVersion": 1
},
{
"id": "ea2175ea-cc01-48d7-8e2f-604ec2673e94",
"name": "고정 메모8",
"type": "n8n-nodes-base.stickyNote",
"position": [
1792,
2736
],
"parameters": {
"width": 960,
"height": 512,
"content": ""
},
"typeVersion": 1
},
{
"id": "cd0c42ec-c281-4132-a6c0-009cd92f7779",
"name": "후보자에게 결과 이메일 전송",
"type": "n8n-nodes-base.sendGrid",
"disabled": true,
"position": [
2560,
2320
],
"parameters": {
"subject": "=Update on Your Application for {{ $json.position }}",
"toEmail": "={{ $json.email }}",
"fromName": "Hiring Team",
"resource": "mail",
"fromEmail": "sender@example.com",
"contentType": "text/html",
"contentValue": "=<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <title>Application Update</title>\n <style>\n body {\n font-family: Arial, sans-serif;\n background-color: #f4f6f9;\n color: #333;\n padding: 20px;\n }\n .container {\n max-width: 600px;\n background-color: #ffffff;\n margin: auto;\n padding: 30px;\n border-radius: 8px;\n box-shadow: 0 0 10px rgba(0,0,0,0.05);\n }\n .header {\n font-size: 20px;\n font-weight: bold;\n color: #2b5cb8;\n margin-bottom: 20px;\n }\n .footer {\n font-size: 12px;\n color: #999;\n text-align: center;\n margin-top: 40px;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"header\">Application Update</div>\n\n <p>Hi {{ $json.full_name }},</p>\n\n <p>Thank you for applying for the <strong>{{ $json.position }}</strong> position.</p>\n\n <p>We appreciate your interest and the time you took to apply. After careful review, we’ve decided not to move forward with your application at this time.</p>\n\n <p>We wish you the best in your job search and future opportunities.</p>\n\n <p>Kind regards,<br>\n Recruitment Team</p>\n\n <div class=\"footer\">\n This is an automated message. Please do not reply.\n </div>\n </div>\n</body>\n</html>",
"additionalFields": {}
},
"credentials": {
"sendGridApi": {
"id": "O1IzegT4JdKjrzrj",
"name": "SendGrid account"
}
},
"typeVersion": 1
},
{
"id": "46086f32-5a6c-4f3e-9539-34ac476283b7",
"name": "채용 팀에게 Slack을 통해 메시지 전송",
"type": "n8n-nodes-base.slack",
"position": [
2560,
2080
],
"webhookId": "09bb1ad8-915e-4bd1-b7aa-e8f796381745",
"parameters": {
"text": "=🎯 *Candidate Evaluation Update*\n\nHi team, \nWe've completed the initial screening and have a qualified candidate for the *{{ $json.position }}* position:\n\n👤 *Candidate:* **{{ $json.full_name }}** \n📝 *Summary:* \n• *Fit Score:* {{ $json.overall_fit_score }}/10 \n• *Recommendation:* {{ $json.recommendation }} \n• *Key Strengths:* \n {{ $json.strengths }}\n\n📎 *Full evaluation is available in the tracking sheet.*\n\n👉 Please advise on next steps (e.g., schedule technical interview, team round, etc.).",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C098LDNAG1E",
"cachedResultName": "hiring-channel"
},
"otherOptions": {},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"id": "fDHHxMgQm69z0h5T",
"name": "Slack account"
}
},
"typeVersion": 2.3
},
{
"id": "df5ab265-1b74-4f89-9d01-db9b4d5e26f2",
"name": "후보자 자격 부합?",
"type": "n8n-nodes-base.if",
"position": [
2224,
2192
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "a69c879b-ebf6-4237-b19a-4bb1e4686746",
"operator": {
"type": "number",
"operation": "gte"
},
"leftValue": "={{ $('HR Expert Agent').item.json.output.overall_fit_score }}",
"rightValue": 8
}
]
}
},
"typeVersion": 2.2
},
{
"id": "99d34017-e9b7-4802-8f69-9b77a90ec9f2",
"name": "코드",
"type": "n8n-nodes-base.code",
"position": [
-336,
1936
],
"parameters": {
"jsCode": "const data = $input.item.json;\nconst binaryData = $input.item.binary;\n\nlet output = [];\n\nObject.keys(binaryData)\n .filter(label => label.startsWith(\"CV_\"))\n .forEach(label => {\n output.push({\n json: data,\n binary: { data: binaryData[label] }\n });\n });\n\nreturn output;"
},
"typeVersion": 2
},
{
"id": "9067e3d6-34a4-4c04-a785-a929aa32b912",
"name": "병합",
"type": "n8n-nodes-base.merge",
"position": [
768,
2272
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "787c7622-3f48-4b73-83c1-5eee7f8c3c4a",
"name": "고정 메모3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1136,
2048
],
"parameters": {
"width": 556,
"height": 580,
"content": ""
},
"typeVersion": 1
},
{
"id": "3b30fd6b-489a-4050-8ff0-74d3e257b477",
"name": "코드1",
"type": "n8n-nodes-base.code",
"position": [
1008,
2272
],
"parameters": {
"jsCode": "// Raw merged input (first N items are candidate profiles, last item is JD)\nconst items = $input.all();\n\n// Extract job description (assuming it's the last element)\nconst jdItem = items[items.length - 1];\nconst job_description = jdItem.json.text;\n\n// Prepare output array\nconst results = [];\n\n// Loop through all items except the last one (JD)\nfor (let i = 0; i < items.length - 1; i++) {\n const candidate = items[i].json.output;\n results.push({\n json: {\n candidate_profile: candidate,\n job_description: job_description,\n applied_position: $('Application form').first().json['Job Role']\n }\n });\n}\n\nreturn results;"
},
"typeVersion": 2
},
{
"id": "e6ce2613-5dbc-4005-a939-982af7e75d3f",
"name": "불량 데이터 이력서 제거",
"type": "n8n-nodes-base.filter",
"position": [
416,
2128
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "82f62f61-ceaa-4ff2-8493-da82d0165729",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.output.full_name }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "a24dd36a-0a96-4e1c-8af9-ac84f8811a77",
"connections": {
"99d34017-e9b7-4802-8f69-9b77a90ec9f2": {
"main": [
[
{
"node": "8b7ae83f-27ac-4ecc-8180-fd46ce375cc2",
"type": "main",
"index": 0
},
{
"node": "ff46db6c-5f77-4c45-b0a2-d8997760f363",
"type": "main",
"index": 0
}
]
]
},
"3b30fd6b-489a-4050-8ff0-74d3e257b477": {
"main": [
[
{
"node": "1e3e7898-f264-4446-b2a0-c0d6445a6637",
"type": "main",
"index": 0
}
]
]
},
"9067e3d6-34a4-4c04-a785-a929aa32b912": {
"main": [
[
{
"node": "3b30fd6b-489a-4050-8ff0-74d3e257b477",
"type": "main",
"index": 0
}
]
]
},
"1cfcfbec-2206-4d24-985c-5a7307f045a8": {
"main": [
[
{
"node": "e637352c-bc2c-4c50-a217-f7072c4515a6",
"type": "main",
"index": 0
},
{
"node": "df5ab265-1b74-4f89-9d01-db9b4d5e26f2",
"type": "main",
"index": 0
}
]
]
},
"4e80f14b-b866-4966-ad8b-b92276dfc676": {
"ai_outputParser": [
[
{
"node": "8e4f9f63-86ac-43f3-a535-4c49b4ea3863",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"8a0d545c-b28d-4a0b-ba77-d3533597d155": {
"ai_languageModel": [
[
{
"node": "8e4f9f63-86ac-43f3-a535-4c49b4ea3863",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"02ccf47d-e039-477c-9028-7ccf08f7b58f": {
"main": [
[
{
"node": "bffa78db-6f40-488f-a4ef-fce685acc8cc",
"type": "main",
"index": 0
}
]
]
},
"a9f1c1b2-b75b-49c8-84e2-e3b328824c1a": {
"ai_outputParser": [
[
{
"node": "1e3e7898-f264-4446-b2a0-c0d6445a6637",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"ff46db6c-5f77-4c45-b0a2-d8997760f363": {
"main": [
[
{
"node": "8e4f9f63-86ac-43f3-a535-4c49b4ea3863",
"type": "main",
"index": 0
}
]
]
},
"291e6b3e-0a21-459c-9340-291effc1d941": {
"main": [
[
{
"node": "02ccf47d-e039-477c-9028-7ccf08f7b58f",
"type": "main",
"index": 0
}
]
]
},
"1e3e7898-f264-4446-b2a0-c0d6445a6637": {
"main": [
[
{
"node": "1cfcfbec-2206-4d24-985c-5a7307f045a8",
"type": "main",
"index": 0
}
]
]
},
"bc0cc422-0789-466f-a485-9615bea31687": {
"ai_languageModel": [
[
{
"node": "1e3e7898-f264-4446-b2a0-c0d6445a6637",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"31815a99-970e-45dd-9eac-19b04fe6afbe": {
"main": [
[
{
"node": "99d34017-e9b7-4802-8f69-9b77a90ec9f2",
"type": "main",
"index": 0
},
{
"node": "291e6b3e-0a21-459c-9340-291effc1d941",
"type": "main",
"index": 0
}
]
]
},
"e6ce2613-5dbc-4005-a939-982af7e75d3f": {
"main": [
[
{
"node": "9067e3d6-34a4-4c04-a785-a929aa32b912",
"type": "main",
"index": 0
}
]
]
},
"df5ab265-1b74-4f89-9d01-db9b4d5e26f2": {
"main": [
[
{
"node": "46086f32-5a6c-4f3e-9539-34ac476283b7",
"type": "main",
"index": 0
}
],
[
{
"node": "cd0c42ec-c281-4132-a6c0-009cd92f7779",
"type": "main",
"index": 0
}
]
]
},
"8e4f9f63-86ac-43f3-a535-4c49b4ea3863": {
"main": [
[
{
"node": "e6ce2613-5dbc-4005-a939-982af7e75d3f",
"type": "main",
"index": 0
}
]
]
},
"8b7ae83f-27ac-4ecc-8180-fd46ce375cc2": {
"main": [
[]
]
},
"bffa78db-6f40-488f-a4ef-fce685acc8cc": {
"main": [
[
{
"node": "9067e3d6-34a4-4c04-a785-a929aa32b912",
"type": "main",
"index": 1
}
]
]
},
"e637352c-bc2c-4c50-a217-f7072c4515a6": {
"main": [
[]
]
},
"cd0c42ec-c281-4132-a6c0-009cd92f7779": {
"main": [
[]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 인사, AI 요약
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
HireMind – AI 기반 이력서 지능형 처리 워크플로우
HR AI 이력서 선별 및 평가: GPT-4 및 Google Workspace
If
Code
Slack
+
If
Code
Slack
26 노드Trung Tran
인사
스마트 이력서 추출기: Google Drive에서 Sheet로 + 채용 담당자 Slack 업데이트
AI 기반 이력서 추출기: GPT-4를 사용하여 Google Drive에서 Sheet로 처리하고, Slack으로 채용 담당자에게 알림
Code
Slack
Filter
+
Code
Slack
Filter
19 노드Trung Tran
인사
지능형 면접 도우미: 이력서, 직업 설명 및 라운드에 따른 맞춤형 질문
이력서, 직무 설명 및 라운드를 기반으로 GPT-4를 사용하여 맞춤형 면접 질문 생성
Set
Code
Merge
+
Set
Code
Merge
26 노드Trung Tran
인사
Slack 후보자 평가를 위한 AI 기반 챗봇 구축
AI 이력서 분석 및 후보자 평가: Slack과 Google 스프레드시트 통합
If
Code
Slack
+
If
Code
Slack
29 노드Trung Tran
AI 챗봇
더 지능적인 BRD(비즈니스 요구 사항 문서) 작성을 위한 다중 에이전트 RAG 시스템
다중 에이전트 GPT와 Google Workspace를 사용하여 비즈니스 요구 사항 문서 생성
Set
Code
Merge
+
Set
Code
Merge
37 노드Trung Tran
AI RAG
🎧 IT 음성 지원 자동화 봇 – Telegram 음성 메시지를 JIRA 티켓으로 전환 (OpenAI Whisper 사용)
Whisper 및 GPT-4.1 Mini를 통한 Telegram 음성 메시지 자동 JIRA 티켓 변환
If
Set
Code
+
If
Set
Code
25 노드Trung Tran
티켓 관리
워크플로우 정보
난이도
고급
노드 수30
카테고리2
노드 유형15
저자
Trung Tran
@trungtranHelps small and medium businesses grow with intelligent automation and practical AI tools, no heavy tech team needed.
외부 링크
n8n.io에서 보기 →
이 워크플로우 공유