구성원 초대·관리
이메일로 구성원을 초대하고, 역할을 바꾸거나 내보내는 방법
함께 운영할 사람을 이메일로 초대하고, 역할을 바꾸거나 내보냅니다.
역할
| 역할 | 할 수 있는 일 |
|---|---|
| 소유자(OWNER) | 모든 작업. 결제 설정·양도·폐쇄는 소유자만. 상점당 한 명 |
| 관리자(ADMIN) | 결제 설정을 뺀 운영과 스태프 관리 |
| 스태프(STAFF) | 상품·주문·클레임·문의·리뷰와 고객 조회 |
관리자 초대·승격·변경·내보내기는 소유자만 합니다. 소유자는 소유권 양도로만 바뀝니다.
1. 초대 보내기
상점 플랫폼에서 설정 › 구성원으로 이동합니다(소유자·관리자).
- 구성원 초대 카드에 이메일과 역할을 입력합니다.
- **[초대 메일 보내기]**를 누릅니다. 수락 링크는 7일 유효합니다.
- 대기 중 초대 목록에서 발송 결과를 확인합니다.
| 표시 | 뜻 |
|---|---|
| 발송 실패 | 못 보냈거나 결과 불명. 주소 확인 후 재발송 |
| 발송 안 됨 | 메일 발송을 쓸 수 없음 |
| 만료 | 7일 지남. 재발송하면 다시 7일 |
- 발송이 실패해도 초대는 만들어집니다. 한 주소에는 대기 중 초대가 하나입니다.
- **[재발송]**은 새 링크를 보내고 이전 링크를 막습니다. **[취소]**한 링크도 막힙니다. 관리자 초대는 소유자만 재발송·취소합니다.
발송 한도(초대 + 재발송)는 상점당 시간당 20통(STORE), 초대한 사람당 하루 50통(SENDER), 받는 주소당 하루 5통(RECIPIENT)입니다. 넘으면 429 TOO_MANY_REQUESTS이고 details.limit이 어느 한도인지 알려 줍니다.
2. 초대 수락
- 받는 사람이 메일의 초대 수락 링크를 엽니다.
- 상점·역할·만료를 확인하고 **[로그인하고 수락]**을 누릅니다. 계정이 없으면 **[회원가입하고 수락]**입니다.
- 돌아온 화면에서 **[초대 수락]**을 누르면 그 상점으로 들어갑니다.
- 초대받은 이메일의 인증된 계정으로만 수락합니다. 다른 계정이면 **[다른 계정으로 로그인]**을 누릅니다.
- 로그인한 지 10분이 지났으면 **[다시 로그인]**을 누릅니다.
3. 역할 변경·내보내기
상점 플랫폼에서 설정 › 구성원으로 이동합니다(소유자·관리자).
- 구성원 목록에서 역할을 고릅니다. 바로 바뀝니다.
- 내보낼 사람은 **[내보내기]**를 누릅니다. 내보낸 사람은 새로 초대해야 들어옵니다.
관리자는 스스로 스태프가 되거나 나갈 수 있습니다.
감사 로그 action: MEMBER_INVITED · MEMBER_INVITATION_RESENT · MEMBER_INVITATION_CANCELED · MEMBER_INVITATION_ACCEPTED · MEMBER_ROLE_CHANGED · MEMBER_REMOVED
API로 관리하기
조회는 member:r, 변경은 member:rw입니다. 변경(초대·재발송·초대 취소·역할 변경·내보내기)은 상점 플랫폼에서 로그인한 소유자·관리자만 할 수 있습니다.
액세스 토큰, CLI·연동 앱의 로그인 토큰은 member:rw가 있어도 403 INSUFFICIENT_ROLE입니다. AI 에이전트용 토큰도 마찬가지입니다(AI 작업 승인).
| 요청 | Store SDK |
|---|---|
GET /v1/store/members | store.listMembers() |
PATCH /v1/store/members/{userId} | store.updateMemberRole(userId, { role }) |
DELETE /v1/store/members/{userId} | store.removeMember(userId) |
GET /v1/store/invitations | store.listInvitations({ status }) |
POST /v1/store/invitations | store.invite({ email, role }) |
POST /v1/store/invitations/{invitationId}/resend | store.resendInvitation(invitationId) |
DELETE /v1/store/invitations/{invitationId} | store.cancelInvitation(invitationId) |
초대 응답의 deliveryStatus가 SENT가 아니면(FAILED는 deliveryErrorCode에 원인) 재발송합니다. 응답에 수락 링크는 없습니다.
구성원은 모든 요금제에서 무료이고 인원 제한이 없습니다. 요금제와 한도
| 코드 | 상황 |
|---|---|
409 ALREADY_MEMBER | 이미 구성원 |
409 INVITATION_PENDING | 대기 중 초대가 있음. details.invitationId를 재발송 |
409 INVITATION_NOT_PENDING | 수락·취소된 초대를 재발송 |
403 INSUFFICIENT_ROLE | 소유자만 할 수 있는 작업, 또는 상점 플랫폼 밖에서 보낸 변경 요청 |
409 OWNER_CANNOT_LEAVE | 소유자를 내보내려 함 |