Implantado na Pollo Loko, em São José dos Campos. Lê as planilhas do PDV, processa com Pandas e gera o relatório do dia pronto para o WhatsApp, distribuído como executável portátil. Reduziu o fechamento de caixa de 20 minutos para cerca de 30 segundos e está em uso diário desde o lançamento. Os requisitos foram levantados direto com o cliente, com manutenção contínua desde então.
Case study técnico
FechaBot
Da dor real à arquitetura: como um fechamento de caixa feito à mão virou um MVP em uso diário e agora um SaaS multi-tenant em desenvolvimento.
O código do SaaS é privado. Esta página e o repositório do case study mostram o raciocínio por trás dele (arquitetura, decisões e segurança), não a implementação.
O problema
Pequenos e médios negócios fecham o dia numa planilha e não têm equipe técnica para transformá-la em informação útil, na hora certa.
01 · Automação
Lê a planilha do negócio, aplica os filtros configurados e envia o resumo formatado pelo WhatsApp, sem intervenção manual.
02 · Persistência
Cada fechamento vira um registro no banco relacional, e a planilha original fica preservada no armazenamento de objetos.
03 · Isolamento
Todo dado pertence a um tenant, do schema do banco até a API. Um negócio nunca enxerga o outro.
O MVP
O SaaS
A partir da validação do MVP, qualquer negócio poderá configurar seus filtros e seu template de mensagem, enviar a planilha e receber o resumo no WhatsApp.
10 de 11 sprints concluídos. Falta a sprint de cobrança, deploy e onboarding. O envio real de mensagens já foi testado ponta a ponta, com entrega confirmada no WhatsApp.
Decisões técnicas
Cinco decisões representativas, cada uma detalhada como ADR no repositório.
Sessão sem confiar só no JWT
Cookie httpOnly, CSRF double-submit e allowlist de sessão no Redis, para que uma sessão possa ser revogada de verdade antes de o token expirar.
Intenção do cliente vs. realidade externa
Quando a Meta reclassifica a categoria de um template, o sistema guarda a categoria pedida e a efetiva como fontes de verdade distintas, com histórico.
Envio assíncrono e resiliente
Fila no Celery, retry automático e rastro persistido de toda tentativa, com sucesso ou falha. Nada é descartado em silêncio.
Segurança como processo
Ciclos dedicados de revisão, cada um com achado, correção e teste de verificação documentados, e não uma auditoria única no fim.
Isolamento multi-tenant estrutural
Todo dado tem tenant_id, e toda rota autenticada filtra por ele a partir do JWT, nunca de parâmetro da requisição. Sem exceção.
Demonstração
O produto funcionando de ponta a ponta. As mídias vêm do repositório do case study.
Landing page e fluxo geral

Login com MFA
Sessão por cookie httpOnly, com verificação TOTP como segunda etapa.

Tour pelo dashboard

Configuração de filtros e template
Upload da planilha de referência com detecção automática de colunas, condições compostas, variáveis clicáveis e preview em tempo real antes do envio.


Mensagem entregue no WhatsApp real
Template aprovado pela Meta e pipeline validado da planilha até a mensagem chegar. Telefones e destinatários são valores de teste, nunca dado real de cliente.

CI/CD e testes
Todo push passa por um pipeline com lint, aplicação do schema do banco e testes, com cobertura mínima travada.
- 66
- Testes automatizados a cada push: webhook, filtros, processamento, serviços e armazenamento
- 46,9%
- Cobertura atual, com piso de 40% no pipeline (o build quebra abaixo disso)
- 21
- Execuções do GitHub Actions, incluindo falhas reais corrigidas antes do merge
O pipeline roda ruff e depois pytest --cov. A régua de cobertura sobe junto com os testes novos, em vez de perseguir um número bonito sem substância.
Como navegar o repositório
fechabot-case-study/ ├── README.md visão geral ├── architecture/ diagramas e visão geral ├── decisions/ ADRs: decisões, alternativas, trade-offs ├── security/ achado, correção e verificação ├── roadmap/ feito, pendente, débitos técnicos └── media/ telas, diagramas e GIFs
Quer ver mais?
O case study é público. Para uma demonstração ao vivo, me chame.