Pular para o conteúdo principal

Onboarding do Seller (Waitlist + Invite)

Sellers não se auto-cadastram. O fluxo é: inscrição pública → admin aprova → gera invite token → artista finaliza cadastro com o token.

Jornada end-to-end

Estados

StatusSignificado
newInscrito, aguardando revisão
reviewedAdmin revisou, ainda não convidou
invitedToken gerado, pode completar signup
convertedSignup completo — virou User + SellerProfile
rejectedAdmin rejeitou a inscrição
blockedBloqueado (impede novas tentativas no email)

Endpoints

MétodoRotaAuthDescrição
POST/waitlistpúblicoInscrição (body: name, email, whatsapp, portfolio, consent)
POST/waitlist/invite/validatepúblicoValida token via body (não URL — evita vazar em logs)
GET/waitlistadminLista com filtro ?status_filter=...
GET/waitlist/{id}adminDetalhe
PATCH/waitlist/{id}adminMuda status (ex: new → reviewed)
POST/waitlist/{id}/inviteadminGera token + marca como invited. Só funciona se status ∈ {new, reviewed}
POST/waitlist/{id}/rejectadminMarca como rejected
POST/waitlist/{id}/blockadminMarca como blocked

1. Inscrição pública

POST /waitlist
{
"name": "Ana Silva",
"email": "ana@email.com",
"whatsapp": "+5511999999999",
"portfolio": "https://instagram.com/atelieana",
"artType": "illustration",
"sellsArt": "yes",
"goal": "extra_income",
"consent": true
}
CampoObrigatórioDescrição
nameSimNome do artista
emailSimEmail — único (não permite duplicatas ativas)
whatsappSimWhatsApp em formato E.164
portfolioSimURL (Instagram, Behance, site, etc.)
artTypeNãoillustration, etc.
sellsArtNãoyes / no / sometimes
goalNãoextra_income, etc.
consentSimtrue obrigatório (LGPD)

2. Admin convida

POST /waitlist/{id}/invite

Gera o inviteToken (hex, válido por 7 dias) e muda o status para invited. Só funciona se o status atual é new ou reviewed.

{
"id": "uuid",
"name": "Ana Silva",
"email": "ana@email.com",
"status": "invited",
"inviteToken": "a1b2c3...hex",
"inviteExpiresAt": "2026-04-23T12:00:00Z",
"invitedAt": "2026-04-16T12:00:00Z",
"convertedAt": null
}

Admin entrega o link ao artista via email ou WhatsApp:

{FRONTEND_URL}/signup/seller?token={inviteToken}

3. Frontend valida o token

Antes de exibir o formulário de senha, o frontend chama:

POST /waitlist/invite/validate
{ "token": "a1b2c3...hex" }

:::tip Token no body, não na URL A validação envia o token no corpo da request (não como query param ou path). Isso evita o token vazar em logs, analytics ou referers. Replique esse padrão no frontend. :::

Response inclui valid: true/false e (se válido) email + name para pré-preencher o formulário.

4. Signup final

POST /auth/signup/seller

Token + senha criam o User com role=seller e o SellerProfile vinculado.

Comportamento do handler:

  1. Valida token (não expirado, status invited)
  2. Cria User com senha, role=seller
  3. Cria SellerProfile (onboarding_status=pending, storeStatus=unpublished)
  4. Muda waitlist para converted, grava user_id e convertedAt

:::info Onboarding pós-signup O seller cai com storeStatus=unpublished. Para publicar a loja, ele precisa:

  1. Completar payoutComplete (ver Dashboard do Seller)
  2. Criar pelo menos 1 SellerProduct ativo
  3. Mudar storeStatus para published via PATCH /profiles/seller/me :::