본문으로 건너뛰기

주문 취소

주문 취소는 주문을 없애는 작업이 아니라, 주문과 연결된 결제, 재고 예약, 출고 요청, 배송, 정산 데이터를 원래 상태에 맞게 되돌리거나 보정하는 업무다. 그래서 취소 가능 여부는 주문 상태 하나만 보고 판단하면 안 된다.

주의사항

출고 확정 이후에는 단순 주문 취소로 처리하지 않는 것이 안전하다. 이미 재고, 배송, 매출, 정산 데이터가 움직였으므로 반품 흐름으로 전환하는 편이 운영 추적에 유리하다.

주문 취소란?

주문 취소는 고객 요청, 품절, 결제 실패, 운영 판단 등으로 주문 이행을 중단하는 처리다. 취소 시점에 따라 난이도가 크게 달라진다.

시점취소 난이도주요 처리
결제 전낮음주문 상태만 취소
결제 완료 후보통결제 취소, 재고 예약 해제
출고 요청 후높음WMS 출고 요청 취소 필요
피킹 중높음작업 중단, 피킹 상품 회수
출고 확정 후매우 높음취소보다 반품 처리 권장
배송 중매우 높음회수/반품 프로세스로 전환

실제 업무 흐름

상태별 취소 판단

화면/기능 관점

주문 상세 화면의 취소 버튼은 다음 조건을 함께 봐야 한다.

조건화면 처리
결제 전즉시 취소 가능
결제 완료결제 취소 가능 여부 표시
출고 요청 전재고 예약 해제 포함 취소
출고 요청 후WMS 취소 가능 여부 조회
피킹 중운영자 승인 또는 보류 처리
출고 확정 후취소 버튼 대신 반품 접수 안내

API 관점

취소 API는 취소 가능 여부 판단과 실행을 분리하면 운영 화면을 만들기 쉽다.

GET /api/orders/ORD-1001/cancelability
POST /api/orders/ORD-1001/cancel

취소 실행 API는 내부적으로 다음 작업을 순서대로 수행한다.

  1. 주문, 결제, 출고, 배송 상태 잠금 조회
  2. 중복 취소 요청 여부 확인
  3. WMS 출고 취소 또는 작업 보류 요청
  4. 재고 예약 해제
  5. 결제 취소 또는 환불 요청
  6. 주문 상태 변경
  7. 취소 이력 저장
  8. ERP/정산 연동 메시지 생성

DB 테이블 예시

테이블역할
orders주문 현재 상태
order_lines상품별 취소 수량
order_cancel_requests취소 요청과 사유
payment_transactions결제 취소/환불 처리 결과
stock_reservations예약 재고 해제 대상
status_history취소 상태 변경 이력
interface_messagesWMS/ERP 취소 연동 메시지

취소 이력 예시

order_nofrom_statusto_statuscancel_reasonrequested_by
ORD-1001PAIDCANCELED고객 변심customer
ORD-1002OUTBOUND_REQUESTEDCANCEL_REQUESTED품절operator

실무에서 자주 생기는 문제

  • 사용자는 취소됐다고 보지만 WMS에는 이미 출고 지시가 내려가 있다.
  • 재고 예약은 해제됐는데 결제 취소가 실패한다.
  • 출고 확정 후 주문 상태만 취소되어 재고와 정산이 맞지 않는다.
  • 외부몰에서 같은 취소 요청이 중복 수신된다.
  • 피킹 완료 상품이 제자리로 돌아가지 않아 실재고가 틀어진다.

설계 시 주의사항

주문 상태, 결제 상태, 출고 상태, 배송 상태는 분리해야 한다. 취소 가능 여부는 이 상태들을 조합해 판단하고, 취소 결과는 상태 이력과 연동 로그로 남겨야 한다. 외부몰이나 결제사 연동은 실패할 수 있으므로 취소 요청 상태와 취소 완료 상태를 구분하는 것이 안전하다.

관련 문서