발행일: 2026-10-06(화) 11:44
← 목차로 돌아가기|하루 30분 n8n 시리즈 ② 실무 자동화 레시피 100
RECIPE 055

Shopify 주문 → 배송 상태 자동 업데이트 알림

  • ▸Shopify 주문 배송 상태 변경 시 고객 이메일 자동 발송
  • ▸배송 단계별(접수/출고/배달완료) 맞춤 메시지 전송
  • ▸배송 지연 주문 자동 감지 및 CS팀 알림

✅사전 준비

  • □Shopify Admin API 액세스 토큰 발급
  • □Shopify 웹훅 등록 (파트너 대시보드 또는 Admin API)
  • □Gmail 또는 SMTP 자격증명 설정
  • □배송 지연 기준일 설정 (예: 주문 후 3일)

배송 상태별 Switch 분기

Node: Switch
Value: {{ $json.fulfillment_status }}

Case 1: null → '주문 접수' 이메일
Case 2: 'partial' → '부분 출고' 이메일
Case 3: 'fulfilled' → '출고 완료' 이메일
Default: 상태 로그 기록

배송 지연 체크 (Cron + HTTP)

// Cron: 매일 오전 9시 실행
// 0 9 * * *

Node: HTTP Request
Method: GET
URL: https://YOUR_SHOP.myshopify.com/admin/api/2024-01/orders.json?status=open&fulfillment_status=unfulfilled&created_at_max={{ $now.minus({days: 3}).toISO() }}
Headers:
  X-Shopify-Access-Token: YOUR_ACCESS_TOKEN
💡 TIPShopify API 버전은 주기적으로 업데이트됩니다. URL의 `2024-01` 부분을 최신 버전으로 교체하세요. 현재 최신 버전은 Shopify 파트너 대시보드에서 확인할 수 있습니다.
⚡

워크플로우 JSON

아래 JSON을 복사해 n8n에 바로 임포트하세요

📥 n8n 임포트 방법
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
{
  "recipeId": "recipe055",
  "title": "생일·입사 기념일 자동 축하 메시지",
  "chapter": 5,
  "category": "HR & 조직 운영 자동화",
  "difficulty": "⭐",
  "estimatedTime": "20분",
  "usedApps": [
    "Google Sheets",
    "Slack"
  ],
  "description": "직원 명단 시트의 생일·입사일을 매일 오전 9시에 확인하여 오늘 해당하는 직원에게 Slack 전체 채널로 자동 축하 메시지를 발송합니다.",
  "nodes": [
    {
      "id": "trigger_schedule",
      "type": "trigger",
      "service": "Schedule",
      "name": "매일 오전 9시 실행",
      "config": {
        "interval": "daily",
        "time": "09:00"
      }
    },
    {
      "id": "get_employees",
      "type": "action",
      "service": "Google Sheets",
      "name": "직원 명단 조회",
      "config": {
        "operation": "readRows",
        "spreadsheetId": "{{$env.HR_SHEET_ID}}",
        "sheetName": "직원명단",
        "columns": [
          "이름",
          "생일",
          "입사일",
          "부서",
          "슬랙ID"
        ]
      }
    },
    {
      "id": "check_today",
      "type": "action",
      "service": "Function",
      "name": "오늘 생일·기념일 확인",
      "config": {
        "code": "const today = $now.format('MM-DD');\nconst employees = $items();\n\nconst birthdays = employees.filter(e => {\n  const bday = e.json['생일'] ? e.json['생일'].slice(5, 10) : '';\n  return bday === today;\n});\n\nconst anniversaries = employees.filter(e => {\n  const anniv = e.json['입사일'] ? e.json['입사일'].slice(5, 10) : '';\n  return anniv === today && e.json['입사일'].slice(0, 4) !== $now.format('YYYY');\n});\n\nconst results = [\n  ...birthdays.map(e => ({ ...e.json, eventType: 'birthday' })),\n  ...anniversaries.map(e => ({ \n    ...e.json, \n    eventType: 'anniversary',\n    years: $now.format('YYYY') - e.json['입사일'].slice(0, 4)\n  }))\n];\n\nreturn results.map(r => ({ json: r }));"
      }
    },
    {
      "id": "check_has_event",
      "type": "condition",
      "service": "IF",
      "name": "이벤트 존재 여부",
      "config": {
        "condition": "{{$items().length > 0}}"
      }
    },
    {
      "id": "send_birthday",
      "type": "condition",
      "service": "IF",
      "name": "생일 vs 기념일 분기",
      "config": {
        "condition": "{{$json['eventType'] === 'birthday'}}"
      }
    },
    {
      "id": "post_birthday_slack",
      "type": "action",
      "service": "Slack",
      "name": "생일 축하 메시지",
      "config": {
        "operation": "sendMessage",
        "channel": "{{$env.GENERAL_SLACK_CHANNEL}}",
        "message": "🎂 오늘은 <@{{$json['슬랙ID']}}>님의 생일이에요!\n\n{{$json['이름']}}님, 생일 축하드립니다! 🎉🎁\n오늘 하루도 행복하고 즐거운 날이 되길 바랍니다! 😊"
      }
    },
    {
      "id": "post_anniversary_slack",
      "type": "action",
      "service": "Slack",
      "name": "입사 기념일 메시지",
      "config": {
        "operation": "sendMessage",
        "channel": "{{$env.GENERAL_SLACK_CHANNEL}}",
        "message": "🏆 오늘은 <@{{$json['슬랙ID']}}>님의 입사 {{$json['years']}}주년 기념일이에요!\n\n{{$json['이름']}}님, {{$json['years']}}년 동안 함께해 주셔서 진심으로 감사합니다! 💪\n앞으로도 함께 성장해요! 🚀"
      }
    },
    {
      "id": "no_event",
      "type": "noOp",
      "name": "오늘 이벤트 없음 — 스킵",
      "config": {}
    }
  ],
  "edges": [
    {
      "from": "trigger_schedule",
      "to": "get_employees"
    },
    {
      "from": "get_employees",
      "to": "check_today"
    },
    {
      "from": "check_today",
      "to": "check_has_event"
    },
    {
      "from": "check_has_event",
      "to": "send_birthday",
      "branch": "true"
    },
    {
      "from": "check_has_event",
      "to": "no_event",
      "branch": "false"
    },
    {
      "from": "send_birthday",
      "to": "post_birthday_slack",
      "branch": "true"
    },
    {
      "from": "send_birthday",
      "to": "post_anniversary_slack",
      "branch": "false"
    }
  ],
  "tips": [
    "직원 명단 시트에 슬랙 ID를 등록해두면 @멘션이 자동으로 작동해 더욱 생동감 있는 축하 메시지를 만들 수 있어요.",
    "입사 기념일에 연차 수당이나 특별 혜택이 있는 경우 HR팀 Slack에도 별도 알림을 추가해 두세요.",
    "생일 메시지에 회사 로고나 케이크 이미지를 첨부하면 훨씬 따뜻한 분위기를 연출할 수 있어요."
  ],
  "qrUrl": "www.koreaaitimes.com/books/n8n-vol2/recipe055"
}
← 이전 레시피☰ 목차다음 레시피 →