2019년 여름. 로스앤젤레스 외곽의 냉장 3PL에 서 있는데 FDA 리콜 통지가 날아왔다. 고객 제품이 세 개 로트에 뒤섞여 있었고, 창고는 해당 팔레트를 찾는 데 꼬박 이틀이 걸렸다. 그 한 건으로 고객은 약 $400,000를 날렸고, 창고는 그 거래처를 잃었다. 창고 일 20년 해보니 단언할 수 있다. 식품 창고에서 로트와 유통기한 관리는 '있으면 좋은 것'이 아니다. 장사를 계속할지 문을 닫을지를 가르는 선이다. 식품 고객을 받기 전에 이 글의 모든 프로세스를 점검해 보라. 못 하면 계약서에 사인하지 마라.

모든 건 입고에서 시작된다. 그리고 대부분의 창고가 바로 거기서 망친다. 팔레트 한 동이 도크에 들어왔는데, 기사의 패킹리스트에 "exp 03/2027"이라고 적혀 있다고 그냥 입력할 텐가? 안 된다. 식품 공급업체의 혼합 팔레트가 기본이다. 한 팔레트에 세 개의 생산 로트가 섞여 있는 건 일상이고, 패킹리스트에는 적재 전체에 유통기한 하나만 적혀 있는 경우도 흔하다. 정석은 이렇다. 입고 시 팔레트를 해체하고, 케이스마다 스캔하거나 육안으로 확인한 뒤, 로트 번호와 유통기한을 팔레트 단위가 아니라 SKU 단위로, 케이스마다 기록한다. 날짜는 YYYY-MM-DD 전체 형태로 입력한다. 공급업체가 일 없이 "03/2027"이라고만 적어오면, 우리 SOP는 그 달의 말일을 기본값으로 삼는다. 시스템이 만료되지 않은 제품을 만료로 찍지 않게 하기 위해서다. 입고 담당의 임의 판단은 없다.

줄리안 날짜로 찍혀 들어오는 제품도 있다. "25073"이라면 2025년의 73일째라는 뜻이다. 입고 담당이 줄리안 날짜를 읽지 못하면 유통기한이 전부 잘못 입력된다. 내 규칙은 협상 불가다. 입고 SOP에는 줄리안 날짜 환산표를 도크 벽에 붙여 두고, WMS 유통기한 필드는 YYYY-MM-DD만 받는다. 스캔건 입력은 그 자리에서 형식을 검증하고, 안 맞는 건 거부한다. 유통기한 한 자리 잘못 입력하면 나중에 팔레트 통째로 해체해야 한다. 그 비용도 계산해 봤다. 냉장 창고에서 팔레트 하나 해체하는 데 인건비와 냉동 에너지를 합쳐 최소 $200이 든다.

냉장 통로에서 휴대용 단말기로 팔레트 로트 라벨을 스캔하는 작업자

유통기한 한 자리 오류가 팔레트 통째 해체의 지름길이다

데이터 입력은 시작일 뿐이다. 중요한 건 WMS가 그걸로 뭘 하느냐다. FEFO 기능이 있는 WMS를 사놓고 설정 한 번 안 해본 창고가 수두룩하다. 그러니 피킹은 여전히 '가까운 데서' 간다. FEFO를 진짜로 돌리려면 설정 세 개가 필요하고, 전부 필수다. 첫째, 할당 전략. 출고 웨이브에서 할당을 유통기한 오름차순으로 설정해 시스템이 항상 해당 SKU 중 유통기한이 가장 임박한 가용 로트를 먼저 잡게 하고, 이 규칙을 근접 피킹보다 위에 둔다. 둘째, 유통기한 임계값. SKU마다 '판매 가능 일수' 필드를 둔다. 요거트면 14일, 냉동육이면 90일 같은 식이다. 임계값 아래 재고는 자동으로 잠궈 할당 대상에서 뺀다. 셋째, 임박 동결 규칙. 남은 기한이 30일(신선 카테고리는 7일) 이내로 들어온 재고는 자동으로 동결 로케이션으로 이동한다. 피킹 작업에서 동결된 로트를 스캔하면 스캐너가 에러를 띄우고, 해제 권한은 수퍼바이저에게만 있다. 이 세 개가 설정되면 FEFO가 진짜로 돈다. 없으면 벽에 붙은 구호일 뿐이다.

또 하나의 함정이 로트 분할이다. 피킹에서 케이스를 개봉하면, 개봉한 수량이 원래 로트와 유통기한을 물려받도록 WMS에 로트 분할 트랜잭션이 필요하다. 시간 아낀다고 이걸 건너뛰는 창고를 너무 많이 봤다. 그러면 장부상 로트와 현장 로트가 어긋난다. 철칙은 하나다. 실물 제품이 움직일 때마다 시스템도 함께 움직인다. 로트의 정체성은 항상 제품을 따라다닌다.

유통기한 대시보드: 90/60/30일, 모든 액션에 담당자 이름을

30일 남기고 아는 건 너무 늦다. 우리 유통기한 대시보드는 3단계로, 매일 아침 자동으로 푸시된다. 90일 단계, 노란색. 액션은 '고객에게 판촉이나 재고 이전을 요청', 담당은 고객 서비스. 60일 단계, 주황색. 액션은 '고객과 주간 소진 회의', 담당은 오퍼레이션 수퍼바이저. 30일 단계, 빨간색. 액션은 '출고 동결, 출고 전용 모드, 매일 사이클 카운트', 담당은 창고 매니저 본인이다. 각 단계의 액션과 담당은 SOP와 사무실 벽에 적는다. 누군가의 머릿속에 두지 않는다.

대시보드 계산은 일관성이 생명이다. '남은 일수 = 유통기한 - 오늘'을 써라. '입고 후 경과 일수'가 아니다. 입고 후 180일로 알람을 돌리던 창고를 본 적이 있다. 그런데 공급업체가 보내온 제품의 남은 유통기한은 100일뿐이었다. 알람은 장식이었다. 그리고 보고는 반드시 로트 단위로. SKU 합계는 절대 안 된다. '요거트 500케이스 남음'은 쓸모없다. '로트 L250310, 500케이스, 32일 후 만료, A-12-03'이라면 바로 움직일 수 있다.

리콜 훈련: 2시간 안에 로트를 못 찾으면 당신이 헤드라인이다

FDA는 해당 로트 전부, 재고 위치, 출고 이력을 2시간 안에 특정할 것을 요구한다. 2시간이다. 이틀이 아니다. 대부분의 창고는 이 훈련을 해본 적이 없다. 그래서 진짜 리콜은 아수라장이 된다. 우리는 분기마다 고정된 시나리오로 훈련한다. 로트 번호를 무작위로 하나 뽑고, 스톱워치를 누른다. WMS에서 그 로트의 현재 재고를 뽑는다. 모든 로케이션과 수량이다. 출고 이력을 뽑는다. 지난 60일간의 고객, 수량, 출고일을 전부다. 운송 중과 배송 완료 상태도 뽑는다. 2시간 안에 시트 한 장을 만든다. 건물 안에 얼마나 있는지, 운송 중에 얼마나 있는지, 배송 완료가 얼마나 되는지, 누구 손에 들어갔는지. 끝나면 복기한다. 한 번이라도 시간 초과하면 프로세스의 어디가 끊긴 거다.

2019년 로스앤젤레스 리콜이 왜 이틀이나 걸렸을까? 복기에서 문제 세 개가 나왔다. 입고가 팔레트 단위로 로트를 기록해서, 팔레트를 해체하는 순간 로트의 정체성이 사라졌다는 것. 출고 일부가 종이 전표로 나가 WMS에 들어가지 않았다는 것. 유통기한 필드의 3분의 1이 비어 있었다는 것. 세 개 다 기본이었다. 아무리 비싼 기술도 구하지 못했다. 식품 창고의 로트 관리는 시스템이 얼마나 비싼지가 아니다. 프로세스가 얼마나 규율 있는가다.

사이클 카운트가 안 맞는 이유: 상위 3가지 원인

한 가지 더. 사이클 카운트다. 식품 창고에서 로트가 안 맞으면 원인은 언제나 이 세 가지 중 하나다. 첫째, 혼합 팔레트를 입고 때 해체하지 않아 장부는 한 로트, 현장은 세 로트인 경우. 둘째, 케이스 개봉이 시스템 트랜잭션을 건너뛰어 장부의 개봉 수량과 현장의 낱개 케이스가 안 맞는 경우. 셋째, 유통기한을 잘못 입력해서 시스템이 A-12-03에 있다고 가리키는 로트가 실제로 거기 있는 로트와 달라, FEFO가 피커를 잘못된 제품으로 보내는 경우. 대책은 심심하다. 입고에 로트 확인 단계를 추가하고, 두 번째 사람이 10퍼센트를 불시 점검한다. 케이스 개봉은 매번 스캔건 트랜잭션을 필수로 하고, 손으로 쓴 로그는 없다. 매월 한 SKU에 대해 로트만 카운트한다. 로트와 날짜만, 수량 없이, 15분 안에 끝낸다.

내일 당장 쓸 수 있는 얘기. WMS에 들어가서 숫자 세 개를 뽑아 보라. 유통기한 필드가 비어 있는 SKU가 몇 개인지. 할당 우선순위에서 FEFO가 몇 번째인지. 유통기한 임계값 알람이 있기는 한지. 이 세 숫자로 로트 관리가 진짜인지 종이 위인지 알 수 있다. 유통기한 필드 공백이 5퍼센트를 넘으면 새 식품 고객은 받지 마라. 묵은 짐부터 치워라.

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