마켓플레이스
규칙
- 다중 판매자 데이터 모델:
User는 하나의 Seller 프로필을 가짐 — 상품은 판매자에 속하며, 주문은 구매자와 판매자를 연결함
- Stripe Connect 정산: Connect Express로 판매자 온보딩 — KYC, 세금 양식, 은행 계좌를 처리함
- 수수료: 플랫폼 수수료를 백분율로 계산 — PaymentIntent 또는 Checkout Session에
application_fee_amount 사용
- 에스크로 흐름: 구매 시 결제 캡처, 자금 보관, 배송 확인 또는 분쟁 기간 종료 후 판매자에게 이체
- 판매자 대시보드: 매출 분석, 주문 관리, 상품 CRUD, 정산 내역을 포함한 별도 레이아웃
- 구매자/판매자 리뷰: 주문당 하나의 리뷰, 양방향 — 가중 평균으로 평점 집계
- 판매자 필터링이 포함된 검색: 검색 패싯에 판매자 이름, 평점, 위치 포함
- 판매자 온보딩: 다단계 흐름 — 사업 정보 → Stripe Connect → 상품 등록 → 라이브 전환
패턴
const account = await stripe.accounts.create({
type: "express",
email: seller.email,
metadata: { sellerId: seller.id },
});
const accountLink = await stripe.accountLinks.create({
account: account.id,
refresh_url: `${baseUrl}/seller/onboarding?refresh=true`,
return_url: `${baseUrl}/seller/onboarding/complete`,
type: "account_onboarding",
});
const session = await stripe.checkout.sessions.create({
line_items: [{ price: priceId, quantity: 1 }],
payment_intent_data: {
application_fee_amount: Math.round(price * 0.10),
transfer_data: { destination: seller.stripeAccountId },
},
mode: "payment",
success_url: `${baseUrl}/orders/{CHECKOUT_SESSION_ID}`,
cancel_url: `${baseUrl}/cart`,
});
피해야 할 점
- 에스크로 없이 직접 이체 — 배송 확인 또는 분쟁 기간이 지날 때까지 자금 보류
- 모든 판매자에게 단일 Stripe 계정 사용 — 규정 준수를 위해 각 판매자는 자체 Connect 계정 필요
- 판매자가 정산 일정을 설정하도록 허용 — 사기 방지를 위해 플랫폼이 정산을 제어
- 판매자 확인 누락 — 라이브 전환 전에 Stripe Connect 온보딩 완료 필수
- 플랫폼이 판매자를 대신해 세금 처리 — Stripe Connect Express가 판매자 세금 보고를 처리함