작년 블랙프라이데이 다음 주 월요일 아침 7시, 내 휴대폰이 켜졌다. 한 고객사 CEO가 문자를 보냈다: "Lao Mi, 우리 고객센터가 온라인에서 두들겨 맞고 있어요."

스킨케어 브랜드, 캘리포니아 온타리오에 있는 120,000 평방피트 3PL 창고에서 이행 중. 블랙프라이데이 내내 홈페이지에는 "전 품목 2일 배송"이 크게 걸려 있었다. 월요일 아침이 되자 1,000건이 넘는 주문이 "출고 대기" 상태로 쌓여 있었고, 전화는 불이 났으며, 소셜미디어에서는 사기꾼이라고 몰아붙였다.

그날 오후 나는 그 회사 사무실에 가서 OMS의 배송 약속 로직을 뜯어봤다. 창고가 느린 게 아니었다 — 피커들은 일주일 내내 자정을 넘겨 일했다. 진짜 문제는 시스템이 애초에 그런 약속을 하지 말았어야 했다는 것이다. ATP(Available-to-promise)와 배송일 약속은 대부분의 팀이 한 번 설정하고 잊어버리는 OMS 기능이다. 그런데 정작 당신을 가장 크게 망신시키는 것도 이 기능이다.

함정은 3가지다. 하나씩 짚어보자.

장부상 재고는 건물 안에 없다

함정 1번은 고전이다: ATP 계산식이 틀렸다.

ATP(Available-to-promise)는 단순해 보인다 — 있으면 팔 수 있다. 그런데 "있다"는 게 정확히 무슨 뜻인가? 나는 이런 공식을 쓰는 시스템을 너무 많이 봤다: 보유재고(on-hand) − 할당(allocated) = 판매 가능. 합리적으로 들린다. 틀렸다. 보유재고에는 손댈 수 없는 3가지가 조용히 포함되어 있기 때문이다: 이동 중인 입고 재고, 소프트 예약(soft-reserved) 재고, 그리고 QA 동결 재고.

이동 중 재고가 가장 큰 피해를 준다. 한 소형가전 고객사는 "어차피 3일 안에 도착한다"는 이론으로 "이미 출항해 오는 중"인 발주(PO) 재고를 판매 가능으로 잡았다. 블랙프라이데이 바로 전 주, 가습기 8,000대가 로스앤젤레스항 앞바다에서 정박 자리를 기다리며 9일 내내 발이 묶였다. 그 사이 웹사이트는 계속 팔았다 — 3,000대 이상, 전부 "3일 배송" 약속을 걸고. 컨테이너가 부두에 닿을 때쯤, CS팀은 사과하느라 목이 다 쉬었다.

예약 재고는 두 번째 지뢰다. 대형 B2B 고객 주문, 아마존 FBA 보충 계획 — 시스템상 재고를 묶어 두지만 실제로 출고되지는 않았다. 어떤 OMS 플랫폼은 예약을 주문 헤더 단위로만 추적하고 라인 단위로는 추적하지 않거나, 예약하면서 ATP에서는 차감하지 않는다. 내가 본 최악의 경우: 같은 배치 재고를 B2B 주문이 한 번, FBA 보충 계획이 또 한 번 예약했는데, ATP에서는 0번 차감됐다. 한 배치의 재고를 3번 판 셈이다.

QA 동결이 가장 교묘하다. 입고 로트가 샘플 검사를 통과 못 하면, 공급업체 답변을 기다리며 전 배치가 동결되고, WMS에 잠긴다 — 건드릴 수 없다. 그런데 OMS가 총보유재고 숫자만 읽으면 동결 상태를 전혀 보지 못한다. 온타리오의 그 스킨케어 창고에서, 세럼 20,000병이 라벨링 오류로 블랙프라이데이 직전 QA에 묶였다. 시스템은 아무 일도 없다는 듯 계속 팔았다.

어떻게 점검하나? 내 저기술 방법: OMS에서 회전율이 빠른 SKU 20개의 ATP 숫자를 뽑은 뒤, 창고에 그 SKU들의 "지금 당장 피킹 가능한" 수량을 실물로 세어 보게 한다. 두 숫자가 어긋나는 곳마다, 그 차이가 3가지 중 하나다. 고칠 때는 욕심내지 말고 — 계산식을 "보유재고 − 예약 − 동결"로 바꾸고, 이동 중 재고는 별도 라인 "입고 예정"으로 도착일별로 나눠 보여준다. 건물 안에 실제로 들어오기 전에는 어떤 것도 판매 가능 수량에 들어가지 못한다. 나는 80,000 평방피트 창고에 이 변경을 2주 만에 적용했다. 그 후 과잉 판매 클레임은 0이 됐다.

약속은 창고 A 기준, 택배는 창고 B에서 나간다

함정 2번은 다거점 이행에 있다. 단일 창고 계산은 쉽다: 오늘 출고 + 운송사 운송 일수. 창고가 늘어나면 금방 복잡해진다.

OMS가 배송일을 약속하려면 2가지 질문에 답해야 한다: 어느 창고에서 출고하는가, 며칠이 걸리는가? 많은 시스템이 "고객에게 가장 가까운 창고" 기준으로 예쁜 배송일을 계산해 매장에 보여준 뒤, 주문이 들어오면 할당 엔진이 "재고가 있고 비용이 가장 낮은 곳" 기준으로 출고 창고를 다시 고른다. 매장이 약속한 건 창고 A의 2일, 실제로 창고 B에서 나가 4일이 걸린다. 고객은 추적 페이지를 보며 뉴욕에 사는데 "캘리포니아에서 발송됨"을 보고, 항의 전화가 오는 건 그 지점이다.

배송 약속을 한 출고 거점과 실제 출고 거점이 다른 다거점 이행 현장

더 미묘한 것도 있다: 운송사 마감 시간. 시스템은 "오늘 출고" 가정으로 약속을 계산하지만, 이미 오후 4시고 창고의 당일 마감은 오후 3시였다는 걸 모른다. 그 주문은 실제로 내일 나간다 — 약속은 처음부터 하루가 모자랐다. 피크 시즌에는 창고가 마감 시간을 앞당긴다, 오후 3시가 오후 2시가 되고, 시스템의 파라미터는 아무도 안 고친다. 그러면 몇 주간 모든 약속일이 하루씩 늦는다.

해결은 역방향이다: 약속 로직과 할당 로직이 같은 규칙을 쓰게 한다. 매장이 배송일을 보여주기 전에 실제 할당 패스를 돌려, 어느 창고가 실제로 출고할지 확인한 뒤, 그 거점 기준으로 운송사 운송 일수에 마감 시간 체크를 더해 계산한다. 당연해 보인다. 시중 중견 OMS 플랫폼의 절반은 약속과 할당이 서로 대화하지 않는 별도 코드 경로로 돌아간다고 나는 확신한다. 시스템 선정 때 내가 항상 요구하는 데모다: 다른 우편번호로 테스트 주문 3건을 넣어 약속일과 실제 할당이 맞는지 확인한다. 안 맞으면 그 벤더는 탈락이다.

피크 시즌이 오면 모든 약속이 무너진다

함정 3번은 피크 시즌의 것이다. ATP는 일년 내내 정확해 보이다가 11월에 무너진다. 계산식이 문제가 아니다 — 동시성 문제다.

평일에는 분당 수십 건 주문이라 재고 차감이 따라간다. 블랙프라이데이 자정에는 분당 수천 건이 쏟아지는데, ATP는 몇 분 전 스냅샷으로 계속 팔고 있다. 스냅샷은 500개라는데, 실제로는 3초 만에 동이 났다. 그 뒤 2분간 주문한 사람들은 여전히 "재고 있음, 2일 배송"을 약속받는다. 다음 날 아침 창고에 가면 피킹할 게 없고, 남는 선택지는 하나씩 사과하거나 "2일"이 "2주"로 늘어지는 동안 보충을 기다리는 것뿐이다.

그리고 사전예약 대 현물 재고 이중 판매가 있다. 마케팅이 라이브 방송으로 "다음 주 들어올 물량" 사전예약을 돌리는데, 웹사이트는 현물 재고를 계속 판다. 두 채널이 하나의 재고 풀을 공유하지 않으니, 같은 입고 배치에 약속이 2번 걸린다. 물량이 들어오면 절반의 구매자에게만 충분하다. 나머지 절반의 "2일 배송"은 "알려드리겠습니다"가 된다.

피크 시즌 대응은 3가지다. 첫째, 프로모션 SKU에 별도 재고 풀을 주고, 일상 판매 재고와 물리적으로 분리한다 — 사전예약은 사전예약, 현물은 현물, 서로 빌려 쓰지 않는다. 둘째, 고동시성 구간에는 ATP에 비관적 락을 걸거나, 최소한 스냅샷 갱신 주기를 초 단위로 당긴다 — 이건 엔지니어링이 필요하고, 운영만으로는 못 한다. 셋째, 피크 전에 "약속 스트레스 테스트"를 돌린다: 작년 피크 주문량을 테스트 환경에 재생해 ATP가 언제부터 거짓말하는지 본다. 어디서 무너지는지 미리 아는 게, 나중에 사과하는 것보다 훨씬 싸다.

시스템을 갈아엎기 전에, 이 순서로 점검하라

이게 터지면 많은 대표가 OMS를 통째로 갈아엎고 싶어 한다. 내 조언: 먼저 진단하고, 그 다음 결정하라. 10번 중 9번은 이 함정들이 플랫폼 문제가 아니라 설정 문제이기 때문이다.

이 순서로 점검한다. 첫째, 20개 SKU 실물 대사를 돌려 ATP 계산식이 예약과 동결을 제대로 차감하는지 확인한다. 둘째, 다른 우편번호로 테스트 주문을 넣어 매장의 약속일과 실제 할당·마감 시간을 비교한다. 셋째, 지난 피크 시즌을 재생해 과잉 판매 주문을 분류한다: 오래된 동시성 스냅샷에서 몇 건, 사전예약과 현물이 한 풀을 공유해서 몇 건. 이 3단계를 마치면 근본 원인이 보인다.

수정도 우선순위대로. 계산식 수정이 먼저 — 코드 변경이 필요 없다. 약속과 할당 규칙 통일이 둘째 — 엔지니어링 시간이 든다. 동시성 락과 풀 분리는 셋째 — 다음 피크 1개월 전에 잡는다. 이 순서대로라면 하루 3,000건을 처리하는 창고도 1분기 안에 배송 정확도를 정상으로 되돌릴 수 있다.

마지막으로 질문 하나: 당신의 시스템에 있는 배송 약속 숫자 — ATP 리포트를 들고 창고 현장을 걸으며 SKU 단위로 대사를 맞춰 본 게 언제였나? 기억이 안 난다면, 다음에 깨질 약속은 이미 오고 있는 중이다.

영어판 번역본입니다. 내용이 다를 경우 영어판을 우선합니다.