품절은 항상 고객이 먼저 알았습니다. 담당자가 시트를 열어 재고를 확인할 때쯤이면 이미 주문이 끊긴 뒤였고, 급하게 발주하느라 단가에서 손해를 봤습니다.
재고 데이터는 이미 Google Sheets에 다 있었습니다. 빠진 건 그걸 매일 같은 시각에 훑어 주는 사람이었죠. 그 사람을 워크플로우로 대체했습니다. 정해진 시간에 시트를 읽고, 임계치 아래로 떨어진 SKU만 골라 Slack으로 보고합니다. 정상 재고는 건드리지 않으므로 알림 노이즈가 없습니다.
CR매일 09:00GS시트 조회<임계치 감지SLSlack 알림
어떻게 동작하나
Schedule Trigger노드가 매일 오전 9시(KST) 크론으로 워크플로우를 시작합니다.Google Sheets Read노드가product_id | name | stock | reorder_threshold | supplier_email스키마의 시트 전체를 읽습니다.Code노드가 각 행의stock < reorder_threshold여부를 판정하고, 낮은 재고 목록을 하나의 Slack 메시지로 포맷합니다. 임계치 아래 SKU가 없으면 빈 배열을 반환해 워크플로우가 조용히 종료됩니다.Slack Send Message노드가#inventory-alerts채널로 부족 재고 요약을 게시합니다. 각 라인에product_id, 이름, 현재 재고 / 임계치, 공급사 이메일이 포함됩니다.
필요한 것
- n8n 2.29.9 이상 (자체 호스팅 또는 Cloud). 검증은 자체 호스팅 Docker(
docker.n8n.io/n8nio/n8n)에서 진행했습니다. - Google Sheets OAuth2 API 자격증명 — n8n Credentials에서
Google Sheets OAuth2 API로 등록. Google Cloud 프로젝트에서 Sheets API를 활성화한 뒤 OAuth 2.0 클라이언트 ID를 발급받아 사용합니다. - Slack Bot User OAuth Token — Slack 앱 관리자 페이지에서 앱을 만들고
chat:write,channels:read스코프를 부여한 뒤 워크스페이스에 설치.xoxb-로 시작하는 토큰을 n8n Credentials에Slack API로 등록합니다. - 재고 시트 — Google Drive에 시트 하나. 첫 번째 행은 헤더(
product_id | name | stock | reorder_threshold | supplier_email), 두 번째 행부터 실제 데이터.stock과reorder_threshold는 숫자여야 합니다 (문자열이면 필터가 동작하지 않습니다). - Slack 채널 — 알림을 받을 채널. Slack에서
/invite @your-bot-name으로 봇을 초대해 두어야 게시가 됩니다.
시트 스키마 (첫 행 = 헤더)
product_id | name | stock | reorder_threshold | supplier_email
SKU-001 | 프리미엄 원두 1kg | 8 | 20 | supplier1@example.com
SKU-002 | 텀블러 350ml | 45 | 15 | supplier2@example.com
SKU-003 | 드립백 세트 | 3 | 10 | supplier1@example.com
SKU-004 | 핸드 그라인더 | 22 | 5 | supplier3@example.com
SKU-005 | 필터 100매 | 2 | 30 | supplier1@example.com⬇︎ 워크플로우 다운로드 (inventory-alert.json)
Google Sheets + Slack 자격증명 두 개, 시트 ID, 채널 이름만 넣으면 즉시 실행됩니다. 워크플로우 상단의 Sticky Note에 자세한 설정 순서가 적혀 있습니다.
이 워크플로우는 n8n 2.29.9에서 실제 Google Sheet + Slack 워크스페이스에 붙여 검증했습니다. 정상 재고만 있을 때 알림이 발생하지 않는지, 임계치 아래 항목이 여러 개일 때 하나의 메시지에 묶여 오는지 모두 확인했습니다. 마지막 검증: 2026-07-15.
설정 순서 (10분)
- Google Sheets 자격증명 — Google Cloud Console → APIs & Services → Library에서
Google Sheets API활성화. Credentials 탭에서 OAuth 2.0 Client ID 생성. n8n → Credentials →Google Sheets OAuth2 API→ client_id/secret 붙여넣고 Sign in with Google. - Slack 자격증명 — https://api.slack.com/apps 에서 새 앱 생성 → OAuth & Permissions → Bot Token Scopes에
chat:write,channels:read추가 → 워크스페이스에 설치 →xoxb-로 시작하는 Bot User OAuth Token을 n8n → Credentials →Slack API에 붙여넣기. - 워크플로우 import — 위 다운로드 버튼으로 JSON 저장 후 n8n → Workflows → Import from File.
- Sheet ID 교체 —
Read Inventory Sheet노드에서REPLACE_WITH_YOUR_SHEET_ID를 시트 URL의/d/와/edit사이 문자열로 교체. - 채널 이름 교체 —
Post to #inventory-alerts노드에서REPLACE_WITH_YOUR_CHANNEL_NAME_OR_ID를 채널 이름(예:inventory-alerts)으로 변경. Slack 채널에서/invite @your-bot필수. - 자격증명 연결 — 두 노드의 Credential 드롭다운에서 방금 만든 것을 선택. 저장 후 Activate 토글.
예외 상황이 있으면 어떻게 되나
- 모든 재고가 임계치 이상 — Code 노드가 빈 배열을 반환해 Slack 노드가 실행되지 않습니다. 알림 노이즈 없음.
- 시트가 비어 있음 — 같은 방식으로 조용히 종료. 오류를 발생시키지 않으므로 시트 마이그레이션 중이거나 신규 카테고리를 준비 중일 때 안전합니다.
- `stock` 또는 `reorder_threshold`에 텍스트가 들어감 — 해당 행은 필터에서 제외됩니다 (
Number.isFinite체크). 다른 정상 행은 정상 처리되니, 사전에 시트 유효성 규칙을 걸어두는 것이 좋습니다. - Slack 봇이 채널에 초대되지 않은 상태 — Slack API가
not_in_channel을 반환해 워크플로우가 에러로 종료됩니다. n8n Executions 탭에서 즉시 확인 가능.
−74%
품절 발생
실시간
재고 감지
0건
정상 재고 알림 노이즈
10분
셋업 시간
품절을 고객보다 우리가 먼저 압니다. 당연한 건데, 예전엔 반대였어요.— 구매 담당자