Pular para o conteúdo

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-describedby ligando 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 do customer. Ver docs/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 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 ageBand vindo da API.
  • under_12 cai em tela de bloqueio com saída útil ("ver questões sem conta"), sem campo para reeditar a data ali.
  • teen_12_17 vê 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" e docs/06 §3 em "< 12 bloqueado, 12–17 permitido". Este documento segue o docs/06 (fonte de verdade de LGPD) e a instrução da tarefa. Decidir e alinhar o docs/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.