고용 후 유지율 추적
고급
이것은Content Creation, Multimodal AI분야의자동화 워크플로우로, 19개의 노드를 포함합니다.주로 If, Code, Gmail, Merge, GoogleSheets 등의 노드를 사용하며. 사용하여 GPT-4o와 Gmail 요약을 통해 직원 유지 보수 분석 보고서 생성
사전 요구사항
- •Google 계정 및 Gmail API 인증 정보
- •Google Sheets API 인증 정보
- •OpenAI API Key
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "T8iqiPFY6WdVtlC0",
"meta": {
"instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177"
},
"name": "Retention Tracking Post-Hire",
"tags": [],
"nodes": [
{
"id": "c315357f-e9ad-43c8-89f3-e0a030fb6308",
"name": "워크플로우 실행 시",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-544,
-32
],
"parameters": {},
"typeVersion": 1
},
{
"id": "5703baf8-53a0-46a7-b8fe-1bddb3da80a5",
"name": "후보자 데이터 가져오기",
"type": "n8n-nodes-base.googleSheets",
"position": [
-256,
64
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1454922719,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit#gid=1454922719",
"cachedResultName": "Retention Summary)"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit?usp=drivesdk",
"cachedResultName": "Interviewer Brief Pack "
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "kpPEOLCGn963qpoh",
"name": "automations@techdome.ai"
}
},
"typeVersion": 4.6
},
{
"id": "76e5ed93-981c-402f-ba97-0f6c07b4642e",
"name": "스티키 노트",
"type": "n8n-nodes-base.stickyNote",
"position": [
880,
464
],
"parameters": {
"height": 384,
"content": "## ⚠️ Error Handling Logic (Google Sheets – Error Log) \n\n**Action:** \n- Appends failed runs into the *Error Log Sheet*. \n\n**Description:** \n- Records details like error_id and error message. \n- Provides visibility into workflow issues. \n- Ensures graceful handling of bad data without breaking the workflow. \n"
},
"typeVersion": 1
},
{
"id": "d48ac595-d48e-401d-88bd-a31c3cd596d4",
"name": "스티키 노트1",
"type": "n8n-nodes-base.stickyNote",
"position": [
592,
176
],
"parameters": {
"height": 448,
"content": "## ✅ Data Validation \n\n**Action:** \n- Validates whether both candidate and trait arrays contain records. \n\n**Description:** \n- Condition checks: `candidates.length > 0` AND `traits.length > 0`. \n- If TRUE → proceeds to LLM digest generation. \n- If FALSE → workflow routes to error logging. \n- Prevents empty datasets from reaching AI/email stages. \n"
},
"typeVersion": 1
},
{
"id": "bddb3bf5-c3bb-4899-b6ff-aa22b953b366",
"name": "스티키 노트2",
"type": "n8n-nodes-base.stickyNote",
"position": [
304,
-496
],
"parameters": {
"width": 304,
"height": 464,
"content": "## 🧮 Candidate Scoring & Data Normalization (Code Node) \n\n**Action:** \n- Cleans, normalizes, and enriches the merged dataset. \n\n**Description:** \n- Splits rows into two arrays: `candidates[]` and `traits[]`. \n- Normalizes headers, trims spaces, and standardizes data. \n- Builds a trait → weight lookup map from the Retention Summary. \n- Calculates each candidate’s `Candidate_Score` based on their traits. \n- Outputs clean JSON with both candidates and traits. \n"
},
"typeVersion": 1
},
{
"id": "549cdd14-5514-4413-9e91-ec3ddd9aa771",
"name": "스티키 노트3",
"type": "n8n-nodes-base.stickyNote",
"position": [
80,
192
],
"parameters": {
"width": 272,
"height": 384,
"content": "## 🔀 Merge Candidate + Trait Data \n\n**Action:** \n- Combines candidate-level and trait-level rows into one dataset. \n\n**Description:** \n- Unifies inputs from both sheets into a single stream. \n- Ensures both granular (candidates) and aggregated (traits) data are processed together. \n- Passes consolidated data into the scoring and enrichment step. \n"
},
"typeVersion": 1
},
{
"id": "b9f7939e-a01f-400f-b5b1-45b9202f6bc4",
"name": "스티키 노트4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-352,
-576
],
"parameters": {
"width": 288,
"height": 400,
"content": "## 📑 Trait Summary Fetch (Google Sheets – Retention Summary) \n\n**Action:** \n- Retrieves aggregated trait-level data from the Retention Summary sheet. \n\n**Description:** \n- Collects retention stats like hires, stayed, left, retention %, and weight adjustment. \n- Identifies which traits are positively or negatively correlated with retention. \n- Feeds into candidate scoring logic to adjust weights dynamically. \n"
},
"typeVersion": 1
},
{
"id": "a5260ee9-3a6a-4cc1-ae50-426cb4e7d372",
"name": "스티키 노트5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-336,
240
],
"parameters": {
"width": 272,
"height": 416,
"content": "## 📑 Candidate Data Fetch (Google Sheets – Hires Tracking) \n\n**Action:** \n- Retrieves the candidate’s details from the designated Google Sheet. \n\n**Description:** \n- Pulls structured information such as candidate name, role, traits, start date, and retention status. \n- This sheet acts as the source of truth for post-hire outcomes. \n- Ensures accurate and up-to-date records for downstream scoring and reporting. \n"
},
"typeVersion": 1
},
{
"id": "5b4a9840-0dd7-4fcc-b6d1-a2ca015d5daf",
"name": "스티키 노트6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1168,
192
],
"parameters": {
"height": 384,
"content": "## 🧠 AI Processing Backend (Azure OpenAI Node) \n\n**Action:** \n- Executes GPT processing using Azure OpenAI. \n\n**Description:** \n- Takes candidate + trait JSON input. \n- Applies strict prompting rules (no hallucination, only dataset values). \n- Returns formatted HTML insights for downstream use. \n"
},
"typeVersion": 1
},
{
"id": "94d3d781-c9a4-4778-8029-440612132c7f",
"name": "스티키 노트7",
"type": "n8n-nodes-base.stickyNote",
"position": [
1024,
-512
],
"parameters": {
"width": 368,
"height": 464,
"content": "## 🤖 Retention Digest Generator (LLM Chain) \n\n**Action:** \n- Generates an HTML Retention Digest using Azure OpenAI. \n\n**Description:** \n- Summarizes retention insights into a structured email. \n- Sections include: \n - TL;DR Summary \n - Top Traits (positive) \n - Weak Traits (negative) \n - Candidate Highlights with scores \n - 3 Actionable JD Refinement Tips \n- Ensures valid, styled HTML output ready for email. \n"
},
"typeVersion": 1
},
{
"id": "b6bf37e0-ebfd-48d4-a47b-66d6bbaa2991",
"name": "스티키 노트8",
"type": "n8n-nodes-base.stickyNote",
"position": [
1504,
-496
],
"parameters": {
"height": 432,
"content": "## 📧 Email Delivery (Gmail – Send Digest) \n\n**Action:** \n- Sends the Retention Digest via Gmail. \n\n**Description:** \n- Uses the HTML generated by the LLM as the email body. \n- Subject: *Retention Analysis Digest – Weekly Update*. \n- Recipients: Hiring managers / stakeholders. \n- Automates communication of insights directly to decision-makers. \n"
},
"typeVersion": 1
},
{
"id": "82cb57ca-7214-4789-ba0e-c49871938f13",
"name": "특성 요약 가져오기",
"type": "n8n-nodes-base.googleSheets",
"position": [
-256,
-144
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": 834845387,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit#gid=834845387",
"cachedResultName": "Hires Tracking"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit?usp=drivesdk",
"cachedResultName": "Interviewer Brief Pack "
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "kpPEOLCGn963qpoh",
"name": "automations@techdome.ai"
}
},
"typeVersion": 4.6
},
{
"id": "41c489c1-9aa2-4ea7-a000-c57e0cd237f0",
"name": "후보자 + 특성 데이터 병합",
"type": "n8n-nodes-base.merge",
"position": [
128,
0
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "88119bb1-b48a-4d71-95da-6f012e87830e",
"name": "후보자 점수 산정 및 데이터 정규화",
"type": "n8n-nodes-base.code",
"position": [
416,
0
],
"parameters": {
"jsCode": "// ---- STEP 1: Separate inputs ----\nconst allRows = $input.all();\n\n// Identify rows with candidate info (Hire Tracking) vs traits (Retention Summary)\nconst candidateRaw = allRows.filter(r => r.json[\"Candidate \"] || r.json.Candidate);\nconst traitsRaw = allRows.filter(r => r.json.Trait);\n\n// ---- STEP 2: Normalize Candidate Data ----\nconst candidates = candidateRaw.map(c => {\n return {\n row_number: c.json.row_number,\n Candidate: (c.json[\"Candidate \"] || c.json.Candidate || \"\").trim(),\n Role: (c.json[\"Role \"] || c.json.Role || \"\").trim(),\n Traits: (c.json[\"Traits \"] || c.json.Traits || \"\").trim(),\n Start_Date: c.json[\"Start Date\"] || null,\n Status: (c.json[\"Status \"] || c.json.Status || \"\").trim(),\n Retention_30: c.json[\"Retention_30 \"] ?? c.json.Retention_30 ?? null,\n Retention_90: c.json[\"Retention_90\"] ?? null,\n Candidate_Score: c.json[\"Candidate_Score\"] || 0\n };\n});\n\n// ---- STEP 3: Normalize Traits Summary ----\nconst traits = traitsRaw.map(t => {\n return {\n Trait: t.json.Trait,\n Total_Hires: parseInt(t.json.Total_Hires, 10) || 0,\n Stayed_90: parseInt(t.json.Stayed_90, 10) || 0,\n Left_90: parseInt(t.json.Left_90, 10) || 0,\n \"Retention_%\": parseFloat(t.json[\"Retention_%\"]) || 0,\n Weight_Adjust: parseInt(t.json.Weight_Adjust, 10) || 0,\n Candidate_Score: t.json.Candidate_Score || 0\n };\n});\n\n// ---- STEP 4: Build Trait Weight Lookup ----\nconst weightMap = {};\nfor (const t of traits) {\n weightMap[t.Trait] = t.Weight_Adjust;\n}\n\n// ---- STEP 5: Calculate Candidate Scores ----\nfor (const c of candidates) {\n let score = 0;\n const candidateTraits = (c.Traits || \"\").split(\",\").map(t => t.trim());\n candidateTraits.forEach(trait => {\n score += weightMap[trait] ?? 0;\n });\n c.Candidate_Score = score;\n}\n\n// ---- STEP 6: Final Combined Output ----\nreturn [\n {\n json: {\n candidates,\n traits\n }\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "b563b0b1-393d-48a3-8f8f-d8c55fa1d8b7",
"name": "데이터 유효성 검사",
"type": "n8n-nodes-base.if",
"position": [
672,
0
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "01f729d5-7169-4f69-89cc-90bc194d11b5",
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{ $json.candidates.length }}",
"rightValue": 0
},
{
"id": "ef01e17b-4779-4819-a879-742246d8a3f4",
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{ $json.traits.length }}",
"rightValue": 0
}
]
}
},
"typeVersion": 2.2
},
{
"id": "71be08e3-2031-416a-851f-9833953b1e25",
"name": "오류 처리 로직",
"type": "n8n-nodes-base.googleSheets",
"position": [
928,
304
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "error_id",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "error_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "error",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "error",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"error_id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1338537721,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit#gid=1338537721",
"cachedResultName": "error log sheet"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit?usp=drivesdk",
"cachedResultName": "Interviewer Brief Pack "
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "kpPEOLCGn963qpoh",
"name": "automations@techdome.ai"
}
},
"typeVersion": 4.6
},
{
"id": "62e4914b-c97a-46b7-bd66-1fc1cbd4d0df",
"name": "리텐션 요약 생성기",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
1104,
-16
],
"parameters": {
"text": "=Here is the retention dataset:\n\n{{ JSON.stringify($json, null, 2) }}\n\nGenerate one **Retention Digest** email using this dataset. \nThe HTML should include the following sections:\n\n1. **TL;DR Summary** – one short paragraph summarizing retention insights. \n2. **Top Traits (Strong Retention + Positive Weights)** – list traits with Retention_% = 1 and Weight_Adjust > 0. \n3. **Weak Traits (Poor Retention + Negative Weights)** – list traits with Retention_% = 0 or Weight_Adjust < 0. \n4. **Candidate Highlights** – list each candidate, their traits, retention status, and Candidate_Score (positive/negative). \n5. **Actionable Tips** – provide 3 practical JD refinement recommendations based only on this dataset. \n\n📌 **Formatting requirements**: \n- Blue header bar (#0073e6) with white bold title “Retention Insights Digest”. \n- White card-style container with light shadow + rounded corners. \n- Section headings: \n • Blue (#0073e6) for TL;DR and Top Traits \n • Red (#d9534f) for Weak Traits \n • Green (#28a745) for Actionable Tips \n- Candidate list in a table (Name, Traits, Score, Retention_90). \n- Green CTA button (#28a745) at the bottom labeled “View Full Report”. \n- Output only valid HTML, no markdown or code fences. \n",
"batching": {},
"messages": {
"messageValues": [
{
"message": "You are an HR Analytics Assistant. STRICT RULES: - Use ONLY the traits and candidate data from the provided dataset. - Do not invent or hallucinate new traits, values, or candidates. - Always echo the exact Retention_% and Weight_Adjust values. - Show candidate scores exactly as calculated. - Output must be valid, production-ready HTML email with inline CSS styling (email-safe). - Do not include markdown or code fences (no ```html)."
}
]
},
"promptType": "define"
},
"typeVersion": 1.7
},
{
"id": "9fc86f99-9bc5-4161-9145-9cce505d808c",
"name": "AI 처리 백엔드",
"type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
"position": [
1072,
160
],
"parameters": {
"model": "gpt-4o-mini",
"options": {}
},
"credentials": {
"azureOpenAiApi": {
"id": "C3WzT18XqF8OdVM6",
"name": "Azure Open AI account"
}
},
"typeVersion": 1
},
{
"id": "489d85e3-e51c-4db9-ab20-e466db61aa1e",
"name": "이메일 전송",
"type": "n8n-nodes-base.gmail",
"position": [
1552,
-16
],
"parameters": {
"toList": [
"newscctv22@gmail.com"
],
"message": " Weekly Update",
"subject": "=Retention Analysis Digest - Weekly Update\n",
"resource": "message",
"htmlMessage": "={{ $json.text }}",
"includeHtml": true,
"additionalFields": {
"ccList": []
}
},
"credentials": {
"gmailOAuth2": {
"id": "gEIaWCTvGfYjMSb3",
"name": "Gmail credentials"
}
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "1c0b5bac-8ce0-4e48-a2e1-b9bf0868d16a",
"connections": {
"b563b0b1-393d-48a3-8f8f-d8c55fa1d8b7": {
"main": [
[
{
"node": "62e4914b-c97a-46b7-bd66-1fc1cbd4d0df",
"type": "main",
"index": 0
}
],
[
{
"node": "71be08e3-2031-416a-851f-9833953b1e25",
"type": "main",
"index": 0
}
]
]
},
"5703baf8-53a0-46a7-b8fe-1bddb3da80a5": {
"main": [
[
{
"node": "41c489c1-9aa2-4ea7-a000-c57e0cd237f0",
"type": "main",
"index": 1
}
]
]
},
"82cb57ca-7214-4789-ba0e-c49871938f13": {
"main": [
[
{
"node": "41c489c1-9aa2-4ea7-a000-c57e0cd237f0",
"type": "main",
"index": 0
}
]
]
},
"9fc86f99-9bc5-4161-9145-9cce505d808c": {
"ai_languageModel": [
[
{
"node": "62e4914b-c97a-46b7-bd66-1fc1cbd4d0df",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"62e4914b-c97a-46b7-bd66-1fc1cbd4d0df": {
"main": [
[
{
"node": "489d85e3-e51c-4db9-ab20-e466db61aa1e",
"type": "main",
"index": 0
}
]
]
},
"41c489c1-9aa2-4ea7-a000-c57e0cd237f0": {
"main": [
[
{
"node": "88119bb1-b48a-4d71-95da-6f012e87830e",
"type": "main",
"index": 0
}
]
]
},
"c315357f-e9ad-43c8-89f3-e0a030fb6308": {
"main": [
[
{
"node": "5703baf8-53a0-46a7-b8fe-1bddb3da80a5",
"type": "main",
"index": 0
},
{
"node": "82cb57ca-7214-4789-ba0e-c49871938f13",
"type": "main",
"index": 0
}
]
]
},
"88119bb1-b48a-4d71-95da-6f012e87830e": {
"main": [
[
{
"node": "b563b0b1-393d-48a3-8f8f-d8c55fa1d8b7",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 콘텐츠 제작, 멀티모달 AI
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
## 자체 호스팅 N8N 사용자 전용:
GPT-4o-mini, Google Sheets, Gmail을 사용한 Zendesk 지원 응답 자동화
Code
Gmail
Merge
+
Code
Gmail
Merge
24 노드Rahul Joshi
콘텐츠 제작
면접 품질 감사
GPT-4o-mini 및 Google 시트를 통해 Slack으로 면접 피드백 검토 및 보고서 생성
If
Code
Slack
+
If
Code
Slack
23 노드Rahul Joshi
콘텐츠 제작
Azure OpenAI 및 Google Workspace를 사용한 DEI 자격 심사 자동화
Azure GPT-4o, Google 드라이브 및 스프레드시트를 사용한 DEI 자격 심사 자동화
If
Code
Gmail
+
If
Code
Gmail
19 노드Rahul Joshi
콘텐츠 제작
고객 입사 도움 요청 (Typeform → Gmail 및 Sheets)
고객 입사 도움 요청 (Typeform에서 Gmail과 Sheets로)
If
Code
Gmail
+
If
Code
Gmail
28 노드Rahul Joshi
콘텐츠 제작
영향력자 일일 권장 사항
GPT-4o-mini와 Gmail을 사용하여 영향력자에게 LinkedIn 콘텐츠 아이디어 생성
Code
Gmail
Manual Trigger
+
Code
Gmail
Manual Trigger
10 노드Rahul Joshi
콘텐츠 제작
Google Drive에서 n8n 템플릿 설명을 생성
Azure GPT-4를 사용하여 Google Drive에서 템플릿 설명 생성
Code
Gmail
Google Drive
+
Code
Gmail
Google Drive
27 노드Rahul Joshi
콘텐츠 제작
워크플로우 정보
난이도
고급
노드 수19
카테고리2
노드 유형9
저자
Rahul Joshi
@rahul08Rahul Joshi is a seasoned technology leader specializing in the n8n automation tool and AI-driven workflow automation. With deep expertise in building open-source workflow automation and self-hosted automation platforms, he helps organizations eliminate manual processes through intelligent n8n ai agent automation solutions.
외부 링크
n8n.io에서 보기 →
이 워크플로우 공유