> For the complete documentation index, see [llms.txt](https://lunarie.gitbook.io/lunarie-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lunarie.gitbook.io/lunarie-docs/operacao/01-gestao-de-usuarios.md).

# Gestão de Usuários

> **Última atualização:** 08/10/2026 Como as pessoas entram, usam e saem da Lunarie durante o beta privado.

## Entrada

```
Fila da Lua (/fila-da-lua)
      │  admin convida (/admin → Convidar pessoa leitora)
      ▼
E-mail com código (válido por 7 dias)
      │  código + senha forte, ou código + Google
      ▼
Conta criada → confirmação de e-mail → primeira entrada
```

* Não há cadastro público. Toda conta nasce de um convite, tanto com senha (`validate-invite`) quanto com Google (`check-invite-code`).
* O trigger `check_invite_before_signup`, em `auth.users`, barra no banco qualquer cadastro sem convite válido.
* Cada convite é ligado a um e-mail e a uma origem. Hoje todos têm origem `fila_da_lua`.
* Reenviar um convite gera um código novo e renova os 7 dias. Arquivar o remove da lista sem apagar o registro.
* Códigos inválidos são limitados a 10 tentativas por hora por IP. O job `cleanup-invite-attempts` limpa o registro das tentativas todo dia.
* As 20 primeiras contas recebem o selo *Primeira Estante* (`handle_new_user`).

## Planos

A Lunarie não tem planos (ADR-095): toda conta tem o mesmo acesso, sem limites de livros, armazenamento ou envios. O Plus está suspenso (ADR-031 e ADR-032): `/upgrade` só redireciona para `/perfil`, e o Customer Portal foi desativado.

## Perfil

Nome, foto, e-mail Kindle, preferências de arquivo e de nomenclatura, selos e a zona de perigo (exclusão de conta).

## Exclusão de conta

A própria pessoa exclui em *Perfil*, na zona de perigo, em dois passos: aviso e confirmação digitando `EXCLUIR` (ADR-043). A função `delete-account` faz, nesta ordem:

1. Gera um CSV com os dados dos livros (título, autor, série, gênero, status, notas, tags e páginas), para o e-mail de despedida.
2. Cancela a assinatura Stripe ativa, se houver.
3. Remove os arquivos dos três buckets da pessoa (ebooks, capas e avatares).
4. Apaga as linhas por pessoa, nas tabelas de envios, livros, metas, conquistas e preferências.
5. Desvincula `apoios` e `founders` da pessoa, sem apagar o registro, por serem histórico de apoio. Apaga também a entrada da pessoa em `fila_da_lua` e `convites`, pelo e-mail, e pede ao PostHog a exclusão da pessoa e dos eventos dela (ADR-096). A chamada ao PostHog só roda com os segredos `POSTHOG_PERSONAL_API_KEY` e `POSTHOG_PROJECT_ID` configurados, e uma falha ali não bloqueia a exclusão.
6. Apaga o perfil e, por último, o usuário no Auth. Se algo falhar antes, a conta continua existindo e com login.
7. Envia o e-mail de despedida com o CSV. Se o Resend falhar, a exclusão segue.

A Base de Conhecimento não é tocada, porque é global.

## Ferramentas da admin

* `/admin`: convites, uso de IA, envios ao Kindle e diagnóstico das integrações. Só a conta admin acessa: as demais veem a página 404 (ADR-095).
* Supabase Dashboard: dados, logs e Auth.
* O acesso de admin é definido por uma lista de e-mails fixa no código (`ADMIN_EMAILS`, no app e em `send-invite`).

## Pontos de atenção

* A função `storage-integrity-check` existe, mas nenhum job a agenda: os jobs ativos são `cleanup-invite-attempts`, `feedback-30-dias-daily`, `kindle-bounce-check` e `kindle-resumo-semanal`. Não há verificação diária de integridade do storage.

## Documentos relacionados

* [Regras de Negócio](/lunarie-docs/requisitos/04-regras-de-negocio.md)
* [Suporte](/lunarie-docs/operacao/02-suporte.md)
