Versão 2026-09-07 · atualizado em 22/08/2026
Rascunho em revisão jurídica. Este texto ainda não foi revisado por advogado e pode mudar antes do lançamento. Os campos marcados como a definir serão preenchidos com os dados da empresa.
Fluxo de menores — regras e copy
0. A regra que não pode ser quebrada
A idade é decidida no servidor. Sempre.
O front não tem if (idade < 12). Ele coleta a data de nascimento, manda para a API e renderiza o que a API responder. A checagem local existe apenas como feedback instantâneo de formulário (para o campo não deixar digitar uma data futura, por exemplo) — nunca como porta.
front: coleta birthDate → API: calcula ageBand no servidor (timezone do usuário)
→ responde { ageBand: 'under_12' | 'teen_12_17' | 'adult' , ... }
→ front: renderiza a tela correspondente
ageBand também vem no GET /me e é o que decide, na UI, se aparece o aviso de responsável, se o toggle de ranking existe e se o checkout pede os dados do responsável. Nada disso é inferido no cliente a partir de birthDate.
Faixas
ageBand |
Idade | O que acontece |
|---|---|---|
under_12 |
< 12 anos | Conta não é criada. Tela de bloqueio acolhedora + orientação ao responsável |
teen_12_17 |
12–17 anos | Conta criada. Aviso de responsável + campo opcional de e-mail do responsável. Perfil privado, ranking desligado, sem session replay |
adult |
≥ 18 anos | Fluxo normal |
Recalcular ageBand a cada request que dependa dele (a pessoa faz aniversário): é derivado de birth_date, nunca armazenado como flag.
1. Cadastro — campo de data de nascimento
1.1 Onde fica
Segundo passo do cadastro, junto com o nome de exibição — depois do e-mail/senha, para não parecer interrogatório na primeira tela. Um campo, três selects (dia / mês / ano) ou input type="date" com máscara; nunca um date picker de calendário que obriga a navegar 17 anos para trás.
1.2 Copy
Rótulo
Data de nascimento
Texto de apoio (sempre visível, abaixo do campo)
Pedimos para saber quais regras de proteção se aplicam a você. Não aparece no seu perfil.
Placeholder
DD/MM/AAAA
Erros de validação (client-side, feedback imediato)
| Situação | Mensagem |
|---|---|
| Vazio | Preencha sua data de nascimento para continuar. |
| Formato inválido | Data inválida. Use o formato DD/MM/AAAA. |
| Data no futuro | Essa data ainda não chegou. Confira o ano. |
| Ano absurdo (< 1900) | Confira o ano de nascimento. |
Erro vindo da API (código VALIDATION): renderizar error.message como veio. Nada de tradução no front.
1.3 Acessibilidade
aria-describedbyligando o campo ao texto de apoio.- Erro anunciado com
aria-live="polite". - Ordem de tabulação: dia → mês → ano → continuar.
2. Menos de 12 anos — tela de bloqueio
Dispara quando a API responde ageBand: 'under_12' no cadastro. A conta não é criada e nenhum dado além do necessário para o bloqueio é gravado.
2.1 Regras
- Tela cheia, sem header do app, com botão de voltar.
- Não oferecer "tentar de novo" nem um campo para editar a data ali mesmo — isso ensina a mentir a idade. Se a pessoa errou a digitação, ela volta e refaz o cadastro do começo.
- Não pedir e-mail do responsável nesta tela (não temos como validar e coletar dado de criança para isso seria pior).
- Oferecer saída útil: material público de estudo, sem login.
- Registrar evento anônimo no PostHog (
signup_blocked_age), sem nenhum dado pessoal.
2.2 Copy
Ilustração/ícone: neutro e amigável — nada de cadeado vermelho ou cara de bravo.
Título
Ainda não é hora
Corpo
O Gabarita foi feito para quem está se preparando para o ENEM, e por isso só aceita contas a partir dos 12 anos. É uma regra de proteção de dados de crianças, não uma implicância com você.
A boa notícia: estudar aqui não precisa de conta. Você pode ver questões do ENEM e as explicações agora mesmo, sem cadastro.
Ação principal
Ver questões sem conta
Ação secundária (link)
Voltar
Bloco para o responsável (card discreto no rodapé da tela)
É o responsável por esta criança? A lei brasileira (LGPD, art. 14, e ECA Digital) exige cuidado redobrado com dados de menores de 12 anos, e nós preferimos não coletar esses dados a coletar mal. Se quiser conversar sobre isso, escreva para contato@gabaritaapp.com.br.
2.3 O que não escrever
- ❌ "Você é muito novo" / "Volte quando crescer" — condescendente.
- ❌ "Acesso negado" / "Proibido" — soa punitivo para quem não fez nada errado.
- ❌ "Peça para um adulto criar a conta por você" — isso é convite explícito para burlar a regra e nos coloca em situação pior, não melhor.
3. De 12 a 17 anos — aviso e e-mail do responsável
Dispara quando a API responde ageBand: 'teen_12_17'. A conta é criada normalmente. Este passo é informativo e o campo é opcional — nada bloqueia o cadastro aqui.
3.1 Regras
- Aparece como último passo do cadastro, antes de cair na Home.
- Checkbox de ciência: obrigatório marcar para concluir. Gera
consents.kind = 'guardian'com a versão do texto. - Campo de e-mail do responsável: opcional, com botão "Pular por agora" igualmente visível (mesmo peso visual do botão principal — não é dark pattern ao contrário: é um campo genuinamente opcional).
- Se o e-mail for preenchido, enviar um e-mail informativo ao responsável (não é pedido de autorização, é aviso), e nunca mais escrever para ele sem novo motivo.
- O e-mail do responsável não é usado para marketing. Nunca.
- Ao concluir, aplicar automaticamente e sem perguntar: perfil privado, ranking desligado, session replay desligado.
3.2 Copy
Título
Uma coisa rápida antes de começar
Corpo
Como você tem menos de 18 anos, a lei brasileira pede que seu pai, sua mãe ou seu responsável saiba que você usa o Gabarita.
Já deixamos sua conta no modo mais protegido: perfil privado, fora de qualquer ranking e zero publicidade — aqui não existe anúncio para ninguém, e para menores de 18 também não existe gravação de tela.
Checkbox (obrigatório)
Meu responsável sabe que eu uso o Gabarita e concorda com os Termos de Uso e a Política de Privacidade.
Campo opcional
E-mail do responsável (opcional) Se você informar, mandamos um e-mail contando o que é a plataforma e como ele pode acompanhar. Só isso — nada de propaganda.
Placeholder:
email@exemplo.com
Ações
Continuar·Pular por agora
Link discreto
Ler a versão curta da política de privacidade, escrita para quem tem 12 a 17 anos → /legal/privacidade-adolescentes
Erros
| Situação | Mensagem |
|---|---|
| Checkbox não marcado | Marque a confirmação para continuar. |
| E-mail do responsável inválido | Esse e-mail não parece válido. Confira ou deixe em branco. |
| E-mail do responsável igual ao seu | Use o e-mail do seu responsável, diferente do seu. |
3.3 E-mail enviado ao responsável (Resend)
Assunto: Seu filho(a) está estudando para o ENEM no Gabarita
Corpo:
Olá,
{{nome_do_aluno}} informou este e-mail como o do responsável ao criar uma conta no Gabarita, uma plataforma gratuita de estudo para o ENEM.
O que você precisa saber:
- A conta está no modo mais protegido: perfil privado, fora de rankings, sem publicidade de nenhum tipo e sem gravação de tela.
- Coletamos o mínimo: nome, e-mail, data de nascimento e o desempenho nos estudos.
- O banco de questões é gratuito e ilimitado. Existe um produto pago opcional (Passe ENEM), e qualquer compra por menor de 18 anos exige os seus dados no pagamento.
- As redações escritas são corrigidas por inteligência artificial e nunca são usadas para treinar modelos.
O que você pode fazer: pedir acesso, correção ou exclusão dos dados a qualquer momento, escrevendo para privacidade@gabaritaapp.com.br.
Política de privacidade completa: https://gabaritaapp.com.br/legal/privacidade
Se você não conhece esta pessoa ou acha que houve engano, responda este e-mail e resolvemos.
— Equipe Gabarita
Rodapé: este é um aviso único. Não vamos enviar outros e-mails para este endereço, exceto sobre uma compra feita com os seus dados.
4. Checkout de quem tem menos de 18 — dados do responsável
Dispara quando ageBand !== 'adult' no GET /me/entitlements / GET /me. A API recusa um POST /billing/checkout sem guardian quando o usuário é menor — o front só antecipa a tela para a pessoa não bater na parede.
4.1 Regras
- Passo antes da escolha de Pix/cartão, não depois. Ninguém deve ver um QR Code e só então descobrir que precisa chamar a mãe.
- Campos: nome completo, CPF, e-mail do responsável. Nada além disso.
- CPF: máscara
000.000.000-00, validação de dígito verificador no cliente (feedback) e no servidor (regra). O CPF não é gravado no nosso banco — segue direto para o Asaas na criação docustomer. Verdocs/07§7. - A NFS-e é emitida em nome do responsável e enviada ao e-mail dele.
- Registrar
consents.kind = 'guardian'com a versão do texto de assistência e o momento do aceite. - Não pré-preencher o CPF com nada. Não guardar em
localStorage. - Se a compra for retomada depois (Pix expirado, por exemplo), pedir os dados de novo — não guardamos.
4.2 Copy
Título da tela
Dados do responsável
Subtítulo
Você tem menos de 18 anos, então a compra precisa ser feita com a assistência de um responsável legal. É exigência do Código Civil, vale para qualquer compra na internet.
Bloco de contexto (card informativo, antes dos campos)
Chame quem vai te ajudar agora. Vamos precisar do nome completo, do CPF e do e-mail do seu pai, mãe ou responsável. A nota fiscal sai no nome dele e o comprovante vai para o e-mail dele.
Campos
| Campo | Rótulo | Texto de apoio |
|---|---|---|
| Nome | Nome completo do responsável |
— |
| CPF | CPF do responsável |
Usado só para emitir a nota fiscal. Não guardamos esse número. |
E-mail do responsável |
O comprovante e a nota fiscal vão para cá. |
Checkbox (obrigatório)
Declaro que meu responsável legal está ciente desta compra e a autoriza, e que os dados acima são dele.
Ação principal
Continuar para o pagamento
Ação secundária
Voltar
Erros
| Situação | Mensagem |
|---|---|
| Nome vazio ou com uma palavra só | Escreva o nome completo do responsável. |
| CPF inválido | CPF inválido. Confira os números. |
| E-mail inválido | Esse e-mail não parece válido. |
| E-mail igual ao da conta do aluno | Use o e-mail do seu responsável, diferente do seu. |
| Checkbox não marcado | Marque a confirmação para continuar. |
API recusou (FORBIDDEN) |
renderizar error.message da API |
4.3 Estado "adulto"
Para ageBand: 'adult', esta tela não existe: vai direto para a escolha de Pix/cartão. Nada de mostrar e desabilitar.
5. Padrões de privacidade da conta de menor
Aplicados pelo backend no momento da criação da conta, sem perguntar:
| Configuração | Valor para teen_12_17 |
Valor para adult |
|---|---|---|
| Perfil público | desligado | desligado (padrão para todos) |
| Participação em ranking / liga | desligado, com opt-in explícito | desligado, com opt-in |
| Cidade e escola visíveis | nunca | nunca (v1 não coleta) |
| Session replay (PostHog) | nunca | desligado por padrão |
| E-mails de marketing | só com opt-in explícito | só com opt-in explícito |
| Publicidade comportamental | inexistente no produto | inexistente no produto |
5.1 Copy do toggle de ranking (Configurações → Privacidade)
Rótulo
Participar dos rankings
Descrição (menor de 18)
Desligado. Se você ligar, seu nome de usuário aparece na tabela da sua liga para outros estudantes. Nada além disso aparece — nem sua idade, nem sua cidade, nem seu e-mail. Você pode desligar quando quiser.
Confirmação ao ligar (bottom sheet)
Seu nome de usuário vai aparecer para outras pessoas Só o nome de usuário e a pontuação da semana. Você pode desligar a qualquer momento e sair da tabela na hora.
Ligar ranking·Cancelar
5.2 Copy do bloco de privacidade no perfil
Seu perfil é privado. Ninguém vê seu desempenho, suas redações ou seus dados. Entenda o que fazemos com seus dados
6. Checklist de aceite (para o agente do web)
- Data de nascimento é campo obrigatório no cadastro, com texto de apoio explicando o porquê.
- Nenhuma decisão de idade acontece no cliente — o front só renderiza
ageBandvindo da API. -
under_12cai em tela de bloqueio com saída útil ("ver questões sem conta"), sem campo para reeditar a data ali. -
teen_12_17vê o aviso de responsável com checkbox obrigatório e campo de e-mail opcional com "Pular por agora" de mesmo peso visual. - Consentimento
guardiané registrado com versão do texto. - Checkout de menor mostra "Dados do responsável" antes da escolha da forma de pagamento.
- CPF do responsável não aparece em
localStorage, em log, em URL nem em evento de analytics. - Conta de menor nasce com perfil privado e ranking desligado; toggle de ranking tem confirmação explícita.
- Session replay do PostHog é desligado quando
ageBand !== 'adult'. - Todas as telas: mobile 360 px, dark mode, estados de loading/erro, foco visível e navegação por teclado.
- Eventos de analytics do fluxo (
signup_blocked_age,guardian_notice_shown,guardian_email_provided,guardian_checkout_shown) não carregam nenhum dado pessoal.
Pendências para o Yago / advogado
- Divergência nos docs:
docs/00§9 fala em "idade mínima 13" edocs/06§3 em "< 12 bloqueado, 12–17 permitido". Este documento segue odocs/06(fonte de verdade de LGPD) e a instrução da tarefa. Decidir e alinhar odocs/00. - Confirmar com o advogado o texto do checkbox de ciência do responsável (§3.2) e o da declaração de assistência no checkout (§4.2) — são os dois trechos com efeito jurídico direto.
- Definir se, no futuro (Fase 5), haverá painel do responsável; hoje o responsável exerce direitos por e-mail ao DPO.