Documento de referência técnica e de produto. Atualizar sempre que houver
decisão relevante de arquitetura, escopo ou convenção.
Pequenos negócios, profissionais autônomos e agências pequenas têm dificuldade
para planejar, configurar, acompanhar e otimizar campanhas de marketing digital
de forma organizada e orientada a resultados.
A dor real, extraída da análise de demandas reais:
Pequenas empresas têm dificuldade para planejar, configurar, acompanhar e otimizar
suas campanhas de marketing digital de forma organizada e orientada a resultados.
Plataforma modular que apoia o ciclo completo:
| Item | Definição |
|---|---|
| Linguagem | PHP 8.2 |
| Banco | MySQL 8 + PDO; SQLite nos testes |
| Front | HTML5 + CSS3 + JS vanilla |
| Deps | Composer |
PHPMailer (drivers log/smtp) |
|
| Logs | Logger próprio (text/json) com rotação |
| Cache | Arquivo, TTL por namespace |
| Fila | Banco (fila_jobs) com retry exponencial |
| Ambiente dev | Debian 12 + XAMPP |
| Ambiente prod | Hospedagem compartilhada + PHP-FPM + MySQL |
| CI | GitHub Actions (PHP 8.1 e 8.2) |
Restrições importantes:
htdocs (/gestao-trafego). Toda URLbase_url() / asset() / asset_versioned()..env nativamente. Usamos vlucas/phpdotenv com safeLoad()..env, vendor/, logs/*, storage/* (exceto .gitkeep).Csp::nonce()).exit().Veja README.md para a árvore completa. Pontos-chave:
public/ é o document root. Só index.php e assets/ são públicos.app/Kernel/Application.php faz o bootstrap.config/container.php centraliza a DI.app/Helpers/functions.php (autoloaded via composer.json).database/migrations/, seeders em database/seeders/.tests/Unit/, tests/Feature/, tests/Support/.docs/.password_hash().Ordem em cada entrega:
| Fase | Escopo | Status |
|---|---|---|
| Sprint 0 | Bootstrap, estrutura, config, docs, git | ✅ |
| Sprint 1 | Auth (confirmação, reset) + Clientes | ✅ |
| Sprint 1.5 | Dashboard, Alert, UX mobile | ✅ |
| Sprint 2 | Canais + Campanhas | ✅ |
| Sprint 3 | Diagnóstico | ✅ |
| Sprint 4 | Planejamento | ✅ |
| Sprint 5 | Métricas | ✅ |
| Sprint 6 | Relatórios | ✅ |
| Sprint 7 | CRM de Leads | ✅ |
| Sprint 8 | Beta fechado: segurança, observabilidade, backups, deploy | ✅ |
| Sprint 9 | Feedback, telemetria, onboarding | ✅ |
| Sprint 10 | Performance (cache, índices) e export CSV | ✅ |
| Sprint 11 | Testes de feature, container, CI | ✅ |
| Sprint 12 | Segurança avançada: CSP, 2FA, auditoria, política de senha | ✅ |
| Sprint 13 | Observabilidade e operação: painel admin, alertas, backup verificado | ✅ |
| Sprint 14 | Importação de métricas via CSV | ✅ |
| Sprint 15 | Webhooks, fila assíncrona e retry | ✅ |
| Sprint 16 | Relatórios Avançados (comparativo, PDF, agendamento) | ⏭️ |
| Sprint 17 | Multi-tenant avançado (papéis, permissões, portal do cliente) | ⏭️ |
| Sprint 18 | PWA / Mobile First | ⏭️ |
main, develop, feature/*, hotfix/*, release/*.feat, fix, docs, chore, refactor, test, build, ci, perf, style).declare(strict_types=1) em todos os arquivos.clientes, campanhas, metricas, leads).<style> e <script>.exit() em controllers/middlewares/services.| Data | Decisão | Motivo |
|---|---|---|
| 2026-09-23 | PHP puro com MVC próprio | Stack do dev; MVP enxuto |
| 2026-09-23 | vlucas/phpdotenv com safeLoad |
Env em subpasta + prod com envs do sistema |
| 2026-09-23 | Driver de e-mail log/smtp |
Dev sem SMTP, prod com SMTP |
| 2026-09-23 | Logs em logs/ na raiz |
Fora do document root |
| 2026-09-23 | Roteador próprio com middlewares e rotas nomeadas | Cobre 100% do MVP sem framework |
| 2026-09-23 | Request::capture() remove prefixo via SCRIPT_NAME/URL_PATH |
Funciona em subpasta com ou sem .htaccess |
| 2026-09-23 | Views de erro 404/405/500 | UX consistente |
| 2026-09-23 | Migrations em SQL puro com .down.sql |
Simples, sem framework |
| 2026-09-23 | Database suporta MySQL e SQLite |
Testes rápidos sem MySQL local |
| 2026-09-23 | BaseRepository com $fillable/$guarded |
Previne mass-assignment |
| 2026-09-23 | Tokens com sha256 | Token bruto nunca armazenado |
| 2026-09-23 | Reset de senha reenvia confirmação se não validado | Atende regra do briefing |
| 2026-09-23 | Container com autowiring por reflexão | DI sem framework |
| 2026-09-24 | CRUD de clientes com isolamento por usuario_id |
Multi-tenant simples |
| 2026-09-24 | Formulários via POST (sem _method) |
Simplifica deploy |
| 2026-09-24 | Paginação com preservação de query string | Busca não perdida |
| 2026-09-24 | Componente Alert como fachada |
Elimina duplicação |
| 2026-09-25 | Canais como tabela (não enum) | Cores, ativação, ordenação configuráveis |
| 2026-09-25 | usuario_id denormalizado em campanhas |
Filtro rápido e isolamento em toda query |
| 2026-09-26 | Diagnóstico com motor de regras determinístico | Auditável, sem IA |
| 2026-09-26 | Perguntas + opções como JSON | Flexível |
| 2026-09-26 | Wizard com auto-avanço + persistência assíncrona | UX fluida |
| 2026-09-26 | Um diagnóstico "em andamento" por campanha | Sem duplicidade |
| 2026-09-27 | Plano gerado a partir do diagnóstico | Recomendações viram itens |
| 2026-09-27 | Itens com categoria + prioridade + ordem | Agrupamento e ordenação |
| 2026-09-27 | Marcação de item via AJAX | UX fluida |
| 2026-09-27 | Um lançamento por campanha/dia (UNIQUE) |
Evita duplicidade; upsert |
| 2026-09-27 | Cálculos derivados no Service | Testável |
| 2026-09-27 | Gráficos em SVG puro | Zero dependências |
| 2026-09-27 | Snapshot JSON por relatório | Imutabilidade |
| 2026-09-27 | Limite de 1 ano por relatório | Evita consultas longas |
| 2026-09-27 | Estágios de lead como enum fixo | Simplicidade |
| 2026-09-27 | Interações com tipo + descrição + timestamp | Auditabilidade |
| 2026-09-27 | Movimentação de estágio registra interação | Rastreabilidade |
| 2026-09-27 | Kanban com drag-and-drop nativo | Zero dependências |
| 2026-09-27 | campanha_id pode ser NULL em leads |
Origem nem sempre rastreável |
| 2026-09-28 | Rate limit em arquivo | Compatível com hospedagem compartilhada |
| 2026-09-28 | Logger próprio com rotação | Zero dependências |
| 2026-09-28 | CSP com unsafe-inline temporariamente (dev) |
DX; endurecer em prod |
| 2026-09-28 | HSTS só sob HTTPS | Evita travar dev |
| 2026-09-28 | Backup via mysqldump + tar |
Simples, auditável |
| 2026-09-28 | Feedback dentro do app | Contexto rico |
| 2026-09-28 | Eventos canônicos com lista fechada | Comparabilidade |
| 2026-09-28 | Telemetria via sendBeacon |
Não bloqueia navegação |
| 2026-09-28 | Onboarding derivado dos dados | Sem tabela dedicada |
| 2026-09-28 | Tour com localStorage |
Simples |
| 2026-09-29 | Cache em arquivo com TTL por namespace | Sem Redis em hospedagem compartilhada |
| 2026-09-29 | TTLs curtos (60–120s) | Tempo real + absorve picos |
| 2026-09-29 | Invalidação por namespace | Simples e correto |
| 2026-09-29 | CSV com ; e BOM UTF-8 |
Excel pt-BR |
| 2026-09-29 | Streaming por generator | Export sem estourar memória |
| 2026-09-29 | Paginação do Kanban por coluna | Sob demanda |
| 2026-09-29 | Container em config/container.php |
Application enxuto |
| 2026-09-29 | Testes de feature com SQLite in-memory | Rápidos, sem MySQL |
| 2026-09-29 | HttpClient simula requisições no processo |
Sem subir servidor |
| 2026-09-29 | Cobertura mínima 70% em Services/Repositories | Foco no negócio |
| 2026-09-29 | CI em GitHub Actions (PHP 8.1 e 8.2) | Detecção precoce |
| 2026-09-30 | CSP estrita em produção (nonce), frouxa em dev | Protege prod sem travar DX |
| 2026-09-30 | TOTP puro (sem libs) | Zero dependências |
| 2026-09-30 | 2FA opcional por usuário | Usuário escolhe |
| 2026-09-30 | Auditoria opt-in por repositório ($auditable) |
Sem custo em tabelas de alto volume |
| 2026-09-30 | Política de senha com lista embutida | Sem dependência externa |
| 2026-09-30 | Alertas por e-mail com deduplicação | Rastreável, evita spam |
| 2026-09-30 | Verificação de backup sem restaurar em MySQL | Roda em qualquer ambiente |
| 2026-09-30 | Logger com formato text/json |
Dev legível, prod para ELK/Loki |
| 2026-09-30 | Painel admin restrito por perfil ou ADMIN_USER_IDS |
Sem migration para promover |
| 2026-09-30 | Alertas silenciosos em APP_DEBUG=true |
Não poluir dev |
| 2026-09-30 | Importação de CSV em 4 etapas | Reduz erro humano |
| 2026-09-30 | Arquivo em storage/imports/ com hash |
Sobrevive entre requisições |
| 2026-09-30 | Upsert idempotente por (campanha_id, data) |
Reimportar não duplica |
| 2026-09-30 | Detecção automática de separador e encoding | Aceita exports nativos |
| 2026-09-30 | Perfil e admin sempre visíveis (admin condicional) | Descobribilidade |
| 2026-10-01 | Webhooks com fila em banco (sem Redis) | Sobrevive a restarts |
| 2026-10-01 | Reserva atômica por UPDATE condicional | Sem SELECT FOR UPDATE |
| 2026-10-01 | Backoff exponencial configurável | Padrão 30/60/120/240/480s |
| 2026-10-01 | Deduplicação por id_externo |
Reenvios são idempotentes |
| 2026-10-01 | Webhooks sem CSRF | HMAC substitui CSRF |
docs/ARQUITETURA.md — fluxo e camadasdocs/MODELO-DOMINIO.md — entidadesdocs/BANCO-DE-DADOS.md — schemadocs/API-INTERNA.md — rotas e contratosdocs/REGRAS-DO-PRODUTO.md — regras de negóciodocs/DICIONARIO-METRICAS.md — métricasdocs/GUIA-GESTOR-TRAFEGO.md — manual do usuáriodocs/GLOSSARIO.md — termosdocs/DEPLOY.md, docs/OPERACAO.md, docs/SEGURANCA.md, docs/WEBHOOKS.mddocs/TESTES.md, docs/SMOKE-TEST.mddocs/ONBOARDING.md, docs/FEEDBACK.md, docs/ROADMAP.md