목차
Shopify가 보내는 주문 메일은 메일 앱이 동기화하기로 마음먹은 시점에 도착하고, 당신이 필터를 걸어 둔 폴더에 떨어지며, 주문이 1만 원이든 100만 원이든 똑같이 생겼습니다. 가게를 직접 운영한다면 그건 잘못된 형태의 신호입니다.
웹훅이 이걸 고칩니다. Shopify는 모든 주문을 당신이 고른 URL로 POST하고, Echobell은 그 POST를 당신이 크기를 정하는 알림으로 바꿉니다.
당신을 방해할 자격이 있는 토픽만 고르기
Shopify는 웹훅 이벤트 종류를 토픽이라고 부릅니다. 혼자 운영하는 가게라면 이 넷이면 대부분 충분합니다.
| 토픽 | 무슨 뜻인가 | 긴급도 |
|---|---|---|
orders/create | 주문이 들어왔다. | 일반 |
orders/paid | 결제가 통과됐다. 실제로 들어온 돈만 신경 쓴다면 이걸 쓰세요. | 일반 |
orders/cancelled | 고객이 취소했다. 포장 전에 아는 편이 낫다. | 시간 민감 |
refunds/create | 환불이 이뤄졌다. | 시간 민감 |
orders/create와 orders/paid 중 하나만 구독하세요. 판매 한 건에 알림 두 개를 정말로 원하는 게 아니라면요. 대부분의 가게에는 orders/paid가 정직한 쪽입니다.
1단계 — 채널 만들기
Echobell에서 "Shopify 주문" 같은 이름의 채널을 만들고, webhook URL을 복사한 뒤 POST만 허용을 켜세요. Shopify는 항상 POST로 보냅니다.
취소와 환불용으로 더 큰 별도 채널을 원한다면 지금 같이 만들고 시간 민감으로 설정하세요.
2단계 — Shopify에 웹훅 추가하기
Shopify 관리자에서 설정 → 알림 → 웹훅 → 웹훅 만들기로 갑니다. 토픽을 고르고, 형식을 JSON으로 두고, 채널 URL을 붙여넣으세요.
저장할 때 Shopify가 테스트 페이로드를 보냅니다. 휴대폰이 울리면 경로가 뚫린 겁니다.
3단계 — 실제로 읽는 필드만 템플릿에 넣기
Shopify 주문 페이로드는 깁니다. 주문 하나에 백 개가 넘는 필드가 있죠. 필요한 건 몇 개뿐입니다.
제목
새 주문 #{{order_number}} · {{total_price}} {{currency}}
본문
{{customer.first_name}} {{customer.last_name}}
{{line_items[0].title}}
line_items는 배열이라 line_items[0]이 첫 번째 품목입니다. Echobell 템플릿은 인덱스 접근을 지원하지만 반복문은 없습니다. 세 품목짜리 주문도 첫 번째만 보이고 끝입니다. 그게 중요하다면 개수를 옆에 붙이세요.
{{line_items[0].title}} · 총 {{line_items.length}}개 품목
Stripe와 달리 Shopify는 total_price를 소수 문자열로 보냅니다. 4900이 아니라 "49.00"이라서 계산 없이도 제대로 읽힙니다.
4단계 — 조건으로 토픽별 분기하기
여러 토픽을 한 채널로 보냈다면, Shopify가 헤더로 어느 것인지 알려 줍니다.
header["x-shopify-topic"] == "orders/paid"
관리자에서 채널마다 웹훅을 만들지 않고도 동작을 나누는 가장 깔끔한 방법입니다.
큰 주문만 깨워 주세요
가게 주인 대부분이 실제로 원하는 형태는 이렇습니다. 모든 주문은 조용한 채널로 가고, 기준을 넘는 것만 시끄러운 채널로 갑니다.
두 번째 채널을 만들고 시간 민감으로 설정한 뒤, orders/paid 웹훅을 하나 더 그쪽으로 보내고 조건을 주세요.
total_price > 500
이제 평범한 날은 배경의 웅웅거림이 되고, 90만 원짜리 주문은 몸으로 느껴지는 무언가가 됩니다.
이게 해 주지 않는 것
HMAC 검증 없음. Shopify는 모든 웹훅을 X-Shopify-Hmac-Sha256 헤더로 서명합니다. Echobell은 이를 검증하지 않으므로 낯선 이를 막아 주는 건 채널 URL뿐입니다. 비밀로 두고, POST만 허용을 켠 채로 유지하세요. 위조된 주문 알림이 실제 피해를 낳는다면, 앞단에 직접 만든 엔드포인트를 두어 HMAC을 검증하고 거기서 Echobell을 호출하게 하세요.
Shopify는 같은 웹훅을 두 번 보낼 수 있습니다. 실패 시 재시도하며 재시도는 중복 제거되지 않습니다. 알림은 "주문을 확인해 보라"는 신호로 받아들이고 주문 개수로 세지 마세요. 진실의 근거는 Shopify 관리자입니다.
재고 토픽은 금세 시끄러워집니다. inventory_levels/update는 당신이 직접 수정한 것을 포함해 모든 재고 변동에서 발동합니다. 재고 부족 알림을 원한다면 조건으로 세게 거르세요. 아니면 점심 전에 후회합니다.
자주 묻는 질문
이걸 하려면 Shopify 앱이 필요한가요?
아닙니다. 설정 → 알림 아래의 웹훅은 관리자에 기본 내장되어 있고, 앱도 파트너 계정도 코드도 필요 없습니다.
창고 담당자가 Shopify 관리자 없이 주문만 볼 수 있나요?
가능합니다. 채널을 공유하세요. 그들은 알림만 받고 그 외에는 아무것도 못 봅니다. 관리자 접근도 없고, 템플릿에 담은 것 이상의 고객 정보도 없습니다.
알림에 고객 이름을 넣어야 하나요?
당신의 판단이고, 의식적으로 정할 값어치가 있습니다. 템플릿에 넣은 건 잠금 화면에 뜹니다. 대응 여부를 정하는 데는 보통 주문 번호와 금액이면 충분합니다.
지불 거절이 오면 전화를 받을 수 있나요?
Shopify Payments를 쓰는 상점이라면 분쟁은 disputes/create 토픽으로 옵니다. 그걸 전화 채널로 보내세요. 주문 관련 이벤트 중 유일하게 기한이 붙은 것입니다.
마무리
웹훅 하나, 템플릿 하나, 크게 울리는 버전을 원하면 조건 하나. 5분쯤 걸리고, 주문 페이지를 계속 새로고침하던 습관을 대체합니다.
iPhone용 Echobell 다운로드 또는 Google Play에서 받기 후, 테스트 주문을 하나 넣고 확인 메일보다 먼저 도착하는 걸 지켜보세요.