Curso Lovable

Parte 2 · Construir 28min

04 Cole no Lovable e veja o app nascer

Com o PRD e o schema prontos, abrimos o Lovable e colamos os dois. O sistema inteiro nasce nesta aula: telas, banco de dados e IA. Depois, testamos com um lead de verdade e ajustamos o prompt do diagnóstico para a IA falar do seu negócio.

O que acontece

  1. Colamos o Prompt 3 com o PRD e o schema em um projeto novo. Enquanto o Lovable constrói, apresentamos a tela: o chat, a visualização, o botão Publicar e o custo em créditos.
  2. O sistema aparece. Percorremos as telas e mostramos como cada uma nasceu de uma linha do PRD, e o que o Lovable escolheu por conta própria.
  3. Entramos como um lead: respondemos as seis perguntas e recebemos o diagnóstico. No painel, o mesmo lead aparece com nota, temperatura e o resumo interno que o lead nunca vê.
  4. Abrimos o banco de dados em More → Cloud → Database e mostramos o lead e as respostas nas tabelas. O front é o que a pessoa vê; o backend é o que o sistema lembra.
  5. Abrimos o prompt do diagnóstico que o Lovable escreveu e o ajustamos com as regras do seu negócio, direto no chat. Testamos de novo e comparamos.
  6. Fazemos um ajuste pelo chat e outro direto na tela. Depois, quebramos o layout de propósito e voltamos para a versão anterior pelo histórico.
  7. Explicamos o que fazer quando o sistema quebra sozinho: você não precisa entender o erro. Copia, cola no chat, e o Lovable conserta. Se não resolver em poucas tentativas, volta a versão.
Na tela

O Lovable construindo, as telas, o diagnóstico na tela do lead, o painel, o banco de dados no Cloud, o prompt do diagnóstico, a barra de edição e o histórico de versões.

Do Lovable

O chat, a visualização, o custo em créditos, o Lovable Cloud (banco de dados e login, com Supabase por baixo), o Lovable AI (sem chave própria), a barra da visualização e o histórico de versões.

Você sai com

O sistema completo e testado: um lead entra, responde, recebe um diagnóstico escrito pra ele; você abre o painel e sabe com quem falar primeiro e como. E sabe o que fazer quando algo quebra.

Na tela

4 slides nesta aula.

Apresentar ▶
  1. 01O que vai no Prompt 3 e o que sai dele
  2. 02Front é o que a pessoa vê, backend é o que o sistema lembra
  3. 03Uma resposta, duas saídas
  4. 04Quando quebra de verdade

Prompts

Prompt 3 — construir no Lovable

Crie um projeto novo no Lovable. Cole este texto com o PRD e o schema no final. A cor entre colchetes é a da Conversão Extrema; troque pela cor da sua marca, se quiser.

Quero construir o sistema descrito abaixo, completo e funcionando de
ponta a ponta. Seguem o PRD e o schema do banco de dados.

O que eu espero:

1. Construa tudo o que está no PRD: todas as telas, todos os fluxos,
   todos os estados (carregando, vazio, sucesso, erro). Nada pode ser
   enfeite: todo botão faz o que o PRD diz.
2. Use o Lovable Cloud desde o início. Crie as tabelas exatamente como
   o schema descreve, insira os dados iniciais que o PRD lista na
   seção 6 (as perguntas com opções, os textos, e três ou quatro
   exemplos realistas), e ligue todas as telas ao banco. Nenhuma tela
   pode funcionar com dados falsos no lugar do banco.
3. Login com e-mail e senha pelo Lovable Cloud para a área do dono.
   As páginas públicas não pedem login. Crie a conta do dono para mim
   e me diga o e-mail e a senha iniciais.
4. A IA usa o Lovable AI, executada no backend, nunca no navegador.
   Ela devolve uma resposta estruturada, com todos os campos que o PRD
   pede, e o sistema valida antes de salvar. Se a IA falhar, siga a
   regra do PRD para esse caso.
5. Proteja os dados: só o dono logado lê e altera o que é do painel.
   As páginas públicas só conseguem inserir o que o PRD permite.
6. Onde o PRD não disser como algo deve ser, escolha a opção mais
   simples e me avise o que escolheu. Não adicione funcionalidades
   que não estão no PRD.
7. Antes de terminar, teste cada fluxo do começo ao fim como se fosse
   o usuário, corrija o que não funcionar, e me entregue uma lista do
   que testou.

Visual: quero um produto bonito e moderno, com cara de produto pronto,
seguindo este padrão à risca:
- Use os componentes prontos do projeto (shadcn/ui). Não invente
  componentes próprios.
- Fonte: Geist (do Google Fonts), com Geist Mono para números, datas e
  identificadores. Nenhuma outra família.
- Cores: fundo da página #FCFCFC, cartões #FFFFFF, texto principal
  #171717, texto de apoio #525252, texto fraco #737373. Uma cor forte
  só: [#10b981], usada no botão principal, no item de menu ativo, no
  foco e em detalhes pequenos. Nada mais é colorido.
- Separação por borda fina de 1px na cor #ECECEC, nunca por sombra.
  Cantos com 12px de raio nos cartões e 8px nos campos. Botões em
  formato de pílula.
- Estado (quente, morno, frio; contatado ou não) é um ponto de 6px
  colorido com o texto ao lado, em cinza. Sem etiquetas coloridas
  grandes.
- Tipografia calibrada para aplicação: título de página 28px, título
  de seção 18px, texto 14px, rótulo 12px. Hierarquia por peso e
  tamanho, não por cor.
- Espaço generoso e consistente: 8, 12, 16, 24px. Nada apertado, nada
  gigante.
- Página pública: uma coluna centralizada de no máximo 640px, uma
  pergunta por vez, barra de progresso fina, botão de voltar, transição
  suave. Tela de diagnóstico limpa, com o texto em boa leitura.
- Painel: barra de topo simples com o nome do sistema e os itens de
  menu, lista de leads em linhas com hairline entre elas, busca e
  filtro discretos no topo, e o detalhe do lead em tela própria.
- Estados de carregando (skeleton), vazio (com uma frase e o que fazer)
  e erro (com o que aconteceu e como tentar de novo) desenhados.
- Tudo funcionando bem no celular.

--- PRD ---
[cole o PRD]

--- SCHEMA ---
[cole o conteúdo de schema.prisma]

Depois que ele terminar: entre como lead, preencha, veja o diagnóstico. Entre como dono, veja o lead no painel. Se algo não funcionar, cole o erro no chat com o modelo abaixo.


Como reportar um erro ao Lovable

Quando algo quebrar, você não precisa entender o erro. Copie e cole no chat, do jeito que apareceu, dizendo o que estava fazendo. O Lovable lê e conserta.

Cliquei em [o que você fez] e apareceu este erro:

[cole o erro exatamente como apareceu]

Conserte sem mudar o que já está funcionando.

Se depois de duas ou três tentativas ainda estiver ruim, pare: volte para a última versão boa pelo histórico e peça de outro jeito.

Documentos

PRD — Qualificador de Leads com IA

Gerado pelo Prompt 1 com a descrição do curso, numa conversa nova, sem correção. É este que vai pro Lovable na aula 04, junto com o schema.

Versão 1. Documento único, sem pendências. Tudo o que está aqui precisa funcionar na primeira entrega.


1. O que o sistema faz, em uma frase

Uma página pública faz seis perguntas ao interessado, entrega na hora um diagnóstico escrito por IA sobre o momento do negócio dele, e joga esse lead num painel privado já pontuado, classificado por temperatura e com um roteiro de como abordar.


2. Para quem é e qual problema resolve

Para quem: prestadores de serviço e donos de agência que vendem por conversa — consultoria, mentoria, marketing, reforma, contabilidade, qualquer serviço onde existe uma reunião antes da venda.

O problema: o lead chega por um formulário genérico ("nome, e-mail, mensagem") e todos parecem iguais. O dono descobre se a pessoa tem fit só depois de gastar 40 minutos numa call. Ao mesmo tempo, o interessado não recebe nada de valor antes de falar com um vendedor, então some ou esfria.

A solução: troca de valor. O interessado ganha um diagnóstico útil e imediato; em troca, entrega contexto real do negócio. O dono recebe cada lead com nota, temperatura e um roteiro pronto, e trabalha os quentes primeiro.

Ganho concreto: saber quem ligar primeiro, e abrir a conversa já sabendo do que falar.


3. Quem usa: papéis e login

Papel Precisa de login? O que faz
Interessado (lead) Não Entra na página pública, responde as 6 perguntas, deixa os dados, lê o diagnóstico. Nunca vê o painel.
Dono Sim Entra no painel, vê os leads, abre cada um, marca contato, edita o texto das perguntas.

Só existem esses dois papéis. Não há níveis de permissão dentro do painel, não há convite de usuários, não há cadastro público. A versão 1 é de uma conta só: um único login de dono, criado manualmente na hora de configurar o sistema, e uma única página pública.


4. O percurso de cada papel

Interessado

  1. Abre o link da página pública (recebeu por WhatsApp, bio do Instagram, anúncio ou e-mail).
  2. Lê a capa: o que vai ganhar e quanto tempo leva. Clica em Começar diagnóstico.
  3. Vê a pergunta 1 sozinha na tela, com quatro ou cinco opções. Clica na que descreve a situação dele.
  4. A tela avança sozinha para a pergunta 2. Repete até a pergunta 6. Pode voltar a qualquer momento para trocar uma resposta.
  5. Depois da sexta pergunta, chega na tela de dados: nome, e-mail, empresa e WhatsApp.
  6. Clica em Ver meu diagnóstico. Se algum campo estiver errado, o erro aparece embaixo do campo e nada é enviado.
  7. Vê a tela de espera com a mensagem de que as respostas estão sendo analisadas (cerca de 15 segundos).
  8. Recebe o diagnóstico na tela: um título, onde ele está hoje, o que está travando, e três passos do que fazer primeiro.
  9. No fim do diagnóstico, encontra um convite para conversar, com botão que abre o WhatsApp do dono.
  10. Fecha a página. Se voltar ao link depois, começa do zero — o diagnóstico não fica salvo para ele.

Dono

  1. Abre o endereço do painel e faz login com e-mail e senha.
  2. Cai direto na lista de leads, já ordenada: pendências no topo, depois quentes, mornos e frios.
  3. Bate o olho na lista: nome, empresa, nota, temperatura, faturamento, urgência e se já foi contatado.
  4. Filtra por temperatura ou por "não contatados", ou busca por nome, e-mail, empresa ou telefone.
  5. Clica num lead e abre o detalhe.
  6. Lê primeiro o bloco Como abordar: contexto, três pontos de abordagem, primeira mensagem sugerida, objeção provável e o que evitar.
  7. Copia a primeira mensagem, clica em Abrir no WhatsApp e fala com a pessoa.
  8. Volta ao painel e clica em Marcar como contatado. O lead ganha o selo e sai do filtro de não contatados.
  9. Quando quiser, entra em Perguntas e ajusta o texto de um enunciado ou de uma opção para falar mais a língua do público dele.
  10. Salva. As mudanças valem para quem responder daí em diante.

5. As telas

São dez telas: seis públicas (sem login) e quatro privadas. Não existe menu na área pública; existe um cabeçalho fixo simples no painel.

Direção visual geral: fundo claro, uma cor de destaque só, texto grande e respirado na área pública, densidade maior no painel. Nada de barra lateral: o painel é uma coluna central com cabeçalho. Nas telas públicas, cada tela tem um único assunto e um único botão principal.


T1 — Capa do diagnóstico (pública)

O que aparece. Ocupando a tela inteira, centralizado: o título em fonte grande, um subtítulo de uma linha logo abaixo, e o botão principal. Abaixo do botão, em texto pequeno e cinza, três itens do que a pessoa recebe e o tempo estimado. No rodapé, o nome da empresa do dono.

Primeiro o olho bate no título, depois no botão. Os três itens e o rodapé são secundários e ficam visivelmente menores.

O que a pessoa faz. Lê e clica em Começar diagnóstico.

O que acontece em cada clique.

  • Começar diagnóstico → a capa dá lugar à pergunta 1, sem recarregar a página e sem mudar de endereço.

Estados.

  • Carregando: os textos das perguntas vêm do banco. Enquanto vêm, o botão fica desabilitado com o rótulo "Carregando…". Costuma durar menos de um segundo.
  • Vazio: não se aplica — a capa sempre tem conteúdo.
  • Sucesso: não se aplica.
  • Erro: se as perguntas não carregarem, a capa mostra no lugar do botão a mensagem de erro de carregamento e um botão Tentar de novo.

T2 — Pergunta (pública, uma tela reutilizada seis vezes)

O que aparece. No topo, uma barra de progresso fina e, ao lado dela, "Pergunta 3 de 6" em texto pequeno. No centro, o enunciado em fonte grande. Abaixo, as opções como cartões largos, empilhados, um por linha, cada um com bastante área clicável. No canto inferior esquerdo, o link Voltar, discreto.

O enunciado e as opções são o destaque absoluto. Progresso e voltar são cinzas e pequenos. Não há nada mais na tela: sem cabeçalho, sem rodapé, sem imagem.

O que a pessoa faz. Clica na opção que descreve a situação dela. Ou clica em Voltar para revisar a anterior.

O que acontece em cada clique.

  • Uma opção → o cartão fica marcado com a cor de destaque; após um terço de segundo, a tela desliza para a próxima pergunta. Na sexta pergunta, vai para T3.
  • Voltar → volta uma pergunta, com a resposta anterior ainda marcada. No passo 1, Voltar leva de volta à capa mantendo as respostas dadas até ali.

Estados.

  • Carregando: não existe — as seis perguntas já foram carregadas na capa e a troca entre elas é instantânea.
  • Vazio: não se aplica.
  • Sucesso: a marcação do cartão escolhido é a única confirmação necessária.
  • Erro: não existe erro possível nesta tela. Se a pessoa atualizar a página no meio do fluxo, tudo se perde e ela volta à capa em branco — sem aviso, sem recuperação.

T3 — Seus dados (pública)

O que aparece. No topo, a barra de progresso completa e o texto "Última etapa". Um título curto explicando por que os dados são pedidos. Quatro campos empilhados, um por linha, com rótulo em cima: Nome, E-mail, Empresa, WhatsApp (com máscara automática). Abaixo, o botão principal, grande e da largura dos campos. Abaixo do botão, uma linha cinza sobre privacidade. À esquerda, o link Voltar.

Destaque: o botão. Secundário: a linha de privacidade e o voltar.

O que a pessoa faz. Preenche os quatro campos e envia.

O que acontece em cada clique.

  • Ver meu diagnóstico → valida os quatro campos. Se algum estiver inválido ou vazio, a mensagem aparece em vermelho embaixo do campo, o cursor pula para o primeiro campo com erro e nada sai da tela. Se estiver tudo certo, o lead é gravado com as seis respostas e o sistema segue para T4.
  • Voltar → volta para a pergunta 6, com os dados já digitados guardados na tela.

Estados.

  • Carregando: ao enviar, o botão desabilita e troca o rótulo para "Enviando…". A tela inteira segue visível por um instante e então dá lugar à T4.
  • Vazio: não se aplica.
  • Sucesso: a própria ida para T4 é a confirmação.
  • Erro: se a gravação falhar, a tela permanece com os campos preenchidos e aparece uma faixa vermelha acima do botão com a mensagem de falha de envio. O botão volta ao normal e a pessoa pode tentar de novo.

T4 — Gerando o diagnóstico (pública)

O que aparece. Tela limpa, centralizada: uma animação simples de carregamento, uma frase grande que troca a cada três segundos, e abaixo, pequeno, o aviso de que costuma levar uns 15 segundos e para não fechar a página.

O que a pessoa faz. Nada. Não há botão.

O que acontece. Assim que a IA responde, a tela dá lugar a T5. Se passar de 30 segundos sem resposta, vai para T6.

Estados.

  • Carregando: é a tela inteira.
  • Vazio / Sucesso: não se aplicam — a tela sempre sai para T5 ou T6.
  • Erro: qualquer falha ou estouro de tempo leva a T6. O lead já está salvo neste ponto.

T5 — Diagnóstico (pública)

O que aparece, de cima para baixo:

  1. Uma linha de saudação com o primeiro nome da pessoa.
  2. O título do diagnóstico, escrito pela IA — a maior fonte da tela.
  3. Bloco Onde você está hoje: dois parágrafos curtos.
  4. Bloco O que está te travando: dois parágrafos curtos.
  5. Bloco Por onde começar: três passos numerados, cada um com um título curto em negrito e duas linhas de explicação. É o bloco com mais peso visual — fundo levemente destacado.
  6. Um cartão de convite no fim, com uma frase e o botão Falar no WhatsApp.

Destaque: o título e o bloco dos três passos. O convite fica no fim, depois de a pessoa já ter recebido valor — não interrompe a leitura.

Esta tela não mostra nota, temperatura, nem qualquer parte do resumo interno.

O que a pessoa faz. Lê. Opcionalmente clica no botão de conversa.

O que acontece em cada clique.

  • Falar no WhatsApp → abre o WhatsApp do dono numa nova aba, com uma mensagem já escrita mencionando o diagnóstico.

Estados.

  • Carregando: é a T4, que vem antes.
  • Vazio: não se aplica — a IA sempre devolve os três blocos preenchidos, ou a tela vira T6.
  • Sucesso: é esta tela.
  • Erro: se a pessoa atualizar a página, volta para a capa em branco. Não existe link permanente para o diagnóstico.

T6 — Não conseguimos gerar (pública)

O que aparece. Um ícone neutro, um título calmo, dois parágrafos explicando que as respostas chegaram e que o dono vai retornar, e o botão Tentar gerar de novo. Abaixo, o botão de WhatsApp do dono.

O que a pessoa faz. Pode tentar uma vez mais, ou ir direto para o WhatsApp.

O que acontece em cada clique.

  • Tentar gerar de novo → volta para T4 e refaz a chamada uma única vez. Se der certo, vai para T5. Se falhar de novo, volta para T6 e o botão some, restando só o de WhatsApp.
  • Falar no WhatsApp → mesma coisa da T5.

Estados. Erro é a própria tela. Os demais não se aplicam.


T7 — Entrar (privada)

O que aparece. Caixa centralizada e estreita: nome do sistema no topo, campo E-mail, campo Senha, botão Entrar de largura total. Nada mais — sem link de cadastro.

O que a pessoa faz. Digita e-mail e senha e entra.

O que acontece em cada clique.

  • Entrar → valida. Dando certo, vai para T8. Dando errado, mostra o erro acima do botão, mantém o e-mail e limpa a senha.

Estados.

  • Carregando: botão desabilitado com "Entrando…".
  • Vazio: não se aplica.
  • Sucesso: a ida para o painel.
  • Erro: mensagem única e genérica, sem dizer qual dos dois campos está errado.

T8 — Leads (privada, tela inicial do painel)

O que aparece. Cabeçalho fixo com o nome do sistema à esquerda e, à direita, o link Perguntas e o botão Sair.

Abaixo, o bloco de topo: o título "Leads", e ao lado dele uma linha de resumo com o total e quantos estão quentes. Na linha seguinte, o campo de busca ocupando a largura, e sob ele duas fileiras de chips de filtro: temperatura (Todos, Quentes, Mornos, Frios, Sem diagnóstico) e contato (Todos, Não contatados, Contatados).

Depois, a lista. Cada lead é uma linha larga e clicável com, da esquerda para a direita: um círculo colorido com a nota dentro (vermelho para quente, âmbar para morno, azul para frio, cinza para sem diagnóstico); nome em negrito com a empresa embaixo em cinza; duas etiquetas pequenas com o faturamento e a urgência; e, à direita, a data e, se for o caso, o selo ✓ Contatado. Se o mesmo e-mail já tiver respondido antes, aparece uma etiqueta "repetido".

A ordem é fixa e não é configurável: primeiro os sem diagnóstico, depois quentes, mornos e frios; dentro de cada faixa, a maior nota primeiro; em caso de empate, o mais recente primeiro.

Destaque: o círculo com a nota e o nome. Secundário: etiquetas, data e selos.

No fim da lista, se houver mais de 25 leads, o botão Carregar mais, que traz mais 25.

O que a pessoa faz. Busca, filtra, abre um lead.

O que acontece em cada clique.

  • Uma linha da lista → abre T9.
  • Um chip de filtro → a lista refiltra na hora; o chip escolhido fica preenchido; os dois grupos de filtro funcionam juntos.
  • Digitar na busca → filtra enquanto digita, comparando com nome, e-mail, empresa e telefone, sem diferenciar maiúsculas nem acentos.
  • Perguntas → abre T10.
  • Sair → encerra a sessão e volta para T7.
  • Carregar mais → acrescenta os próximos 25 abaixo.
  • Remover exemplos (só aparece enquanto houver dados de exemplo) → pede confirmação e apaga os cinco leads de demonstração de uma vez.

Estados.

  • Carregando: cinco linhas cinzas em formato de esqueleto no lugar da lista.
  • Vazio (com exemplos): enquanto não existir nenhum lead real, a lista mostra os cinco leads de exemplo, com uma faixa âmbar acima explicando que são exemplos e o botão Remover exemplos. Os exemplos abrem normalmente no detalhe e são marcados com a etiqueta "exemplo".
  • Vazio (de verdade): depois de remover os exemplos e sem nenhum lead real, aparece no meio da área da lista um ícone simples, a frase de lista vazia e o botão Copiar link da página pública.
  • Vazio (por filtro ou busca): frase curta dizendo que nada bateu com os filtros e o link Limpar filtros.
  • Sucesso: a lista carregada. Ao voltar do detalhe, a lista mantém busca, filtros e posição de rolagem.
  • Erro: faixa vermelha no lugar da lista com a mensagem de falha e o botão Tentar de novo.

T9 — Detalhe do lead (privada)

O que aparece. No topo, o link ← Voltar para os leads. Abaixo, o cabeçalho do lead: o nome em fonte grande, a empresa embaixo, e à direita a etiqueta de temperatura com a nota em destaque ("Quente · 87/100") e a data e hora do envio.

Logo abaixo do cabeçalho, a fileira de ações: Marcar como contatado (botão principal), Abrir no WhatsApp, Copiar e-mail e, afastado à direita e em cinza, Excluir.

O corpo tem duas colunas em tela larga e vira uma coluna no celular. A coluna esquerda, mais larga, é a principal:

  • Como abordar — o resumo interno da IA, dividido em: uma linha de contexto; três pontos de abordagem em lista; a primeira mensagem sugerida dentro de um bloco destacado com botão Copiar; a objeção provável; e o que evitar.
  • Diagnóstico entregue — bloco recolhido por padrão, que ao ser aberto mostra exatamente o texto que o lead viu.

A coluna direita:

  • Respostas — os seis pares de pergunta e resposta, com o enunciado em cinza pequeno e a resposta em preto.
  • Contato — e-mail e WhatsApp, cada um com botão de copiar.

Destaque: o bloco Como abordar, que é a primeira coisa lida. Secundário: respostas e contato.

O que a pessoa faz. Lê a abordagem, copia a mensagem, fala com o lead e marca o contato.

O que acontece em cada clique.

  • Marcar como contatado → grava na hora, o botão vira "Contatado em 09/09/2026" e um aviso curto aparece no rodapé por três segundos. Clicar de novo desmarca, pedindo confirmação.
  • Abrir no WhatsApp → abre a conversa com o número do lead numa nova aba, sem mensagem pré-escrita.
  • Copiar e-mail / Copiar (na mensagem sugerida) → copia e mostra o aviso de cópia por dois segundos.
  • Excluir → abre confirmação em janela. Confirmando, apaga de vez e volta para T8 com o aviso de exclusão. Cancelando, fecha a janela.
  • Voltar para os leads → volta a T8 no mesmo estado em que ela estava.

Estados.

  • Carregando: cabeçalho e blocos em esqueleto cinza.
  • Vazio: um lead sempre tem as seis respostas e o contato. Se o diagnóstico não tiver sido gerado, no lugar dos blocos Como abordar e Diagnóstico entregue aparece um painel âmbar com o aviso de diagnóstico não gerado e o botão Gerar agora, que roda a IA na hora e recarrega a tela com o resultado. Se falhar de novo, o painel permanece.
  • Sucesso: avisos curtos no rodapé para marcar contato, copiar e gerar diagnóstico.
  • Erro: se o lead não existir (link antigo ou excluído), a tela mostra a mensagem de lead não encontrado e o botão de voltar.

T10 — Perguntas (privada)

O que aparece. Título "Perguntas do diagnóstico" e, abaixo, uma linha explicando que a mudança vale só para novos envios. Depois, as seis perguntas numeradas, uma abaixo da outra, cada uma num cartão: campo de texto com o enunciado e, abaixo, um campo por opção de resposta. Contador de caracteres discreto em cada campo.

Ao rolar, uma barra fixa no fim da tela com Salvar alterações (principal) e Desfazer (só aparece quando há mudança não salva). No fim da página, em cinza, o link Restaurar textos originais.

O que a pessoa faz. Edita textos e salva.

O que acontece em cada clique.

  • Salvar alterações → valida que nenhum campo está vazio e que os limites foram respeitados. Dando certo, salva tudo de uma vez e mostra o aviso de salvo. Dando errado, marca os campos problemáticos em vermelho e não salva nada.
  • Desfazer → devolve os campos ao que estava salvo, sem confirmação.
  • Restaurar textos originais → pede confirmação e devolve as seis perguntas ao texto de fábrica da seção 6.

Não existe botão de adicionar ou remover pergunta, nem de adicionar ou remover opção. A estrutura é fixa em seis perguntas com as opções listadas na seção 6.

Estados.

  • Carregando: seis cartões em esqueleto.
  • Vazio: não se aplica.
  • Sucesso: aviso "Perguntas atualizadas" por três segundos.
  • Erro: faixa vermelha acima da barra de salvar com a mensagem de falha; nada foi salvo e o texto digitado continua na tela.

T11 — Página não encontrada

Qualquer endereço desconhecido mostra uma tela simples com o aviso de página inexistente e um botão que leva à capa pública. Se a pessoa estiver logada, o botão leva ao painel.


6. O conteúdo pronto

6.1 Textos da capa (T1)

  • Título: Descubra em 2 minutos o que está travando o crescimento do seu negócio
  • Subtítulo: Responda 6 perguntas e receba na hora um diagnóstico com o que fazer primeiro.
  • Botão: Começar diagnóstico
  • Itens abaixo do botão:
    • Um diagnóstico escrito para a sua situação, não um texto genérico
    • Os três primeiros passos, na ordem certa
    • 6 perguntas, menos de 2 minutos, sem custo
  • Rodapé: Diagnóstico gratuito · Conversão Extrema

6.2 As seis perguntas

Pergunta 1 — Como você vende hoje?

  • Sou eu quem presta o serviço, sozinho
  • Tenho uma agência ou equipe entregando
  • Vendo consultoria ou mentoria
  • Ainda estou começando, quase não vendi

Pergunta 2 — Qual foi o seu faturamento médio nos últimos 3 meses?

  • Ainda não faturo
  • Até R$ 5 mil por mês
  • Entre R$ 5 mil e R$ 20 mil por mês
  • Entre R$ 20 mil e R$ 50 mil por mês
  • Acima de R$ 50 mil por mês

Pergunta 3 — De onde vêm os seus clientes hoje?

  • Indicação e boca a boca
  • Eu vou atrás: prospecção ativa
  • Conteúdo e redes sociais
  • Anúncios pagos
  • Não tem um caminho definido, é sorte

Pergunta 4 — Qual é o seu maior problema hoje?

  • Chegam poucos leads
  • Chegam leads, mas fora do perfil
  • Converso com gente boa, mas fecho pouco
  • Vendo bem, mas a entrega vira gargalo
  • Trabalho muito e sobra pouco, a margem é ruim

Pergunta 5 — Quanto tempo por semana você dedica a atrair clientes?

  • Nenhum, só atendo quem aparece
  • Até 2 horas
  • De 2 a 5 horas
  • Mais de 5 horas
  • Tenho alguém dedicado só a isso

Pergunta 6 — Quando você quer resolver isso?

  • Agora, é urgente
  • Nos próximos 30 dias
  • Nos próximos 3 meses
  • Só estou pesquisando, sem pressa

6.3 Textos do fluxo (T2 e T3)

  • Progresso: Pergunta 3 de 6 · na tela de dados: Última etapa
  • Voltar: ← Voltar
  • Título da tela de dados: Falta só saber pra quem é esse diagnóstico
  • Rótulos: Seu nome · Seu melhor e-mail · Nome da sua empresa · WhatsApp com DDD
  • Exemplos dentro dos campos: Marina Alves · marina@estudio.com.br · Estúdio Marina Alves · (48) 99999-0000
  • Botão: Ver meu diagnóstico
  • Linha de privacidade: Seus dados ficam só com a gente e são usados para falar com você sobre o seu diagnóstico. Nada de spam.

6.4 Mensagens de erro de formulário

  • Nome: Precisamos do seu nome.
  • E-mail vazio: Precisamos do seu e-mail.
  • E-mail inválido: Esse e-mail parece incompleto. Confere pra gente?
  • Empresa: Escreve o nome da sua empresa. Se ainda não tem, escreve "Autônomo".
  • WhatsApp vazio: Precisamos do seu WhatsApp.
  • WhatsApp inválido: Esse número parece incompleto. Coloca o DDD e mais 8 ou 9 dígitos.
  • Falha ao enviar: Não conseguimos enviar agora. Tenta de novo em alguns segundos.
  • Excesso de envios: Você já enviou várias respostas nos últimos minutos. Espera um pouco e tenta de novo.

6.5 Tela de espera (T4)

  • Frases que se alternam a cada 3 segundos:
    1. Lendo suas respostas…
    2. Comparando com o que costuma travar negócios como o seu…
    3. Escrevendo o seu diagnóstico…
  • Aviso pequeno: Isso leva uns 15 segundos. Não feche esta página.

6.6 Diagnóstico (T5)

  • Saudação: Pronto, Marina. (primeiro nome do lead)
  • Títulos fixos dos blocos: Onde você está hoje · O que está te travando · Por onde começar
  • Cartão final:
    • Frase: Esse diagnóstico é o mapa. Se quiser ajuda para executar, é só chamar.
    • Botão: Falar no WhatsApp
    • Mensagem que já vai escrita: Oi! Acabei de fazer o diagnóstico no site e queria conversar sobre o resultado.

6.7 Tela de falha (T6)

  • Título: Seu diagnóstico não ficou pronto
  • Texto: Deu um problema aqui do nosso lado na hora de escrever. Suas respostas chegaram, então nada se perdeu — a gente entra em contato com você.
  • Botões: Tentar gerar de novo · Falar no WhatsApp

6.8 Textos do painel

  • Login: título Entrar no painel · botão Entrar · erro: E-mail ou senha incorretos.
  • Lista: título Leads · resumo: 18 leads · 4 quentes · busca: Buscar por nome, e-mail, empresa ou telefone
  • Lista vazia de verdade: Nenhum lead ainda. Compartilhe o link da sua página de diagnóstico para começar a receber. → botão Copiar link da página pública → aviso Link copiado
  • Lista vazia por filtro: Nenhum lead com esses filtros. → Limpar filtros
  • Erro ao carregar: Não conseguimos carregar os leads. → Tentar de novo
  • Faixa dos exemplos: Estes são leads de exemplo, só para você ver como o painel fica cheio. → Remover exemplos → confirmação: Remover os cinco leads de exemplo? Isso não afeta leads reais.
  • Detalhe: Como abordar · Primeira mensagem · Objeção provável · O que evitar · Respostas · Contato · Diagnóstico entregue
  • Botões do detalhe: Marcar como contatado · Contatado em 09/09/2026 · Abrir no WhatsApp · Copiar e-mail · Excluir
  • Avisos: Marcado como contatado · Copiado · Diagnóstico gerado · Lead excluído
  • Confirmação de exclusão: Excluir o lead Marina Alves? Isso apaga as respostas e o diagnóstico e não dá para desfazer. → Excluir / Cancelar
  • Sem diagnóstico: Diagnóstico não gerado. A IA falhou na hora do envio. Você pode gerar agora. → Gerar agora
  • Perguntas: título Perguntas do diagnóstico · linha de apoio: As mudanças valem para quem responder daí em diante. Leads antigos continuam mostrando as perguntas como estavam. · Salvar alterações · Desfazer · Restaurar textos originais · aviso Perguntas atualizadas · erro de campo vazio: Este campo não pode ficar vazio.
  • Página não encontrada: Essa página não existe. → Ir para o início

6.9 Cinco leads de exemplo

Cada um vem com as seis respostas, nota, temperatura, diagnóstico e resumo interno completos, para o painel nunca aparecer vazio na primeira visita.

1. Marina Alves — Estúdio Marina Alves — 87 · Quente · não contatada · há 2 horas Respostas: agência com equipe · R$ 20 a 50 mil · indicação e boca a boca · chegam leads fora do perfil · até 2 horas por semana · agora, é urgente. Como abordar (trecho): depende de indicação, cresceu até onde o boca a boca leva e agora recebe volume desqualificado. Tem caixa e pressa. Abrir falando do custo de atender lead fora do perfil.

2. Rafael Toledo — Toledo Performance — 74 · Quente · contatado ontem · há 1 dia Respostas: agência com equipe · acima de R$ 50 mil · anúncios pagos · vendo bem, mas a entrega vira gargalo · alguém dedicado · nos próximos 30 dias. Como abordar (trecho): problema é operação, não aquisição. Não vender mídia; vender processo e capacidade de entrega.

3. Cleiton Souza — CS Reformas — 58 · Morno · não contatado · há 3 dias Respostas: presto o serviço sozinho · R$ 5 a 20 mil · indicação · chegam poucos leads · nenhum tempo dedicado · nos próximos 30 dias. Como abordar (trecho): tem entrega boa e zero aquisição estruturada. Ganho rápido possível, mas orçamento apertado — começar pelo menor passo.

4. Priscila Nunes — Nunes Consultoria — 41 · Morno · não contatada · há 5 dias Respostas: consultoria ou mentoria · até R$ 5 mil · conteúdo e redes sociais · converso com gente boa, mas fecho pouco · de 2 a 5 horas · nos próximos 3 meses. Como abordar (trecho): produz conteúdo, atrai audiência e trava na conversa de venda. Sem urgência e com caixa curto: nutrir antes de propor.

5. Diego Martins — Autônomo — 22 · Frio · não contatado · há 8 dias Respostas: ainda estou começando · ainda não faturo · não tem caminho definido · chegam poucos leads · nenhum tempo dedicado · só estou pesquisando. Como abordar (trecho): não tem operação nem caixa. Não gastar tempo em call; mandar material e deixar amadurecer.


7. Como a IA trabalha

Existe uma única chamada de IA por lead, feita logo depois de o lead ser gravado. Ela produz de uma vez o diagnóstico público, a nota, a temperatura e o resumo interno. Não há segunda chamada, nem IA em nenhuma outra parte do sistema.

7.1 O que ela recebe

  • O primeiro nome do lead e o nome da empresa (só para personalizar o texto).
  • As seis perguntas com o enunciado atual e a opção escolhida em cada uma.
  • Uma descrição curta e fixa de quem é o dono e o que ele vende, para o diagnóstico não dar conselhos genéricos.
  • As regras de pontuação e o formato exato da resposta.

Não recebe e-mail nem WhatsApp.

7.2 O que ela devolve

Um bloco estruturado com estes campos, todos obrigatórios:

  • nota — inteiro de 0 a 100
  • temperatura — quente, morno ou frio
  • titulo — uma frase de até 70 caracteres
  • onde_voce_esta — dois parágrafos curtos
  • o_que_esta_travando — dois parágrafos curtos
  • passos — exatamente três, cada um com título de até 40 caracteres e explicação de duas linhas
  • contexto_interno — uma linha resumindo a situação
  • pontos_de_abordagem — exatamente três frases
  • primeira_mensagem — uma mensagem de WhatsApp de até 400 caracteres, em português casual, sem formalidade e sem parecer robô
  • objecao_provavel — uma frase
  • o_que_evitar — uma frase

7.3 Critérios de pontuação

A nota é a soma de cinco blocos, num total de 100 pontos:

Bloco Peso Como pontua
Capacidade de investir (pergunta 2) 30 Acima de R$ 50 mil: 30 · R$ 20 a 50 mil: 26 · R$ 5 a 20 mil: 16 · Até R$ 5 mil: 7 · Não fatura: 0
Urgência (pergunta 6) 25 Agora: 25 · 30 dias: 18 · 3 meses: 8 · Pesquisando: 0
Clareza e fit da dor (pergunta 4) 20 Leads fora do perfil: 20 · Fecho pouco: 18 · Poucos leads: 15 · Margem ruim: 10 · Entrega é gargalo: 8
Maturidade de aquisição (perguntas 3 e 5) 15 Até 8 pontos pelo canal (anúncios 8, prospecção 7, conteúdo 6, indicação 4, sem caminho 1) e até 7 pelo tempo dedicado (alguém dedicado 7, mais de 5h 6, 2 a 5h 4, até 2h 2, nenhum 0)
Estágio do negócio (pergunta 1) 10 Agência com equipe: 10 · Consultoria ou mentoria: 8 · Presta sozinho: 6 · Começando: 1

Temperatura, sem exceção: quente de 70 a 100, morno de 40 a 69, frio de 0 a 39.

A IA não inventa a nota: ela aplica essa tabela e soma. Se a conta dela divergir do que a tabela manda, o sistema recalcula a nota e a temperatura pela tabela e ignora os valores devolvidos. O texto do diagnóstico é sempre o da IA.

7.4 Regras de escrita do diagnóstico

  • Falar com "você", em português brasileiro direto.
  • Nada de elogio vazio, nada de "parabéns por dar esse passo".
  • Nunca citar a nota, a temperatura ou o fato de o lead estar sendo qualificado.
  • Nunca prometer resultado com número ou prazo garantido.
  • Os três passos precisam ser executáveis pela própria pessoa, sem contratar ninguém. O convite à conversa fica por conta da tela, não do texto.
  • Se as respostas indicarem alguém que está começando e não fatura, o diagnóstico continua útil e honesto: aponta o primeiro passo real, sem enrolar.

7.5 Exemplo completo

Entrada

Nome: Marina · Empresa: Estúdio Marina Alves

  1. Como você vende hoje? → Tenho uma agência ou equipe entregando
  2. Faturamento médio nos últimos 3 meses? → Entre R$ 20 mil e R$ 50 mil por mês
  3. De onde vêm os clientes? → Indicação e boca a boca
  4. Maior problema hoje? → Chegam leads, mas fora do perfil
  5. Tempo por semana atraindo clientes? → Até 2 horas
  6. Quando quer resolver? → Agora, é urgente

Conta: 26 + 25 + 20 + (4 + 2) + 10 = 87 → quente

Saída

  • nota: 87
  • temperatura: quente
  • titulo: Você não tem problema de volume, tem problema de filtro
  • onde_voce_esta: "O Estúdio Marina Alves chegou à faixa de R$ 20 a 50 mil por mês vivendo de indicação. Isso quer dizer que a entrega é boa o bastante para as pessoas falarem de você — poucos negócios de serviço chegam aí sem isso. / Só que o boca a boca traz quem aparecer. Você não escolhe o cliente: ele te escolhe. E com duas horas por semana dedicadas a atrair, não sobra tempo para consertar isso."
  • o_que_esta_travando: "O gargalo não é quantidade de contato, é ausência de critério. Todo mundo que chega entra na sua agenda, e boa parte não tinha como fechar desde o primeiro minuto. / Cada conversa dessas custa uma hora sua e da sua equipe. É por isso que a sensação é de correria sem crescimento proporcional."
  • passos:
    1. Escreva quem é o cliente certo — Em uma página, defina faturamento mínimo, tipo de negócio e o problema que você resolve melhor. Sem isso escrito, ninguém consegue filtrar.
    2. Coloque um filtro antes da agenda — Nenhuma reunião sem um formulário curto respondido antes. Três perguntas já cortam a maior parte de quem não tem fit.
    3. Peça indicação com endereço — Volte nos seus cinco melhores clientes e peça indicação descrevendo exatamente o perfil que você quer. Indicação dirigida traz gente parecida com quem já dá certo.
  • contexto_interno: Agência de R$ 20 a 50 mil/mês, dependente de indicação, sofrendo com lead desqualificado e com urgência declarada.
  • pontos_de_abordagem: "Tem caixa e pressa — dá para propor algo estruturado, não um teste." · "A dor real é tempo perdido em call ruim; traduza isso em horas e dinheiro." · "Ela só tem 2h por semana, então a solução precisa rodar sem ela."
  • primeira_mensagem: "Oi Marina, vi seu diagnóstico aqui. Chamou atenção uma coisa: sua agência já fatura bem só na indicação, mas você tá gastando as poucas horas que sobram atendendo gente fora do perfil. Isso tem conserto rápido e não depende de você aparecer mais. Consegue 20 min essa semana pra eu te mostrar como?"
  • objecao_provavel: Vai dizer que não tem tempo agora para implementar nada.
  • o_que_evitar: Sugerir anúncios ou aumento de volume de leads — o problema dela é o oposto.

8. Regras que não são óbvias

Gravação e perda de dados

  1. Enquanto a pessoa responde as perguntas e digita os dados, nada vai para o servidor. As respostas ficam só na memória da aba.
  2. Não existe rascunho, sessão salva, retomada ou salvamento parcial. Atualizar a página, fechar a aba ou perder a conexão zera tudo e a pessoa recomeça da capa.
  3. Voltar e avançar dentro do fluxo mantém as respostas, porque elas continuam na mesma tela aberta.
  4. O envio grava tudo de uma vez: dados de contato e as seis respostas. A gravação acontece antes da chamada de IA, para que uma falha da IA nunca faça o lead se perder.
  5. O texto do enunciado e da opção escolhida é copiado para dentro do registro do lead no momento do envio. Editar as perguntas depois não muda o que está gravado nos leads antigos.

IA e falhas

  1. Limite de 30 segundos para a IA responder. Estourou, o lead fica como "sem diagnóstico".
  2. Se a IA responder fora do formato esperado, o sistema tenta uma vez mais automaticamente. Falhando de novo, o lead fica como "sem diagnóstico".
  3. "Sem diagnóstico" é um quarto rótulo, cinza, que aparece acima de todos na lista, porque é uma pendência do dono, não uma classificação do lead.
  4. O dono pode gerar o diagnóstico depois, pelo detalhe do lead, quantas vezes quiser. Cada geração substitui a anterior por inteiro.
  5. Nota e temperatura são sempre calculadas pela tabela da seção 7.3, mesmo quando a IA devolve outro número.

Privacidade e visibilidade

  1. O lead vê apenas o próprio diagnóstico. Nota, temperatura, resumo interno e a existência do painel nunca aparecem para ele.
  2. O diagnóstico não tem link permanente nem pode ser reaberto. Só existe naquela tela, naquele momento.
  3. Todo o painel exige login. Sem sessão válida, qualquer endereço do painel joga para a tela de entrar.
  4. Existe um único login. Não há cadastro público, convite, ou recuperação de senha na versão 1 — a senha é trocada direto na configuração do sistema.
  5. A sessão do painel dura 30 dias sem uso; depois disso pede login de novo. O botão Sair encerra na hora.

Leads repetidos e abuso

  1. O mesmo e-mail pode responder quantas vezes quiser. Cada envio vira um lead novo e independente; nada é sobrescrito.
  2. A partir do segundo envio de um mesmo e-mail, o lead ganha a etiqueta "repetido" na lista.
  3. Limite de 5 envios por hora pelo mesmo navegador. Excedido, o envio é bloqueado com a mensagem da seção 6.4 e nada é gravado.

Dados e formatos

  1. Os quatro campos de contato são obrigatórios. Empresa aceita texto livre — quem não tem escreve "Autônomo", como o próprio erro sugere.
  2. O e-mail é validado só pelo formato; não há confirmação por link.
  3. O WhatsApp aceita 10 ou 11 dígitos com DDD e é guardado só com números.
  4. Todas as datas usam o fuso de Brasília e o formato dia/mês/ano. Na lista, envios de menos de 24 horas aparecem como "há 3 horas".
  5. O sistema é só em português do Brasil e só em real.

Painel

  1. A ordenação da lista é fixa e não pode ser mudada pelo dono: sem diagnóstico, quentes, mornos, frios; dentro de cada faixa, maior nota primeiro; empate, mais recente primeiro.
  2. A busca ignora maiúsculas e acentos e olha nome, e-mail, empresa e telefone.
  3. A lista carrega 25 leads por vez.
  4. Marcar contato é um interruptor: pode ser desmarcado, com confirmação. Guarda a data em que foi marcado.
  5. Excluir um lead apaga tudo dele de vez, com confirmação por escrito. Não existe lixeira nem desfazer.
  6. Os cinco leads de exemplo somem juntos e para sempre quando o dono clicar em remover. Não voltam.
  7. As seis perguntas têm quantidade fixa: dá para trocar o texto do enunciado e das opções, nunca acrescentar, remover ou reordenar.
  8. Limites de texto: enunciado até 120 caracteres, cada opção até 60. Nenhum campo pode ficar vazio.
  9. Salvar as perguntas é tudo ou nada: se um campo estiver inválido, nenhum é salvo.

Decisões tomadas por falta de definição

  1. As perguntas avançam sozinhas ao clicar na opção, em vez de exigir um botão "próxima" — menos cliques, e o botão Voltar cobre a correção.
  2. Uma chamada de IA só, que produz diagnóstico e resumo interno juntos: metade do custo e da espera de duas chamadas.
  3. Sem caixa de aceite de termos na tela de dados. O aviso de privacidade em texto já cumpre o papel e o envio é o consentimento.
  4. Os botões de WhatsApp abrem o aplicativo por link comum. Isso não é integração: o sistema não envia nada, só abre a conversa.
  5. Sem exportação, sem relatório e sem gráfico na versão 1. A lista com filtros resolve o uso real de uma operação com um só dono.
  6. Sem tela de configurações. O que o dono edita são as perguntas; o resto é definido na montagem do sistema.

9. O que fica para uma próxima versão

Só entra aqui o que depende de serviço externo ou é outro produto.

  1. E-mail — enviar o diagnóstico para o lead, avisar o dono quando cair um lead quente, e recuperação de senha do painel. Tudo isso exige um serviço de envio de e-mail.
  2. WhatsApp automático — disparar a primeira mensagem sozinho e registrar a resposta, via API oficial ou Evolution API.
  3. CRM — empurrar o lead qualificado para um funil externo e sincronizar o status de contato.
  4. Pagamento e planos — cobrança recorrente para transformar isso em produto vendido a terceiros.
  5. Versão multi-conta — cada cliente com a própria página, próprias perguntas, próprio painel e marca. É outro produto, com outra arquitetura, não uma evolução deste.
  6. Pixels e conversão em anúncio — mandar o evento de lead qualificado de volta para Meta e Google para otimizar campanha.

Decisões que tomei por conta própria

Estão todas registradas na seção 8, itens 33 a 38, e mais estas, tomadas dentro das outras seções:

  • Conteúdo das seis perguntas e das opções — escolhidas para medir capacidade de investir, urgência, dor, maturidade de aquisição e estágio, que são os cinco eixos da nota.
  • Tabela de pontuação e faixas de temperatura — quente a partir de 70, morno de 40 a 69, frio abaixo de 40; a soma é determinística e a IA não pode contrariá-la.
  • Rótulo "sem diagnóstico" como quarto estado, no topo da lista, em vez de dar nota zero a quem teve falha técnica.
  • Gravar o lead antes de chamar a IA, para que uma falha nunca custe um contato.
  • Lead repetido vira registro novo com etiqueta, em vez de atualizar o anterior.
  • Limite de 5 envios por hora por navegador como proteção mínima contra abuso.
  • Excluir lead existe, porque a base vai encher de testes na primeira semana.
  • Cinco leads de exemplo aparecem por padrão e só somem quando o dono mandar, para o painel nunca nascer vazio.
  • Diagnóstico sem link permanente, coerente com a regra de não salvar nada do lado do visitante.
  • Formato dos textos da IA: três blocos e exatamente três passos no diagnóstico público; contexto, três pontos, primeira mensagem, objeção e o que evitar no resumo interno.

schema-qualificador.prisma

// Gerado pelo Prompt 2 na mesma conversa do PRD, sem correção.
// Sete tabelas: Question, QuestionOption, Lead, LeadAnswer, Diagnosis, DiagnosisStep, Settings.

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

// ---------------------------------------------------------------------------
// Enums
// ---------------------------------------------------------------------------

/// Identidade estável de cada uma das 6 perguntas.
/// O texto é editável no painel; a chave nunca muda, porque a lógica de
/// pontuação e a leitura das respostas dependem dela.
enum QuestionKey {
  SELLING_MODE // 1. Como você vende hoje?
  REVENUE // 2. Faturamento médio dos últimos 3 meses
  ACQUISITION_CHANNEL // 3. De onde vêm os clientes
  MAIN_PROBLEM // 4. Maior problema hoje
  TIME_INVESTED // 5. Tempo por semana atraindo clientes
  URGENCY // 6. Quando quer resolver
}

/// Faixas fixas do PRD 7.3: 70-100 HOT, 40-69 WARM, 0-39 COLD.
enum Temperature {
  HOT
  WARM
  COLD
}

/// NO_DIAGNOSIS é o quarto rótulo do painel: o lead foi gravado, mas a IA
/// falhou ou estourou o tempo. Esses leads vão para o topo da lista.
enum LeadStatus {
  NO_DIAGNOSIS
  DIAGNOSED
}

enum ContactStatus {
  NOT_CONTACTED
  CONTACTED
}

// ---------------------------------------------------------------------------
// Conteúdo editável
// ---------------------------------------------------------------------------

model Question {
  id          String      @id @default(cuid())
  key         QuestionKey @unique
  position    Int         @unique // 1 a 6, fixo
  text        String // enunciado atual, editável no painel (máx. 120)
  defaultText String // texto de fábrica, usado em "Restaurar textos originais"
  maxPoints   Int // teto do bloco desta pergunta na tabela de nota
  createdAt   DateTime    @default(now())
  updatedAt   DateTime    @updatedAt

  options QuestionOption[]
  answers LeadAnswer[]

  @@index([position])
}

model QuestionOption {
  id          String   @id @default(cuid())
  questionId  String
  code        String // identidade estável da opção (ex.: "ABOVE_50K")
  position    Int // ordem de exibição dentro da pergunta
  text        String // texto atual, editável no painel (máx. 60)
  defaultText String // texto de fábrica
  points      Int      @default(0) // pontos que esta opção soma na nota
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt

  question Question     @relation(fields: [questionId], references: [id], onDelete: Cascade)
  answers  LeadAnswer[]

  @@unique([questionId, code])
  @@unique([questionId, position])
}

// ---------------------------------------------------------------------------
// Leads
// ---------------------------------------------------------------------------

model Lead {
  id       String @id @default(cuid())
  name     String
  email    String
  company  String
  whatsapp String // só dígitos, 10 ou 11 com DDD

  /// Identificador do navegador que enviou. Usado só para o limite de
  /// 5 envios por hora (PRD 8.18). Não identifica pessoa.
  browserId String

  score       Int? // nulo enquanto não houver diagnóstico
  temperature Temperature? // nulo enquanto não houver diagnóstico

  status        LeadStatus    @default(NO_DIAGNOSIS)
  contactStatus ContactStatus @default(NOT_CONTACTED)
  contactedAt   DateTime?

  /// Segundo envio ou mais do mesmo e-mail (PRD 8.17).
  isRepeat Boolean @default(false)

  /// Lead de demonstração; some junto com os outros em "Remover exemplos".
  isExample Boolean @default(false)

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  answers   LeadAnswer[]
  diagnosis Diagnosis?

  @@index([temperature, score, createdAt])
  @@index([status])
  @@index([contactStatus])
  @@index([email])
  @@index([browserId, createdAt])
  @@index([isExample])
}

/// Uma linha por pergunta respondida. Guarda o texto da pergunta e da opção
/// como estavam no momento do envio (PRD 8.5): editar as perguntas depois
/// não altera leads antigos.
model LeadAnswer {
  id           String   @id @default(cuid())
  leadId       String
  questionId   String
  optionId     String
  position     Int // 1 a 6, copiado da pergunta no envio
  questionText String
  optionText   String
  points       Int
  createdAt    DateTime @default(now())
  updatedAt    DateTime @updatedAt

  lead     Lead           @relation(fields: [leadId], references: [id], onDelete: Cascade)
  question Question       @relation(fields: [questionId], references: [id], onDelete: Restrict)
  option   QuestionOption @relation(fields: [optionId], references: [id], onDelete: Restrict)

  @@unique([leadId, questionId])
  @@index([leadId, position])
}

// ---------------------------------------------------------------------------
// Saída da IA
// ---------------------------------------------------------------------------

/// Resultado da única chamada de IA. Gerar de novo substitui o registro
/// inteiro (PRD 8.9), por isso é 1-para-1 com o lead.
model Diagnosis {
  id     String @id @default(cuid())
  leadId String @unique

  // Parte pública (T5)
  title          String // máx. 70 caracteres
  whereYouAre    String @db.Text
  whatIsBlocking String @db.Text

  // Parte interna (T9) — nunca exibida ao lead
  internalContext String   @db.Text
  approachPoints  String[] // exatamente 3 frases
  firstMessage    String   @db.Text // máx. 400 caracteres
  likelyObjection String
  whatToAvoid     String

  /// Quantas vezes a IA foi executada para este lead.
  generationCount Int      @default(1)
  createdAt       DateTime @default(now())
  updatedAt       DateTime @updatedAt

  lead  Lead            @relation(fields: [leadId], references: [id], onDelete: Cascade)
  steps DiagnosisStep[]
}

/// Os três passos do bloco "Por onde começar".
model DiagnosisStep {
  id          String   @id @default(cuid())
  diagnosisId String
  position    Int // 1, 2, 3
  title       String // máx. 40 caracteres
  text        String   @db.Text
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt

  diagnosis Diagnosis @relation(fields: [diagnosisId], references: [id], onDelete: Cascade)

  @@unique([diagnosisId, position])
}

// ---------------------------------------------------------------------------
// Configuração
// ---------------------------------------------------------------------------

/// Linha única. Guarda o que o PRD trata como "definido na montagem":
/// textos da capa, WhatsApp do dono e o contexto de negócio do prompt.
model Settings {
  id        String  @id @default(cuid())
  singleton Boolean @unique @default(true)

  companyName     String
  ownerWhatsapp   String // destino do botão "Falar no WhatsApp"
  whatsappPrefill String // mensagem já escrita no link do lead

  publicTitle    String
  publicSubtitle String
  publicBenefits String[] // 3 itens abaixo do botão da capa
  publicFooter   String

  /// Descrição fixa de quem é o dono e o que ele vende, enviada à IA.
  aiBusinessContext String @db.Text

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}