sayren Docs

취소·반품·교환 처리하기

구매자가 요청한 주문 취소·반품·교환을 승인·거절하고 수거·재배송·환불을 처리하기

구매자가 요청한 취소·반품·교환을 유형별로 승인·거절하고 수거·재배송·환불을 처리합니다.

상점 플랫폼에서 상점 관리 › 판매 › 클레임으로 이동합니다(소유자·관리자·스태프, claim:rw).

탭상태
처리 필요접수 · 수거완료
진행 중보류 · 수거중 · 재배송중
전체모든 상태

행마다 다음 처리 버튼이 하나 있습니다. 상세 보기·보류·보류 해제·거절은 ⋯ 메뉴에 있습니다.

유형별 처리 순서

유형순서끝나면
취소접수 → 환불 승인환불, 재고 복원
반품접수 → 수거 등록 → 수거 완료 → 환불 승인환불(추가 차감 가능), 재고 복원
교환접수 → 수거 등록 → 수거 완료 → 재배송 등록 → 교환 완료새 상품 발송
상태뜻
접수구매자가 요청함
보류셀러가 판단을 미룸
수거중 · 수거완료반품·교환 상품을 회수하는 중 · 회수함
재배송중교환 상품을 다시 보냄
완료 · 거절 · 철회끝남. 철회는 구매자가 거둔 경우
  • 구매자는 주문 상품의 일부 수량만 요청할 수 있습니다(수량 단위 부분 취소).
  • 끝나기 전에는 거절할 수 있습니다. 교환은 재배송 등록 뒤에는 거절할 수 없습니다.
  • 보류는 접수 상태에서 클레임당 한 번, 최대 7일입니다. 기한이 지나면 접수로 돌아옵니다. 보류 중에도 접수와 같은 처리(수거 등록·취소 환불 승인·거절)를 합니다.
  • 환불 승인은 바로 완료가 됩니다. 처리 이력에는 승인이 한 줄 남습니다.

비실물 상품

배송 없는 상품(MANUAL)은 흐름이 다릅니다(비실물 상품 판매하기).

  • 반품은 수거 없이 접수·보류 상태에서 바로 **[환불 승인]**합니다. 수거 등록은 409 COLLECTION_NOT_REQUIRED입니다.
  • 교환은 배송 상품만 받습니다. 배송 없는 상품은 구매자 요청이 409 EXCHANGE_NOT_SUPPORTED입니다.
  • 제공 완료 뒤에도 판매자 취소로 환불할 수 있습니다.
  • 배송이 없는 상품은 배송비 환불·반품 배송비·교환 배송비가 모두 0입니다.

1. 취소 승인

유형 취소인 행의 **[환불 승인]**을 누릅니다. PG로 환불되고 재고가 요청 수량만큼 돌아갑니다.

환불 승인은 되돌릴 수 없습니다. 승인하면 바로 PG 환불이 나갑니다.

API: POST /v1/claims/{claimId}/approve

응답 필드뜻
refundAmount실제 환불 금액
quantity환불한 수량
deliveryFeeRefundAmount환불액에 포함된 배송비
deliveryFeeChargeAmount환불액에서 뺀 배송비(반품·교환 배송비 + 조건부 무료배송 미달 차감)
deductAmount추가 차감. 배송비 차감과 별개입니다. 승인에서 생략하면 상점 주문 흐름이 정한 취소 수수료(접수 시점 계산)이고, 그것도 없으면 0입니다
couponChargeAmount환불액에서 뺀 쿠폰 조건 미달 차감(쿠폰)
couponChargeRefundAmount앞선 환불에서 뺀 쿠폰 차감을 되돌려 더한 금액
pointRefundAmount돌려준 적립금. refundAmount(현금)와 별개입니다(적립금)

클레임 조회의 expectedRefundAmount는 접수 시점 예상 환불액, expectedDeliveryFeeRefundAmount는 예상 배송비 환불액, expectedPointRefundAmount는 예상 반환 적립금입니다. 배송비는 승인 시점에 확정됩니다. 적립금을 사용한 주문은 차감을 현금에서 먼저 빼고, 모자란 몫만 적립금에서 뺍니다.

2. 반품 처리

  1. [수거 등록] — 수거 방법을 고릅니다. 택배사 수거 요청이면 수거 택배사도 고릅니다. 구매자 직접 발송은 구매자가 보내 주길 기다립니다.
  2. [수거 완료] — 상품을 받으면 진행중 탭에서 누릅니다.
  3. [환불 승인] — 처리 필요 탭에서 누릅니다. 검수 결과 더 뺄 금액은 추가 차감에 적습니다.

반품은 수거 완료 전에 승인할 수 없습니다(409 INVALID_STATUS).

단계API
수거 등록POST /v1/claims/{claimId}/collect — SELLER_PICKUP(carrierCode 필수) · BUYER_SEND
수거 완료POST /v1/claims/{claimId}/collect/complete
환불 승인POST /v1/claims/{claimId}/approve, 본문 deductAmount(원)

3. 교환 처리

수거 등록과 수거 완료는 반품과 같습니다. 교환은 환불 승인을 하지 않습니다.

  1. [재배송 등록] — 보낼 옵션과 택배사·송장번호를 등록합니다. API: POST /v1/claims/{claimId}/redelivery
  2. [교환 완료] — 구매자가 받은 것을 확인하면 진행중 탭에서 누릅니다. 자동으로 끝나지 않습니다. API: POST /v1/claims/{claimId}/complete-exchange (CLAIM.COMPLETED 웹훅 발송)
시점재고
수거 완료원래 옵션을 요청 수량만큼 복원
재배송 등록교환 옵션을 요청 수량만큼 차감. 부족하면 409 OUT_OF_STOCK
수거 완료 뒤 거절복원한 재고를 다시 차감(상품을 구매자에게 돌려보냄)

수량 단위 부분 취소

취소·반품·교환 요청과 판매자 취소는 quantity로 일부 수량만 처리합니다. 생략하면 남은 수량 전체입니다. 구매자 요청 API는 POST /storefront/v1/me/order-items/{orderItemId}/claims입니다. 신청 전에는 같은 본문으로 POST /storefront/v1/me/order-items/{orderItemId}/claims/preview를 불러 예상 환불과 취소 수수료(deductAmount)를 보입니다. 저장하지 않고, 접수할 수 없으면 접수와 같은 오류를 줍니다. 요청은 주문 흐름이 그 단계에서 신청을 받을 때만 접수됩니다. 받지 않는 단계면 409 INVALID_STATUS, 흐름이 정한 기한이 지났으면 409 PERIOD_EXPIRED입니다. 흐름이 정한 취소 수수료는 접수 때 예상 환불에서 뺍니다.

  • 상한은 activeQuantity(= quantity − canceledQuantity)입니다. 넘으면 400 INVALID_QUANTITY입니다.
  • 일부만 처리하면 상태는 그대로이고 canceledQuantity가 늘어납니다. 남은 수량이 0이 되면 취소(CANCELED)가 됩니다.
  • 환불액은 수량 비율이고 누적 금액 기준으로 잘라 나눠 처리해도 합이 주문 상품의 실제 결제 금액과 같습니다. 10,000원 · 3개를 1개씩 취소하면 3,333 → 3,333 → 3,334원입니다.
  • 재고 복원과 PG 부분 취소도 같은 수량입니다. 즉시할인은 단가에 이미 반영돼 있고, 쿠폰 할인은 주문 상품의 couponDiscountAmount를 뺀 금액을 나눕니다.
  • 남은 수량이 0이면 구매자 요청은 409 INVALID_STATUS, 판매자 취소는 409 ALREADY_CANCELED입니다.

환불 정책과 배송비

환불 정책은 취소·반품·교환에서 배송비를 누가 부담하는지 정합니다.

항목뜻기본값
preShipmentDeliveryFeeRefund발송 전 취소로 배송 묶음이 모두 취소되면 그 묶음 배송비를 환불true
returnDeliveryFee단순 변심 반품 배송비(원). 환불액에서 뺍니다0
exchangeDeliveryFee단순 변심 교환 배송비(원). 구매자 청구 안내값(claimDeliveryFee)입니다0
sellerFaultFreeShipping판매자 귀책(판매자 취소, 불량·오배송 반품)이면 배송비를 셀러가 부담true
conditionalFreeShortfallCharge상품별 조건부 무료로 0이었던 묶음이 일부 취소로 기준액에 미달하면 그 배송비를 환불액에서 뺌false
couponShortfallCharge일부 취소로 남은 주문 상품이 쿠폰 조건을 잃으면 남은 상품이 받던 쿠폰 할인을 환불액에서 뺌. 상점 단위만 있습니다true
  • 적용 순서는 상품별 정책 → 상점 기본 → 위 기본값입니다. 한 주문에 정책이 섞이면 상품별로 계산합니다.
  • 주문 상품마다 결제 시점의 유효 정책을 굳혀 둡니다. 결제 뒤 상점이나 상품의 정책을 바꿔도 이미 들어온 주문의 환불 계산은 바뀌지 않습니다.
  • 반품·교환 배송비(returnDeliveryFee·exchangeDeliveryFee)는 배송 상품에만 있습니다. 배송이 없는 상품의 반품·교환 배송비는 0입니다.
  • 상점 기본은 설정 › 상점 정보의 환불 정책 카드 또는 PATCH /v1/store의 refundPolicy(준 항목만 바뀜)입니다.
  • 상품별은 환불 정책 덮어쓰기입니다. 현재 값은 GET /v1/store의 refundPolicy로 전부 옵니다.

배송 묶음

배송비는 묶음 단위로 정산합니다. 묶음은 같은 출고지 + 같은 배송 정책인 주문 상품입니다(배송 묶음).

  • 묶음의 남은 수량이 0이 될 때만 그 묶음 배송비(제주·도서산간 추가 배송비 포함)를 환불합니다.
  • 한 묶음은 한 번만 정산되고, 주문이 낸 배송비를 넘겨 환불하지 않습니다.
  • 주문 시점에 무료였던 묶음은 돌려줄 배송비가 없습니다.
  • 묶음 구성과 금액은 주문 시점에 고정됩니다.

배송비 규칙

상황배송비 (상품 금액은 모두 수량 비율 환불)
발송 전 전량 취소preShipmentDeliveryFeeRefund가 true고 묶음이 모두 취소되면 환불
발송 후 단순 변심 반품환불하지 않고 returnDeliveryFee를 뺍니다
불량·오배송 반품, 판매자 취소sellerFaultFreeShipping이 true면 묶음이 모두 빠질 때 환불, 반품 배송비 없음
조건부 무료 기준 미달conditionalFreeShortfallCharge가 true면 뺍니다. 상품별 조건부 무료로 면제된 묶음만 대상이고, 판매자 귀책 + sellerFaultFreeShipping이면 빼지 않습니다

환불액 = 수량 비율 실제 결제 금액 + 배송비 환불 − 배송비 차감 − 쿠폰 차감 + 쿠폰 차감 되돌림 − 추가 차감이고 0보다 작아지지 않습니다. 쿠폰이 없는 주문은 쿠폰 두 항목이 0입니다. 미달 차감은 그 환불에서 실제로 뺄 수 있는 금액까지이고, 나중에 묶음이 전량 취소되면 뺀 금액을 되돌려 줍니다.

거절

  1. 클레임 행의 ⋯ 메뉴에서 거절을 누릅니다.
  2. 사유(사용 흔적·구성품 누락·기간 만료·구매자 과실 파손·기타)를 고르고 설명을 10자 이상 적습니다. 설명은 구매자에게 보입니다.
  3. **[거절 확정]**을 누릅니다.

API: POST /v1/claims/{claimId}/reject (증빙 이미지 5장까지)

API로 목록 가져오기

상점 플랫폼 탭요청
처리 필요GET /v1/claims?status=REQUESTED,COLLECTED
진행 중GET /v1/claims?status=HELD,COLLECTING,REDELIVERING

holdExpiresAt은 보류 중일 때 자동 해제 시각(그 밖에는 null), holdUsed는 보류를 이미 썼는지입니다. 상태 변경 알림은 웹훅으로 받습니다.

자주 막히는 문제

증상해결
반품 승인이 409 INVALID_STATUS수거 완료를 먼저 합니다
교환 승인이 409 INVALID_STATUS교환은 승인하지 않습니다. 재배송 등록 뒤 교환 완료를 누릅니다
처리 중 409 INVALID_STATUS다른 사람이나 구매자(철회)가 먼저 바꿨습니다. 목록을 새로 불러옵니다
409 CONCURRENT_UPDATE승인 사이에 판매자 취소가 수량을 가져갔습니다. 남은 수량을 확인하고 다시 승인합니다
409 ALREADY_HELD보류는 한 번뿐입니다. 해제 뒤에도 다시 못 합니다
400 INVALID_QUANTITY요청 수량이 activeQuantity보다 큽니다
재배송 등록이 409 OUT_OF_STOCK교환 옵션 재고를 채우고 다시 등록합니다
수거 등록이 409 COLLECTION_NOT_REQUIRED수거할 물건이 없는 상품입니다. 바로 환불 승인하거나 거절합니다

다음 단계

이 페이지 목차