RECIPE P5
미니 프로젝트 — 스타트업 HR 전주기 자동화 시스템
- ▸채용 공고 등록부터 온보딩 완료까지 HR 전 과정을 자동화할 수 있다
- ▸지원자 상태 변경을 트리거로 단계별 이메일과 Slack 알림을 자동 발송할 수 있다
- ▸HR 핵심 지표(채용 소요일, 온보딩 완료율)를 자동 집계할 수 있다
✅사전 준비
- □레시피 051~060 핵심 워크플로우 동작 확인
- □Notion HR 데이터베이스 구성 (지원자/직원 DB)
- □Gmail 자격증명 및 HR 전용 이메일 계정 준비
- □Slack #hr, #onboarding 채널 생성 완료
- □Google Forms 지원서 양식 생성 완료
HR 전주기 자동화 흐름
[1단계] 채용
Google Form 제출
→ Notion 지원자 DB 등록
→ Slack #hr 알림
→ 접수 확인 이메일 자동 발송
[2단계] 서류 검토
Notion 상태 변경 (서류합격)
→ 면접 일정 조율 이메일 발송
→ Calendly 링크 자동 포함
[3단계] 최종 합격
Notion 상태 변경 (최종합격)
→ 합격 이메일 발송
→ 온보딩 체크리스트 Notion 페이지 자동 생성
→ IT 장비 신청 Slack 메시지 (#it-team)
[4단계] 온보딩 완료
Notion 온보딩 체크 완료
→ HR KPI 시트 자동 업데이트Notion 지원자 DB — 상태 변경 감지 설정
노드: Notion Trigger (또는 Schedule + 폴링)
Database: 지원자 관리 DB
감지할 상태값:
- 서류합격 → 면접 안내 이메일 트리거
- 최종합격 → 온보딩 프로세스 트리거
- 불합격 → 정중한 거절 이메일 트리거
Notion 속성 필드 매핑:
이름: {{ $json.properties.이름.title[0].plain_text }}
이메일: {{ $json.properties.이메일.email }}
포지션: {{ $json.properties.포지션.select.name }}
상태: {{ $json.properties.상태.select.name }}온보딩 체크리스트 Notion 페이지 자동 생성
// Notion API - Create Page
const name = $json.name;
const position = $json.position;
const startDate = $json.startDate;
const checklistItems = [
'근로계약서 서명',
'개인정보 처리 동의서',
'사내 시스템 계정 생성',
'노트북 수령 및 환경 설정',
'팀 소개 미팅 (30분)',
'업무 툴 교육 (Notion/Slack/n8n)',
'1주차 OKR 설정',
'30일 플랜 작성',
];
return [{
json: {
parent: { database_id: 'YOUR_ONBOARDING_DB_ID' },
properties: {
이름: { title: [{ text: { content: `${name} 온보딩` } }] },
포지션: { select: { name: position } },
입사일: { date: { start: startDate } },
완료여부: { checkbox: false },
},
children: checklistItems.map(item => ({
object: 'block',
type: 'to_do',
to_do: {
rich_text: [{ text: { content: item } }],
checked: false,
},
})),
}
}];💡 TIPNotion Trigger 노드는 유료 플랜(n8n Cloud)에서만 실시간 동작합니다. Self-hosted 무료 환경이라면 Schedule Trigger로 10분마다 Notion DB를 폴링하고 '처리됨' 체크박스 컬럼으로 중복 처리를 방지하세요.
⚠️ 주의지원자 개인정보(이름, 이메일, 이력서)는 채용 종료 후 법적 보관 기간(통상 6개월~1년) 이후 반드시 삭제해야 합니다. Notion DB에 '개인정보 삭제 예정일' 컬럼을 추가하고 자동 삭제 알림 워크플로우도 함께 구성하세요.
⚡
워크플로우 JSON
아래 JSON을 복사해 n8n에 바로 임포트하세요
📥 n8n 임포트 방법
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
{
"projectId": "miniproject05",
"title": "스타트업 HR 전주기 자동화 시스템",
"chapter": 5,
"difficulty": "⭐⭐⭐",
"estimatedTime": "120분",
"description": "채용 공고 등록부터 지원서 정리·면접 조율·온보딩·인사평가·퇴직까지 HR 전 주기를 하나의 자동화 시스템으로 연결합니다. 한 명의 HR 담당자가 혼자서도 충분히 관리할 수 있는 구조예요.",
"usedRecipes": [
"recipe051",
"recipe052",
"recipe053",
"recipe054",
"recipe055",
"recipe056",
"recipe057",
"recipe058",
"recipe059",
"recipe060"
],
"pipeline": [
{
"phase": "채용 공고",
"description": "Google Sheets에 공고 정보를 한 번 입력하면 잡코리아·사람인·LinkedIn에 동시 등록되고 Slack으로 완료 알림을 받습니다.",
"recipe": "recipe059",
"trigger": "Google Sheets 행 추가 — 채용공고 시트",
"nodes": [
{
"id": "trigger_job_post",
"type": "trigger",
"service": "Google Sheets",
"name": "신규 공고 등록 감지",
"config": {
"event": "rowAdded",
"spreadsheetId": "{{$env.RECRUIT_SHEET_ID}}",
"sheetName": "채용공고"
}
},
{
"id": "post_all_channels",
"type": "action",
"service": "Function",
"name": "다채널 병렬 등록",
"config": {
"code": "// 잡코리아·사람인·LinkedIn API 병렬 호출\n// 각 플랫폼별 필드 매핑 후 HTTP Request 노드로 분기\nreturn [{ json: $json }];"
}
},
{
"id": "notify_posted",
"type": "action",
"service": "Slack",
"name": "등록 완료 알림",
"config": {
"operation": "sendMessage",
"channel": "{{$env.RECRUIT_SLACK_CHANNEL}}",
"message": "📢 채용 공고 {{$json['공고제목']}} — 3개 플랫폼 등록 완료!"
}
}
],
"edges": [
{
"from": "trigger_job_post",
"to": "post_all_channels"
},
{
"from": "post_all_channels",
"to": "notify_posted"
}
]
},
{
"phase": "지원 접수",
"description": "지원서 이메일 수신 시 OpenAI로 지원자 정보를 추출해 시트에 자동 기록하고 채용팀 Slack에 알림을 보냅니다.",
"recipe": "recipe051",
"trigger": "Gmail Trigger — '지원' 키워드 이메일",
"nodes": [
{
"id": "trigger_application",
"type": "trigger",
"service": "Gmail",
"name": "지원서 이메일 수신",
"config": {
"event": "messageReceived",
"filters": {
"subject": "지원"
}
}
},
{
"id": "extract_applicant",
"type": "action",
"service": "OpenAI",
"name": "지원자 정보 추출",
"config": {
"operation": "chat",
"model": "gpt-4o-mini",
"messages": [
{
"role": "system",
"content": "채용 지원서에서 이름, 포지션, 이메일, 연락처를 JSON으로 추출하세요."
},
{
"role": "user",
"content": "{{$json['subject']}}\n{{$json['text'].slice(0,1000)}}"
}
]
}
},
{
"id": "record_applicant",
"type": "action",
"service": "Google Sheets",
"name": "지원자 시트 기록",
"config": {
"operation": "appendRow",
"spreadsheetId": "{{$env.RECRUIT_SHEET_ID}}",
"sheetName": "지원자목록",
"row": {
"접수일": "{{$now.format('YYYY-MM-DD')}}",
"이름": "{{$json['name']}}",
"포지션": "{{$json['position']}}",
"이메일": "{{$json['email']}}",
"상태": "서류검토중"
}
}
},
{
"id": "alert_new_applicant",
"type": "action",
"service": "Slack",
"name": "채용팀 알림",
"config": {
"operation": "sendMessage",
"channel": "{{$env.RECRUIT_SLACK_CHANNEL}}",
"message": "📨 새 지원자: {{$json['name']}} ({{$json['position']}})"
}
}
],
"edges": [
{
"from": "trigger_application",
"to": "extract_applicant"
},
{
"from": "extract_applicant",
"to": "record_applicant"
},
{
"from": "record_applicant",
"to": "alert_new_applicant"
}
]
},
{
"phase": "서류 합격",
"description": "지원자 시트에서 상태가 '서류합격'으로 바뀌면 합격 안내 이메일과 Calendly 면접 예약 링크를 자동 발송합니다.",
"recipe": "recipe052",
"trigger": "Google Sheets 행 업데이트 — 상태 = '서류합격'",
"nodes": [
{
"id": "trigger_pass",
"type": "trigger",
"service": "Google Sheets",
"name": "서류합격 상태 변경 감지",
"config": {
"event": "rowUpdated",
"watchColumn": "상태",
"watchValue": "서류합격"
}
},
{
"id": "send_pass_notice",
"type": "action",
"service": "Gmail",
"name": "합격 + 면접 예약 링크 발송",
"config": {
"operation": "sendEmail",
"to": "{{$json['이메일']}}",
"subject": "[합격] {{$json['포지션']}} 서류 전형 합격을 축하드립니다!",
"body": "{{$json['이름']}}님, 합격을 축하드립니다! 🎉\n\n면접 일정 선택: {{$env.CALENDLY_INTERVIEW_URL}}"
}
}
],
"edges": [
{
"from": "trigger_pass",
"to": "send_pass_notice"
}
]
},
{
"phase": "입사 결정",
"description": "신규 직원이 직원 명단에 등록되면 D+1·D+3·D+7·D+14·D+30 순차 온보딩 이메일 발송이 자동 시작됩니다.",
"recipe": "recipe053",
"trigger": "Google Sheets 행 추가 — 직원명단 시트",
"nodes": [
{
"id": "trigger_new_hire",
"type": "trigger",
"service": "Google Sheets",
"name": "신규 입사자 등록 감지",
"config": {
"event": "rowAdded",
"spreadsheetId": "{{$env.HR_SHEET_ID}}",
"sheetName": "직원명단"
}
},
{
"id": "start_onboarding",
"type": "action",
"service": "Gmail",
"name": "D+1 온보딩 이메일 시작",
"config": {
"operation": "sendEmail",
"to": "{{$json['이메일']}}",
"subject": "{{$env.COMPANY_NAME}}에 오신 것을 환영합니다! 🎉",
"body": "{{$json['이름']}}님, 첫날 안내드립니다.\n\n✅ 오늘 확인 사항:\n- 시스템 계정 활성화\n- 팀 소개 미팅 일정 확인\n- 사내 규정 문서 검토"
}
}
],
"edges": [
{
"from": "trigger_new_hire",
"to": "start_onboarding"
}
]
},
{
"phase": "근무 중",
"description": "생일·입사 기념일 자동 축하 메시지를 Slack 전체 채널에 발송하고, 매주 금요일 팀원별 주간 업무 보고를 자동 수집·취합합니다.",
"recipes": [
"recipe055",
"recipe056"
],
"trigger": "Schedule Trigger — 매일 오전 9시(생일) + 매주 금요일 오후 4시(주간보고)",
"nodes": [
{
"id": "trigger_daily_celebration",
"type": "trigger",
"service": "Schedule",
"name": "매일 오전 9시",
"config": {
"interval": "daily",
"time": "09:00"
}
},
{
"id": "check_birthday_anniversary",
"type": "action",
"service": "Google Sheets",
"name": "생일·기념일 확인",
"config": {
"operation": "readRows",
"spreadsheetId": "{{$env.HR_SHEET_ID}}",
"sheetName": "직원명단"
}
},
{
"id": "send_celebration",
"type": "action",
"service": "Slack",
"name": "축하 메시지 발송",
"config": {
"operation": "sendMessage",
"channel": "{{$env.GENERAL_SLACK_CHANNEL}}",
"message": "🎂 오늘은 <@{{$json['슬랙ID']}}>님의 생일이에요! 축하해요! 🎉"
}
},
{
"id": "trigger_weekly_report",
"type": "trigger",
"service": "Schedule",
"name": "매주 금요일 오후 4시",
"config": {
"interval": "weekly",
"dayOfWeek": "friday",
"time": "16:00"
}
},
{
"id": "request_weekly_report",
"type": "action",
"service": "Slack",
"name": "주간 보고 DM 요청",
"config": {
"operation": "sendDM",
"userId": "{{$json['슬랙ID']}}",
"message": "📝 이번 주 업무 요약을 입력해 주세요! (완료/진행중/이슈/다음주계획)"
}
}
],
"edges": [
{
"from": "trigger_daily_celebration",
"to": "check_birthday_anniversary"
},
{
"from": "check_birthday_anniversary",
"to": "send_celebration"
},
{
"from": "trigger_weekly_report",
"to": "request_weekly_report"
}
]
},
{
"phase": "인사평가",
"description": "평가 시작 7일·3일·당일에 안내 이메일을 발송하고, 마감 D-1에 미제출자에게 리마인더를 자동 발송합니다.",
"recipe": "recipe057",
"trigger": "Schedule Trigger — 매일 오전 9시 (평가 일정 시트 자동 확인)",
"nodes": [
{
"id": "trigger_eval_check",
"type": "trigger",
"service": "Schedule",
"name": "매일 오전 9시 평가 일정 확인",
"config": {
"interval": "daily",
"time": "09:00"
}
},
{
"id": "check_eval_dates",
"type": "action",
"service": "Google Sheets",
"name": "평가 일정 조회",
"config": {
"operation": "readRows",
"spreadsheetId": "{{$env.EVAL_SHEET_ID}}",
"sheetName": "평가일정"
}
},
{
"id": "send_eval_notice",
"type": "action",
"service": "Gmail",
"name": "평가 안내 이메일 발송",
"config": {
"operation": "sendEmail",
"to": "{{$json['대상자이메일']}}",
"subject": "[인사평가] {{$json['평가명']}} 안내",
"body": "평가 기간: {{$json['시작일']}} ~ {{$json['마감일']}}\n설문: {{$json['설문URL']}}"
}
}
],
"edges": [
{
"from": "trigger_eval_check",
"to": "check_eval_dates"
},
{
"from": "check_eval_dates",
"to": "send_eval_notice"
}
]
},
{
"phase": "퇴직",
"description": "퇴직자 시트 등록 즉시 IT팀·경리팀·HR팀에 부서별 처리 항목 Slack 알림을 발송하고, 퇴직자에게 반납 안내 이메일을 자동 발송합니다.",
"recipe": "recipe058",
"trigger": "Google Sheets 행 추가 — 퇴직자목록 시트",
"nodes": [
{
"id": "trigger_resign",
"type": "trigger",
"service": "Google Sheets",
"name": "퇴직자 등록 감지",
"config": {
"event": "rowAdded",
"spreadsheetId": "{{$env.HR_SHEET_ID}}",
"sheetName": "퇴직자목록"
}
},
{
"id": "notify_it",
"type": "action",
"service": "Slack",
"name": "IT팀 오프보딩 알림",
"config": {
"operation": "sendMessage",
"channel": "{{$env.IT_SLACK_CHANNEL}}",
"message": "🔧 퇴직 처리 — {{$json['이름']}}님 ({{$json['퇴직일']}})\n- 계정 비활성화\n- 장비 반납 확인"
}
},
{
"id": "notify_finance",
"type": "action",
"service": "Slack",
"name": "경리팀 오프보딩 알림",
"config": {
"operation": "sendMessage",
"channel": "{{$env.FINANCE_SLACK_CHANNEL}}",
"message": "💰 퇴직 처리 — {{$json['이름']}}님 ({{$json['퇴직일']}})\n- 퇴직금·급여 정산\n- 4대보험 상실 신고"
}
},
{
"id": "send_offboard_mail",
"type": "action",
"service": "Gmail",
"name": "퇴직자 반납 안내 이메일",
"config": {
"operation": "sendEmail",
"to": "{{$json['이메일']}}",
"subject": "[퇴직 안내] 반납 물품 및 처리 안내",
"body": "{{$json['이름']}}님, 그동안 감사했습니다.\n\n반납 물품: 노트북·사원증·법인카드\n문의: {{$env.HR_EMAIL}}"
}
}
],
"edges": [
{
"from": "trigger_resign",
"to": "notify_it"
},
{
"from": "trigger_resign",
"to": "notify_finance"
},
{
"from": "trigger_resign",
"to": "send_offboard_mail"
}
]
}
],
"envVariables": {
"RECRUIT_SHEET_ID": "채용 관리 구글 시트 ID",
"RECRUIT_SLACK_CHANNEL": "채용팀 Slack 채널 (예: #recruiting)",
"HR_SHEET_ID": "HR 직원 관리 구글 시트 ID",
"HR_SLACK_CHANNEL": "HR팀 Slack 채널 (예: #hr-team)",
"GENERAL_SLACK_CHANNEL": "전체 Slack 채널 (예: #general)",
"MANAGER_SLACK_ID": "팀장 Slack 사용자 ID",
"IT_SLACK_CHANNEL": "IT팀 Slack 채널 (예: #it-team)",
"FINANCE_SLACK_CHANNEL": "경리팀 Slack 채널 (예: #finance)",
"CALENDLY_INTERVIEW_URL": "면접 예약 Calendly 링크",
"EVAL_SHEET_ID": "인사평가 일정 구글 시트 ID",
"COMPANY_NAME": "회사명",
"HR_EMAIL": "HR팀 이메일 주소",
"HR_DASHBOARD_URL": "HR KPI 대시보드 구글 시트 공유 URL",
"JOBKOREA_API_KEY": "잡코리아 API 키",
"SARAMIN_API_KEY": "사람인 API 키",
"LINKEDIN_ACCESS_TOKEN": "LinkedIn API 액세스 토큰",
"COMPANY_APPLY_URL": "자사 채용 지원 페이지 URL",
"ONBOARDING_SURVEY_URL": "온보딩 설문 구글 폼 URL",
"ONBOARDING_FINAL_SURVEY_URL": "온보딩 최종 설문 구글 폼 URL",
"LEAVE_SHEET_ID": "휴가 신청 구글 시트 ID",
"TEAM_CALENDAR_ID": "팀 구글 캘린더 ID",
"WEEKLY_REPORT_SHEET_ID": "주간 보고 구글 시트 ID",
"WEEKLY_REPORT_SHEET_URL": "주간 보고 시트 공유 URL"
},
"tips": [
"7단계 파이프라인 전체를 한 번에 구성하려 하지 말고, 레시피 표의 순서대로 단계별로 하나씩 연결해 나가세요.",
"각 단계의 트리거는 모두 Google Sheets 상태 변경 또는 Schedule로 통일하면 관리가 훨씬 쉬워요.",
"Wait 노드를 사용하는 온보딩 워크플로우(recipe053)는 n8n 클라우드 환경에서 운영하는 것을 권장해요.",
"HR 데이터는 개인정보 보호가 중요해요. n8n 인스턴스의 접근 권한과 Google Sheets 공유 설정을 반드시 최소 권한으로 유지하세요."
],
"qrUrl": "www.koreaaitimes.com/books/n8n-vol2/recipe060p"
}