Executando verificação de segurança...
3

O que aprendi construindo um ERP do zero com Django e Next.js (e por que quase desisti 3 vezes)

Faz quase 1 ano que estou desenvolvendo um ERP completo. Sozinho. O projeto se chama Bunto e roda em produção hoje em bunto.com.br. Quero compartilhar o que aprendi porque acho que pode ser útil pra quem está pensando em construir algo parecido — ou qualquer SaaS complexo.

Não vou fazer propaganda. Vou falar de decisões técnicas, erros que cometi e coisas que funcionaram.

A stack e por que escolhi ela

  • Backend: Django + Django REST Framework + PostgreSQL (RDS na AWS)
  • Frontend: Next.js 16 (App Router) + Tailwind CSS (deploy na Vercel)
  • Infra: EC2 na AWS, Gunicorn, Celery + Redis, Socket.IO para real-time
  • Fiscal: Um módulo em Delphi/Lazarus para comunicação a Receita Federal

Por que Django? Porque o admin, o ORM e o ecossistema de pacotes para o mercado brasileiro (boletos, NFe, integrações bancárias) são imbatíveis. Tentei FastAPI no começo e voltei atrás em 2 semanas — para um ERP com dezenas de models interligados, o ORM do Django economiza meses de trabalho.

Por que Next.js no App Router? Porque Server Components permitem páginas públicas (site institucional, preços) com SEO perfeito, enquanto o ERP em si roda como SPA com autenticação via cookies HttpOnly. Dois mundos no mesmo projeto.

O que deu errado (e o que aprendi)

1. Módulos acoplados no começo

No mês 3, o módulo de Vendas importava diretamente models do Estoque, que importava do Financeiro. Quando precisei mudar a lógica de reserva de estoque, quebrei 3 módulos ao mesmo tempo.

Solução: criei uma camada de "shared services" — arquivos tipo estoque_shared_service.py que expõem apenas as operações necessárias. Os módulos nunca importam models uns dos outros. Dá mais trabalho no início, mas a manutenção ficou viável.

2. Autenticação com JWT em cookies

Comecei com token no localStorage. Depois migrei pra cookies HttpOnly com access_token (8h) e refresh_token (7d). O refresh com rotação (ROTATE_REFRESH_TOKENS=True) causou um bug sutil: em produção, o refresh token era blacklisted após uso, mas o novo token não era salvo no cookie pelo middleware. O usuário perdia a sessão silenciosamente depois de 8h.

Demorei 3 dias pra encontrar esse bug. A lição: teste fluxos de autenticação com tokens expirados de verdade, não só com mocks.

3. Emissão fiscal

Esse é o módulo que quase me fez desistir. A legislação fiscal brasileira é um labirinto. NF-e, NFS-e, cada município com seu web service, certificados A1, XMLs com schemas que mudam sem aviso. Mas como todo desafio, existe apenas a curva de aprendizado, e em 3 meses consegui compreender a implementar com sucesso um módulo fiscal completo que inclui nfe, nfse, nfce e também integração com prefeituras. Para isso dar certo, fiz uma parceria com uma emrpresa consolidada no mercado que me disponibilizou a parte difícil da coisa: A comunicação segura com a Receita Federal através de componentes de altíssimo nível.

Não é a solução mais elegante, mas funciona e é o que dezenas de softwares fiscais brasileiros usam por baixo dos panos.

O que funcionou bem

Celery para tudo assíncrono

Geração de relatórios, envio de emails, processamento de boletos, sincronização de estoque entre depósitos — tudo via Celery com Redis como broker. A dica: crie tasks idempotentes desde o dia 1. Retries vão acontecer, e se sua task não for idempotente, você vai duplicar dados.

Socket.IO para real-time

O módulo de CRM tem uma "Sala de Vendas" onde gestores acompanham vendedores em tempo real. Implementei com Socket.IO rodando como um serviço separado na EC2. O Django publica eventos via Redis pub/sub e o Socket.IO distribui para os clientes conectados. Funciona surpreendentemente bem.

IA integrada no fluxo

Usei Claude (API da Anthropic) para funcionalidades como classificação automática de produtos por NCM, sugestão de descrições fiscais e análise de inadimplência. Não é um chatbot jogado na tela — são chamadas pontuais que resolvem problemas específicos do usuário sem ele precisar saber que tem IA por trás.

Números reais

  • ~340 mil linhas de código entre frontend e backend
  • 30+ módulos funcionais (Vendas, Estoque, Financeiro, NF-e, NFS-e, CRM, PDV, Compras, Expedição, Contratos, Devoluções, Propostas, Vale-troca, Cobranças Bancárias, Dashboard, Chat IA, Agenda, entre outros)
  • 1 desenvolvedor (sim, sozinho — com ajuda significativa de IA (100% Claude Opus) para acelerar)
  • ~1 ano de desenvolvimento

Onde estou agora

O sistema está em produção e estou na fase de validação com usuários reais. Montei uma comunidade de beta testers no WhatsApp para coletar feedback direto. É o momento mais tenso e mais empolgante ao mesmo tempo — ver gente de verdade usando o que você construiu expõe coisas que nenhum teste unitário pega.

Foi o que eu achei mais viável, ao invés de correr atrás de "especialistas de marketing", que tal esse contato mais direto com gente que realmente quer abraçar a causa?

Se alguém aqui já passou por essa fase de validação de um SaaS B2B, adoraria trocar ideia. E se alguém trabalha com Django, Next.js ou sistemas fiscais brasileiros e quiser conversar sobre algum ponto técnico, fico à disposição nos comentários.

Carregando publicação patrocinada...