새벽 2시 30분, 추수감사절 전주, 성수기가 목덜미를 숨 가쁘게 쫓고 있었다. 시카고 외곽의 냉동창고에서 야간 근무를 순찰하고 있었다——FEFO 창고 유통기한 관리가 소프트웨어 안에만 존재하면 얼마나 비싼 대가를 치르는지 가르쳐준 밤이었다. 피커 한 명이 파렛 잭을 타고 다가왔다. "보스, 이 요거트 주문이 이상해요." 가서 보니 같은 파렛, 2단 적재, 유통기한이 40일이나 차이 났다——하나는 11월 말 만료, 다른 하나는 12월 말 만료. 정리한 누군가가 수고를 덜려고 두 로트를 한 파렛에 섞어 넣은 것이다. 고객은 식료품 체인이었다. 그들은 입고되는 모든 파렛의 유통기한을 검사한다. 하루라도 모자라면 출하 전체가 반품이다. 800케이스가 넘는 물량이 도크에서 거부됐고, 반송 운임은 우리가 물었다.

솔직히 말하겠다. 새벽 2시 30분, 그 냉동고 앞에 서서 차가운 공기가 목덜미를 타고 흐르는 가운데, 내 머리에는 딱 하나의 생각이 있었다. 우리 WMS에서는 FEFO가 켜져 있었다. 그런데 어떻게 이렇게 처참하게 실패할 수 있었을까?

WMS의 체크박스는 FEFO가 아니다

이야기는 3년 전으로 거슬러 올라간다. 첫 식품 고객(요거트, 주스, 비타민 젤리)을 맡았을 때였다. 영업은 모두에게 똑같이 약속했다. 네, FEFO를 지원합니다, first expired, first out(만료가 빠른 것부터 먼저 출고합니다). IT는 WMS에 유통기한 순으로 정렬하는 할당 규칙을 설정했다. 서류상으로는 만반이었다.

하지만 아무도 말해주지 않는 게 있다. 시스템의 체크박스와 현장에서 FEFO가 실제로 돌아가는 것은 완전히 다른 세상이다. FEFO는 단순해 보인다——먼저 만료되는 것부터 먼저 출고한다. 그걸 작동시키는 건 지뢰밭이다. 우리는 큰 지뢰를 두 개 밟았다. 둘 다 아팠다.

지뢰 하나, 2023년 여름. 비타민 젤리 입고가 들어왔다. 제조사가 준 유통기한은 겨우 14개월. 그날 입고가 폭주해서 담당자는 로트 번호만 기록하고 유통기한을 비워 둔 채 넘어갔다. WMS에서 그 로트의 유통기한은 null이었다. 할당 규칙이 null을 만나 건너뛰고 입고일로 폴백했다——사실상 FIFO의 변장이다. 3개월 뒤 고객이 항의했다. 받은 상품의 잔여 수명이 겨우 9개월인데, 그들의 리테일 채널은 매대에서 최소 12개월을 요구한다는 것이었다. 전량 반품. 2만 달러가 넘는 상품이 그대로 우리 부담이 됐다. QA가 근본원인 분석을 했다. 한 줄: 결정적인 1분 동안 유통기한이 입력되지 않았다.

지뢰 둘, 2024년 초. 교훈을 배웠다, 라고 생각했다. 입고에서는 유통기한 입력이 필수가 됐고, 똑똑해 보이는 규칙을 하나 추가했다. 잔여 수명이 45일 미만인 것은 자동 동결, QA 해제 없이는 출고 불가. 그런데 성수기가 오자 시스템이 냉동고의 절반을 얼려버렸다. 요거트 같은 단수명 상품은 정상 로테이션에서 그 45일 창 안에 산다——그 규칙은 멀쩡하고 회전 빠른 재고를 죄다 잠가버렸다. 피커들은 화면만 쳐다봤고, 기사들은 도크 문 앞에서 경적을 울렸다. 매일 밤 11시에 수동으로 파렛을 동결 해제하는 밤이 일주일 이어졌다. 규칙은 죽어 있다. 상품은 살아 있다. 전 품목 단일 동결 임계값은 자기 무덤을 파는 일이다.

모든 것을 결정하는 것은 입고의 1분

두 지뢰 이후에야 교훈이 뼈에 새겨졌다. FEFO 창고 유통기한 관리의 진짜 전장은 할당 규칙 화면이 아니다. 입고의 1분이다. 세계에서 가장 똑똑한 시스템도 빠진 필드나 뒤섞인 파렛 앞에서는 무너진다. 그래서 우리는 모든 힘을 입고와 적치에 쏟아부었다——정말로 깨지는 건 이 두 단계다.

입고는 이제 이중 필수다. 로트 번호+유통기한. 하나라도 빠지면 입고는 마감할 수 없다. 유통기한은 제조사의 케이스 라벨을 건으로 스캔해서 입력한다——수기 입력은 QA 감독 하의 수정으로만 허용된다. 12시간 근무 뒤의 손입력 날짜가 어떤 모습인지, 살아 있는 창고 매니저라면 누구나 알기 때문이다. 날짜가 들어가는 순간 시스템은 잔여 수명을 계산하고 등급으로 태깅한다.

적치는 물리적 분리다. 같은 SKU, 다른 로트는 절대 같은 파렛에 두지 않는다. 냉동고의 로케이션 라벨에는 3미터 밖에서도 읽을 수 있는 크기로 유통기한을 인쇄한다. 로테크한 조치지만 무엇보다 효과가 있다. 시스템은 화면에서 로트를 완벽하게 분리할 수 있다——현장에서 게으른 혼적 파렛 하나면 모든 게 허구다.

냉동창고 안에서 유통기한 등급별로 적치된 유제품 파렛

입고 사무실 벽에 붙인 FEFO 5대 규칙

2년의 시행착오가 5개의 규칙으로 압축됐다. 인쇄해서 입고 사무실 벽에 붙여뒀다. 지금의 FEFO 창고 유통기한 관리 운영은 이렇다:

하나——입고 이중 필수. 로트+유통기한, 예외 없음, 꼼수 없음. 위에서 설명.

둘——동결 임계값은 단계별로, 일률 금지. 단수명 상품(총 수명 90일 이하)은 잔여 수명이 3분의 1 아래로 떨어지면 동결. 장수명 상품은 잔여 60일에 동결. 동결된 로트는 매일 아침 QA 회의에서 심의한다——해제하든가, 고객에게 프로모션 시기라고 알리든가.

셋——할당은 유통기한 순, 단 피킹 효율 윈도우 포함. 같은 SKU 중 유통기한 차이가 7일 이내인 로트는 최단 이동 경로로 피킹할 수 있다. 솔직히 말하겠다. 엄격한 FEFO는 피커를 건물 전체로 뛰어다니게 하고, 성수기에는 그게 치명적이다. 7일의 기한 차이와 30분의 추가 도보——이 트레이드오프는 정직하게 계산해야 한다. 우리의 답: 7일 윈도우 안에서는 효율이 이기고, 밖에서는 기한이 이긴다.

넷——30/60/90일 유통기한 알림, 매일 아침 7시, QA와 고객서비스로 직행. 90일 알림은 고객과 프로모션이나 이전을 협의하기 위한 것. 60일 알림은 우선 출고 스케줄. 30일 알림은 빨간불——아침 회의 안건에 오르고, 논쟁은 없다.

다섯——월 1회 유통기한 전용 실사. 세는 건 유통기한이지 수량이 아니다. 수량 실사는 재무의 일이다. 기한 실사가 목숨을 지킨다. 별개의 일, 별개의 날이다.

숫자, 우리 현장의 실적으로

전(FEFO "활성화") 지금(FEFO 실제 가동)
유통기한 관련 반품 연 2~3건, 건마다 아팠다 2년간 사실상 제로
입고 시간 빨랐다——그리고 지뢰투성이 입고 건당 1~2분 추가
피킹 효율 빨라 보였지만 재작업 다발 7일 윈도우 덕에 거의 동등
감사 기한 기록을 못 내고 식은땀 로트에서 기한까지 완전 추적

분명히 해두겠다. FDA는 어디에도 "FEFO를 써야 한다"고 쓴 적이 없다. 하지만 21 CFR Part 117은 식품 시설이 필요에 따라 보관 조건을 관리하고 그 증거 기록을 유지하도록 요구한다. 유통기한 관리가 엉망인 채로 실사에 들어가면 Form 483에 이름이 오른다. 식품을 다루면 그게 무슨 뜻인지 이미 알 것이다. 규정은 업데이트된다——최신 정보는 FDA 웹사이트에서 확인하라.

창고 매니저 동료들에게 한마디

대부분이 오해하는 불편한 진실이 있다. 유통기한 관리는 기한이 임박한 상품의 이야기가 아니다. 기한이 "괜찮아 보이는" 상품의 이야기다. 아무도 감시하지 않는다. 누군가 떠올렸을 땐 이미 늦었다. 우리의 90일 알림은 바로 그 "괜찮아 보이는" 재고를 위해 존재한다.

그리고 내가 단언하는 직관에 반하는 판단이 있다. 총 수명 12개월 이상인 상품은 엄격한 FEFO가 대개 필요 없다. FIFO+정기 알림이면 충분하다——장수명 SKU에 FEFO를 강제하는 건 아무것도 낳지 않는 추가 이동 시간 구매에 불과하다. 엄격한 FEFO는 단수명품에 아껴둬라. 첫날부터 건물 전체에 FEFO를 깔지 마라. 먼저 SKU 구성을 보라.

식품 창고를 운영한다면, 오늘 밤 딱 하나만 해보라. WMS를 열고 로트 번호가 있는 SKU 10개를 무작위로 뽑아, 유통기한 필드가 비어 있는 게 몇 개인지 확인하라. 3개를 넘는다면? FEFO 설정은 잊어라. 진짜 FEFO 창고 유통기한 관리는 입고의 1분에서 시작한다. 시스템의 체크박스는 언제나 시작에 불과했다.

Chen Feng, 창고 운영 매니저 지음

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