Menuabrir
MVPAtualizado em 14 de mai. de 2026, 00:06

Este módulo depende de

2
  • crmCria contato automaticamente quando form é submetido
  • attributionResolve UTM no submit pra atribuição de conversão

Módulos que dependem deste

0

Nenhum módulo depende deste hoje.

Forms

Status: 🔵 MVP (formulários públicos com submissão; sem tools no Conselho ainda) Code: backend/app/modules/forms UI: frontend/src/app/(admin)/[slug]/admin/forms + frontend/src/app/(public)/f Última revisão deste doc: 2026-05-13 por Felipe + Claude


1. Identidade

O que faz (uma frase)

Formulários públicos (lead capture, auto-avaliação, feedback aulas) com submissões persistidas — versão simples (não-LGPD-pesada como Surveys/NR-01) que cria contato CRM automaticamente.

Por que existe (negócio)

Lead capture na landing page → form Mandir → CRM contato resolve UTM → attribution. Sem este módulo, Felipe usaria Tally/Typeform externo sem cruzamento.

Comparação:

  • Forms (este módulo): simples, lead capture, sem instrumentos psicométricos.
  • Surveys: complexo, modo anônimo, biblioteca instrumentos, devolutivas IA.
  • NR-01: anti-PII radical, schema enforce.

Status atual

MVP em prod. Funcional pra lead capture básico.

Lacuna conhecida: sem tools no Conselhoforms está no scope de vários conselheiros (CEO, Strategy, Operations, etc.), mas cross_module.py não tem read_forms_*. Conselheiro tem permissão mas não tem instrumento → responde "vou checar" mas não pode (memória do session: Felipe perguntou "@conselho analise os formulários" e CEO respondeu honestamente que não tem como).

Próxima mudança: implementar tools no Conselho — read_forms_list, read_form_responses, aggregate_form_question.


2. Cases de uso reais

Case 1: Lead form na landing

Landing chama <iframe src="https://app.mandir.com.br/f/lead-mentoria"> → user submete (email, name, phone) → backend cria forms_submission → resolve UTM → cria crm_contact (lifecycle=lead) → email confirmação.

Case 2: Auto-avaliação pré-aula

Aluno responde form pré-yoga → submission persistida → não cria CRM contato (member já existe) → resposta pode alimentar prep do facilitator.


3. Oportunidades de negócio

  • Forms premium com lógica condicional (skip-logic).
  • Forms + email automático (sequence trigger via webhook).
  • Forms + signup form Email Module unificar.
  • Tools no Conselho — primeira coisa a fazer pra fechar lacuna.

4. Arquitetura interna

Arquivos

Tasks

Sem Celery.


5. Tabelas (2)

forms_form

ColunaNotas
tenant_id
slugUNIQUE per tenant — public URL
name / description
fields (JSONB)Schema dos campos
is_active
submit_countCache

forms_submission

ColunaNotas
form_idFK CASCADE
data (JSONB)Respostas
crm_contact_idVinculado se contato criado
submitted_at
ip / user_agent

Relacionamentos cross-módulo

DireçãoOutro móduloComo
↘ Escrevecrm_contactCria contato se email não existe
↗ LêattributionUTM resolution on-create

6. API / Endpoints (5)

Prefixo /api/forms.

Admin

MétodoRotaO que faz
GET/formsLista
POST/formsCriar
GET/forms/{id}Detalhe
PATCH/forms/{id}Update
DELETE/forms/{id}Soft-delete

Público

MétodoRotaAuthO que faz
POST/forms/{slug}/submitPúblicoCria submission + CRM contact

7. Limitações e débitos técnicos

#ItemPlano
1Sem tools no ConselhoPrioridade alta — implementar read_forms_*
2Sem skip-logicRoadmap
3Sem analytics dedicadoBeat sumarização (TBD)
4Sem integração com email sequenceWebhook opcional (TBD)

8. Histórico

MVP em prod. Lacuna no Conselho é débito conhecido (descoberto em sessão 2026-05-13).