매일 지원자 요약
중급
이것은AI Summarization, Multimodal AI분야의자동화 워크플로우로, 10개의 노드를 포함합니다.주로 Code, Gmail, ScheduleTrigger, ChainLlm, LmChatGoogleGemini 등의 노드를 사용하며. Gemini AI를 사용하여 직위별로 분류된 일일 지원자 요약을 인력 매니저에게 제공
사전 요구사항
- •Google 계정 및 Gmail API 인증 정보
- •Google Gemini API Key
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "MGgeJBbeovHVQAbq",
"meta": {
"instanceId": "14e4c77104722ab186539dfea5182e419aecc83d85963fe13f6de862c875ebfa",
"templateCredsSetupCompleted": true
},
"name": "Daily-Applicant-Digest",
"tags": [],
"nodes": [
{
"id": "75fe46c9-d9eb-455e-8f9d-7384c4a1d172",
"name": "일정 트리거",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-340,
-80
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 6
}
]
}
},
"typeVersion": 1.2
},
{
"id": "ba41cb19-9463-4c8a-a94d-a7d579346b1e",
"name": "Google Gemini 채팅 모델",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
120,
120
],
"parameters": {
"options": {},
"modelName": "models/gemini-1.5-flash"
},
"credentials": {
"googlePalmApi": {
"id": "VbpO5dd6r2AhD52y",
"name": "Google Gemini(PaLM) Api account 2"
}
},
"typeVersion": 1
},
{
"id": "9e2ef974-5183-4e7d-9cd2-8f3872bd0a66",
"name": "메모",
"type": "n8n-nodes-base.stickyNote",
"position": [
-520,
-360
],
"parameters": {
"width": 1720,
"height": 680,
"content": "## Send daily applicant digest by role from Gmail to hiring managers with Google Gemini"
},
"typeVersion": 1
},
{
"id": "4648ef51-49af-40f8-9c82-490c5965e5be",
"name": "fetch_applicant_emails",
"type": "n8n-nodes-base.gmail",
"position": [
-120,
-80
],
"webhookId": "342f1447-19e1-4639-ae6e-a39fc1131b7c",
"parameters": {
"filters": {
"q": "label: applicant newer_than:1d is:unread"
},
"operation": "getAll"
},
"credentials": {
"gmailOAuth2": {
"id": "Kb30iigFce7pjkMZ",
"name": "Gmail account 5"
}
},
"typeVersion": 2.1
},
{
"id": "f479ae8a-490b-4b08-9fe3-dbe6a26b2320",
"name": "readAll_applicant_emails",
"type": "n8n-nodes-base.gmail",
"position": [
120,
-280
],
"webhookId": "801858f2-9076-47a1-88eb-c8c1c930102d",
"parameters": {
"messageId": "={{ $json.id }}",
"operation": "markAsRead"
},
"credentials": {
"gmailOAuth2": {
"id": "Kb30iigFce7pjkMZ",
"name": "Gmail account 5"
}
},
"typeVersion": 2.1
},
{
"id": "2a8e9656-df75-439f-ac16-ba608b29c87d",
"name": "Extract Applicant Details",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
100,
-80
],
"parameters": {
"text": "=You are an assistant that extracts job applicant information from emails.\n\nExtract the following fields and return ONLY valid JSON with these keys:\n- name\n- email\n- phone\n- role\n- years_of_experience\n- top_skills\n- location\n- notice_period\n- summary\n\nApplicant email:\n\"\"\"\n{{$json.snippet }}\n\"\"\"\n",
"batching": {},
"promptType": "define"
},
"typeVersion": 1.7
},
{
"id": "3937cc5c-ea58-4b5d-b22d-591f8097481f",
"name": "Assign Manager 이메일s",
"type": "n8n-nodes-base.code",
"position": [
480,
-80
],
"parameters": {
"jsCode": "function stripMarkdownJson(input) {\n let str = (input || '').trim();\n\n // Remove the ```json at the start and ```\n // This regex removes triple backticks and the 'json' keyword at the start\n str = str.replace(/^```json\\s*/, ''); // Remove starting ```\n str = str.replace(/```$/, ''); // Remove ending ```\n \n return str.trim();\n}\n\nfunction normalizeRole(role) {\n return (role || '').trim().toLowerCase();\n}\n\nconst roleToManagerEmail = {\n 'java team lead': 'javatl@mailinator.com',\n 'python developer': 'pythontl@mailinator.com',\n 'frontend developer': 'frontendtl@mailinator.com',\n // add other roles as needed\n};\n\nconst fallbackManagerEmail = 'fallback@mailinator.com';\n\nreturn items.map(item => {\n const raw = item.json.text || '';\n const jsonStr = stripMarkdownJson(raw);\n\n let parsed;\n try {\n parsed = JSON.parse(jsonStr);\n } catch (e) {\n item.json.error = `JSON parse failed: ${e.message}`;\n return item;\n }\n\n // Merge the parsed JSON fields into the current item\n Object.assign(item.json, parsed);\n\n // Normalize role and assign manager email\n const normalizedRole = normalizeRole(item.json.role);\n const managerEmail = Object.prototype.hasOwnProperty.call(roleToManagerEmail, normalizedRole)\n ? roleToManagerEmail[normalizedRole]\n : fallbackManagerEmail;\n\n item.json.managerEmail = managerEmail;\n\n return item;\n});\n"
},
"typeVersion": 2
},
{
"id": "5943f68f-a39f-4532-a437-732d98d53079",
"name": "Group & Build HTML Tables",
"type": "n8n-nodes-base.code",
"position": [
700,
-80
],
"parameters": {
"jsCode": "function escapeHtml(text) {\n if (!text) return '';\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n// Group applicants by managerEmail, then by role\nconst groupedByManager = {};\n\n// Step 1: Group items\nitems.forEach(item => {\n const applicant = item.json;\n const managerEmail = applicant.managerEmail || 'unknown@fallback.com';\n const role = applicant.role || 'Unknown Role';\n\n if (!groupedByManager[managerEmail]) {\n groupedByManager[managerEmail] = {};\n }\n if (!groupedByManager[managerEmail][role]) {\n groupedByManager[managerEmail][role] = [];\n }\n \n groupedByManager[managerEmail][role].push(applicant);\n});\n\n// Step 2: Build HTML per manager with tables per role\nconst output = [];\n\nfor (const [managerEmail, roles] of Object.entries(groupedByManager)) {\n\n let emailHtml = `<h2>Today's New Applicants</h2>`;\n\n for (const [role, applicants] of Object.entries(roles)) {\n emailHtml += `<h3>Role: ${escapeHtml(role)}</h3>`;\n \n // Build table header\n emailHtml += `\n <table border=\"1\" cellpadding=\"5\" cellspacing=\"0\" style=\"border-collapse:collapse; width: 100%;\">\n <thead style=\"background-color:#f0f0f0;\">\n <tr>\n <th>Name</th>\n <th>Email</th>\n <th>Phone</th>\n <th>Years of Experience</th>\n <th>Top Skills</th>\n <th>Location</th>\n <th>Notice Period</th>\n <th>Summary</th>\n </tr>\n </thead>\n <tbody>\n `;\n\n // Add each applicant as a row\n applicants.forEach(app => {\n emailHtml += `\n <tr>\n <td>${escapeHtml(app.name)}</td>\n <td><a href=\"mailto:${escapeHtml(app.email)}\">${escapeHtml(app.email)}</a></td>\n <td>${escapeHtml(app.phone)}</td>\n <td>${escapeHtml(app.years_of_experience?.toString())}</td>\n <td>${Array.isArray(app.top_skills) ? escapeHtml(app.top_skills.join(', ')) : escapeHtml(app.top_skills)}</td>\n <td>${escapeHtml(app.location)}</td>\n <td>${escapeHtml(app.notice_period)}</td>\n <td>${escapeHtml(app.summary)}</td>\n </tr>\n `;\n });\n\n emailHtml += `</tbody></table><br/>`;\n }\n\n // Push one item per manager, as output for the next step (email sending)\n output.push({\n json: {\n managerEmail,\n html: emailHtml\n }\n });\n}\n\nreturn output;\n"
},
"typeVersion": 2
},
{
"id": "9509d5c2-f66f-4294-9432-0b2587283b7a",
"name": "Send Digest to Managers",
"type": "n8n-nodes-base.gmail",
"position": [
900,
-80
],
"webhookId": "7fe812db-f512-4e0d-b4e5-f577fad2511c",
"parameters": {
"sendTo": "={{ $json.managerEmail }}",
"message": "={{ $json.html }}",
"options": {},
"subject": "=Today's Applicants Digest – {{ $now.format('MM-DD') }}"
},
"credentials": {
"gmailOAuth2": {
"id": "Kb30iigFce7pjkMZ",
"name": "Gmail account 5"
}
},
"typeVersion": 2.1
},
{
"id": "17486203-2374-43f0-88eb-80500108d770",
"name": "메모1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-520,
360
],
"parameters": {
"width": 1720,
"height": 780,
"content": "## Workflow Overview: Send daily applicant digest by role from Gmail to hiring managers with Google Gemini\n\n**Purpose:**\nAutomatically fetches new job application emails labeled applicants, extracts structured applicant details using OpenAI, groups candidates by role and manager, then sends a daily HTML summary email to each hiring manager.\n\nDaily Applicant Digest Workflow – Node Overview\n\n**1. Daily Trigger (6PM IST)**\n\nStarts the workflow every day at 18:00 (Asia/Kolkata timezone).\n\n**2. Fetch Applicant Emails**\n\nRetrieves all new application emails labeled applicants from the last 24 hours.\n\n**3. Read All Emails**\n\nRead each email’s labeled applicants which we retrieves\n\n**4. Extract Applicant Details**\n\nUses OpenAI to extract and structure applicant info (name, email, role, skills, etc.) in JSON format.\n\n**5. Assign Manager Emails**\n\nMaps each applicant’s role to a hiring manager’s email address.\n\nUses a fallback email if the role does not match any manager.\n\n**6. Group & Build HTML Tables**\n\nGroups applicants by manager and role.\n\nBuilds a clear, formatted HTML table for each group, summarizing all applicants.\n\n**7. Send Digest to Managers**\n\nSends one HTML summary email per manager, listing all relevant new applicants for the day.\n"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "67d27489-333a-4e73-8d9c-1af780d66304",
"connections": {
"Schedule Trigger": {
"main": [
[
{
"node": "4648ef51-49af-40f8-9c82-490c5965e5be",
"type": "main",
"index": 0
}
]
]
},
"Assign Manager Emails": {
"main": [
[
{
"node": "5943f68f-a39f-4532-a437-732d98d53079",
"type": "main",
"index": 0
}
]
]
},
"4648ef51-49af-40f8-9c82-490c5965e5be": {
"main": [
[
{
"node": "2a8e9656-df75-439f-ac16-ba608b29c87d",
"type": "main",
"index": 0
},
{
"node": "f479ae8a-490b-4b08-9fe3-dbe6a26b2320",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "2a8e9656-df75-439f-ac16-ba608b29c87d",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"2a8e9656-df75-439f-ac16-ba608b29c87d": {
"main": [
[
{
"node": "Assign Manager Emails",
"type": "main",
"index": 0
}
]
]
},
"5943f68f-a39f-4532-a437-732d98d53079": {
"main": [
[
{
"node": "9509d5c2-f66f-4294-9432-0b2587283b7a",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
중급 - AI 요약, 멀티모달 AI
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
고객 피드백 루프 분석기
AI, Google 스프레드시트 및 Slack 알림을 사용한 고객 피드백 자동 분류
Code
Gmail
Slack
+
Code
Gmail
Slack
11 노드WeblineIndia
기타
HTTP Last-Modified 확인을 사용하여 Google Sheets에서 채용 공고 만료 및 새로고침 알림 가져오기
Google Sheets, HTTP 확인 및 Gmail을 통한 채용 공고 만료 알림 자동화
If
Set
Code
+
If
Set
Code
19 노드WeblineIndia
인사
월간 에너지 발전 보고서
PostgreSQL, PDF.co 및 이메일 발송을 사용한 월간 에너지 보고서 자동 생성
Code
Gmail
Postgres
+
Code
Gmail
Postgres
7 노드WeblineIndia
문서 추출
사이버 보안 정보: Gemini AI를 사용하여 매일 요약 및 인기 주제 생성
网络安全 정보: Gemini AI를 사용하여 일일 요약 및 바이러스적 전파 주제 생성
Set
Code
Merge
+
Set
Code
Merge
39 노드Tom
AI 요약
BGV 추적기
BGV 상태 일일 요약: Google 스프레드시트로 상태 추적하고 Gmail 알림 발송
Code
Gmail
Google Sheets
+
Code
Gmail
Google Sheets
8 노드WeblineIndia
인사
매일 Jira 작업 요약 생성기 (GPT-5 + Jira API)
GPT-5와 Jira API를 사용한 매일 Jira 작업 요약 생성기
Set
Code
Jira
+
Set
Code
Jira
24 노드Billy Christi
AI 요약
워크플로우 정보
난이도
중급
노드 수10
카테고리2
노드 유형6
저자
WeblineIndia
@weblineindiaA Leading Software Engineering, Consulting & Outsourcing Services Company in USA & India serving Clients Globally since 1999.
외부 링크
n8n.io에서 보기 →
이 워크플로우 공유