케이스 스터디
CASE STUDY — 운영

재고 부족 알림 — Google Sheets에서 Slack까지 자동으로

도입 유통 / 리테일구축 4일
Google SheetsSlackn8n Schedule

품절은 항상 고객이 먼저 알았습니다. 담당자가 시트를 열어 재고를 확인할 때쯤이면 이미 주문이 끊긴 뒤였고, 급하게 발주하느라 단가에서 손해를 봤습니다.

재고 데이터는 이미 Google Sheets에 다 있었습니다. 빠진 건 그걸 매일 같은 시각에 훑어 주는 사람이었죠. 그 사람을 워크플로우로 대체했습니다. 정해진 시간에 시트를 읽고, 임계치 아래로 떨어진 SKU만 골라 Slack으로 보고합니다. 정상 재고는 건드리지 않으므로 알림 노이즈가 없습니다.

inventory-alert.workflowLIVE
CR매일 09:00GS시트 조회<임계치 감지SLSlack 알림

어떻게 동작하나

  1. Schedule Trigger 노드가 매일 오전 9시(KST) 크론으로 워크플로우를 시작합니다.
  2. Google Sheets Read 노드가 product_id | name | stock | reorder_threshold | supplier_email 스키마의 시트 전체를 읽습니다.
  3. Code 노드가 각 행의 stock < reorder_threshold 여부를 판정하고, 낮은 재고 목록을 하나의 Slack 메시지로 포맷합니다. 임계치 아래 SKU가 없으면 빈 배열을 반환해 워크플로우가 조용히 종료됩니다.
  4. 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), 두 번째 행부터 실제 데이터. stockreorder_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분)

  1. 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.
  2. Slack 자격증명 — https://api.slack.com/apps 에서 새 앱 생성 → OAuth & Permissions → Bot Token Scopes에 chat:write, channels:read 추가 → 워크스페이스에 설치 → xoxb-로 시작하는 Bot User OAuth Token을 n8n → Credentials → Slack API에 붙여넣기.
  3. 워크플로우 import — 위 다운로드 버튼으로 JSON 저장 후 n8n → Workflows → Import from File.
  4. Sheet ID 교체Read Inventory Sheet 노드에서 REPLACE_WITH_YOUR_SHEET_ID를 시트 URL의 /d//edit 사이 문자열로 교체.
  5. 채널 이름 교체Post to #inventory-alerts 노드에서 REPLACE_WITH_YOUR_CHANNEL_NAME_OR_ID를 채널 이름(예: inventory-alerts)으로 변경. Slack 채널에서 /invite @your-bot 필수.
  6. 자격증명 연결 — 두 노드의 Credential 드롭다운에서 방금 만든 것을 선택. 저장 후 Activate 토글.

예외 상황이 있으면 어떻게 되나

  • 모든 재고가 임계치 이상 — Code 노드가 빈 배열을 반환해 Slack 노드가 실행되지 않습니다. 알림 노이즈 없음.
  • 시트가 비어 있음 — 같은 방식으로 조용히 종료. 오류를 발생시키지 않으므로 시트 마이그레이션 중이거나 신규 카테고리를 준비 중일 때 안전합니다.
  • `stock` 또는 `reorder_threshold`에 텍스트가 들어감 — 해당 행은 필터에서 제외됩니다 (Number.isFinite 체크). 다른 정상 행은 정상 처리되니, 사전에 시트 유효성 규칙을 걸어두는 것이 좋습니다.
  • Slack 봇이 채널에 초대되지 않은 상태 — Slack API가 not_in_channel을 반환해 워크플로우가 에러로 종료됩니다. n8n Executions 탭에서 즉시 확인 가능.
−74%
품절 발생
실시간
재고 감지
0건
정상 재고 알림 노이즈
10분
셋업 시간
품절을 고객보다 우리가 먼저 압니다. 당연한 건데, 예전엔 반대였어요.구매 담당자

당신의 업무도
여기 들어갈 수 있어요.

가장 반복적인 업무 하나만 알려주세요. 자동화 시나리오를 그려드립니다.