취소·반품·교환 처리하기
구매자가 요청한 주문 취소·반품·교환을 승인·거절하고 수거·재배송·환불을 처리하기
구매자가 요청한 취소·반품·교환을 유형별로 승인·거절하고 수거·재배송·환불을 처리합니다.
상점 플랫폼에서 상점 관리 › 판매 › 클레임으로 이동합니다(소유자·관리자·스태프, 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. 반품 처리
- [수거 등록] — 수거 방법을 고릅니다. 택배사 수거 요청이면 수거 택배사도 고릅니다. 구매자 직접 발송은 구매자가 보내 주길 기다립니다.
- [수거 완료] — 상품을 받으면 진행중 탭에서 누릅니다.
- [환불 승인] — 처리 필요 탭에서 누릅니다. 검수 결과 더 뺄 금액은 추가 차감에 적습니다.
반품은 수거 완료 전에 승인할 수 없습니다(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. 교환 처리
수거 등록과 수거 완료는 반품과 같습니다. 교환은 환불 승인을 하지 않습니다.
- [재배송 등록] — 보낼 옵션과 택배사·송장번호를 등록합니다. API:
POST /v1/claims/{claimId}/redelivery - [교환 완료] — 구매자가 받은 것을 확인하면 진행중 탭에서 누릅니다. 자동으로 끝나지 않습니다. 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입니다.
미달 차감은 그 환불에서 실제로 뺄 수 있는 금액까지이고, 나중에 묶음이 전량 취소되면 뺀 금액을 되돌려 줍니다.
거절
- 클레임 행의 ⋯ 메뉴에서 거절을 누릅니다.
- 사유(사용 흔적·구성품 누락·기간 만료·구매자 과실 파손·기타)를 고르고 설명을 10자 이상 적습니다. 설명은 구매자에게 보입니다.
- **[거절 확정]**을 누릅니다.
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 | 수거할 물건이 없는 상품입니다. 바로 환불 승인하거나 거절합니다 |