비실물 상품 판매하기
배송이 없는 상품을 등록하고, 배송지 없이 결제한 뒤 판매자가 직접 제공 처리하기
배송이 필요 없는 상품을 팝니다. 이용권, 교육·상담 서비스, 셀러가 직접 전달하는 디지털 콘텐츠가 여기에 들어갑니다. 주문서가 배송지를 묻지 않고, 결제가 끝나면 판매자가 제공 처리로 제공 완료를 기록합니다.
준비
- 권한: 상품 등록은 소유자·관리자·스태프 또는
product:rw, 제공 처리는order:rw
상품 유형
상품 유형은 두 가지입니다.
| 유형 | 값 | 배송지·배송비 | 완료 방법 | 반품 수거 | 교환 |
|---|---|---|---|---|---|
| 배송 상품 | SHIPPING | 받음 | 발송처리·배송완료 | 있음 | 가능 |
| 배송 없는 상품 | MANUAL | 없음 | 판매자 제공 처리 | 없음 | 불가 |
- 배송 없는 주문 상품의
DELIVERED는 제공 완료입니다. 주문 상품의fulfillmentSnapshot.type으로 표시를 가르십시오. - 유형 값은 늘어날 수 있습니다. SDK는 모르는 유형을
OTHER로 읽습니다. 모르는 값은 배송 상품이 아닌 것으로 다루십시오. - 한 주문에 배송 상품과 배송 없는 상품을 함께 담을 수 있습니다. 배송비는 배송 상품에만 붙습니다.
- 재고는 배송 상품과 같이 셉니다.
1. 상품 등록
상점 플랫폼에서 상점 관리 › 상품 › 상품 등록으로 이동합니다(소유자·관리자·스태프).
- 배송 정책 섹션 맨 위에서 배송 없음을 고릅니다. 배송비·출고지·반품지 입력이 사라집니다.
- 나머지 항목을 채우고 **[등록]**을 누릅니다.
배송 있음과 없음을 바꾸면 사라지는 입력이 있을 때 확인을 받습니다. 판매 이력이 있는 상품은 바꿀 수 없습니다.
배송 없는 상품에는 반품·교환 배송비를 정할 수 없습니다(400 REFUND_POLICY_NOT_APPLICABLE).
API: POST /v1/products, 수정은 PUT·PATCH /v1/products/{productId}. 유형은 fulfillment 하나입니다
(상품 유형). 배송 없는 상품은 유형 속성이 없습니다.
await api.products.create({
name: "1:1 온라인 레슨 60분",
fulfillment: { type: "MANUAL" },
// 가격·카테고리 등 나머지 필드는 배송 상품과 같습니다
});| 오류 | 원인 |
|---|---|
409 FULFILLMENT_TYPE_LOCKED | 판매 이력이 있는 상품의 유형을 바꾸려 함 |
400 REFUND_POLICY_NOT_APPLICABLE | 배송 없는 상품에 반품·교환 배송비를 줌 |
400 검증 오류 | 없는 유형(DOWNLOAD·CODE·SERVICE·PICKUP 등)이나 fulfillment에 모르는 키를 보냄 |
2. 배송 없는 주문서
주문서·장바구니 응답의 requiresShipping이 false면 배송이 필요한 상품이 없습니다. 상품·장바구니 줄·주문서 줄은 fulfillment.requiresShipping으로 알립니다.
배송지 입력을 숨기고 결제 시작에 shippingAddress를 보내지 않아도 됩니다.
const checkout = await sdk.checkout.create({ cartItemIds });
await payments.start(checkout.checkoutId, {
option,
shippingAddress: checkout.requiresShipping ? shippingAddress : undefined,
guest,
});- 배송이 필요한데 배송지가 없으면
400 SHIPPING_ADDRESS_REQUIRED입니다. 필요 없는 주문에 보낸 배송지는 형식만 검사하고 버립니다. - 배송 없는 주문의
shippingAddress는 주문자 이름·연락처만 있고 주소는 빈 문자열입니다. 주문 응답에도requiresShipping이 있습니다. - 주문서를 만든 뒤 판매자가 상품 유형을 바꾸면 결제 시작이
409 CHECKOUT_STALE입니다. 주문서를 다시 만드십시오.
3. 제공 처리
결제완료·발주확인 상태의 주문 상품을 판매자가 제공합니다. 결제만으로 제공 완료가 되지 않습니다.
상점 플랫폼에서 상점 관리 › 판매 › 주문으로 이동해 주문 상세를 엽니다(소유자·관리자·스태프).
- 주문 상품 행의 **[제공 처리]**를 누릅니다.
- 구매자에게 보일 이용 안내(예: 예약 방법, 접속 주소)를 적습니다. 비워도 됩니다.
- 확인하면 상태가
제공 완료로 바뀝니다.
| 할 일 | API | Store SDK |
|---|---|---|
| 제공 처리 | POST /v1/order-items/{orderItemId}/fulfill, 본문 note | orderItems.fulfill(id, { note }) |
| 여러 건 | POST /v1/order-items/fulfill, 본문 orderItemIds·note (항목별 결과) | orderItems.fulfillBulk(ids, { note }) |
await api.orderItems.fulfill("oi_123", { note: "예약은 주문번호로 매장에 전화해 주십시오" });- 이용 안내는 주문 상품의
fulfillment.note로 구매자 주문 상세에 실립니다. 제공 시각은fulfillment.fulfilledAt입니다. - 구매자에게 알리는 메일은 보내지 않습니다. 알림이 필요하면
ORDER.FULFILLED웹훅을 받아 직접 보내십시오.
| 오류 | 원인 |
|---|---|
409 SHIPPING_REQUIRED | 배송 상품. 발송처리·배송완료로 처리합니다 |
409 INVALID_STATUS | 결제완료·발주확인이 아님 |
409 CLAIM_IN_PROGRESS | 취소·반품이 진행 중 |
- 배송 없는 상품에 발송처리·배송완료를 하면
409 NOT_SHIPPABLE, 배송 조회는404 NOT_SHIPPABLE입니다. 택배 추적과 자동 배송완료 대상이 아닙니다. - 구매확정은 배송 상품과 같습니다. 제공 완료 뒤 자동 구매확정 대기일이 지나면 구매확정합니다.
- 주문 목록은
GET /v1/orders?fulfillmentType=MANUAL처럼 유형으로 거를 수 있습니다.
웹훅
제공하면 ORDER.FULFILLED와 ORDER.DELIVERED가 함께 옵니다. ORDER.DELIVERED에는 orderItemId·fulfillmentSnapshot이 더 실립니다.
필드는 웹훅에 있습니다.
4. 취소·반품
| 상황 | 동작 |
|---|---|
| 교환 요청 | 409 EXCHANGE_NOT_SUPPORTED. 반품으로 접수합니다 |
| 반품 | 수거 없이 접수·보류 상태에서 바로 **[환불 승인]**합니다. 수거 등록은 409 COLLECTION_NOT_REQUIRED |
| 판매자 취소 | 제공 완료 뒤에도 할 수 있습니다 |
| 배송비·반품비·교환비 | 모두 0입니다 |
전량 취소·환불되면 제공 기록이 REVOKED로 닫힙니다. 환불 금액 규칙은 취소·반품·교환 처리하기와 같습니다.
청약철회 제한 고지·동의와 제공 뒤 접수 차단 기능은 없습니다. 구매자의 취소·반품 접수는 판매자가 확인해 승인하거나 거절합니다.