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

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...
1

Muito bom amigo, a LP ficou muito bonita. Estou na luta de busca por um ERP que atenda meu segmento como eu gostaria, mas não encontro um com preço minimamente razoável para o meu tamanho de empresa. Já comecei a escrever um ERP mas a parte fiscal me pega demais e sempre desisto. Meu MVP era pelo menos PDV e fiscal.

0

E aí meu caro! Cara, a parte fiscal é de longe a mais ingrata de um ERP — eu apanhei meses pra acertar a comunicação com a Receita, acabei tendo que usar Delphi/Lazarus pra isso porque as libs em Python ainda não resolvem sozinhas.
Fiquei curioso: qual é o teu segmento? E quando fala em preço razoável, qual faixa faria sentido pra ti? Tô calibrando justamente isso pro lançamento.
O Bunto já tem módulo fiscal e PDV no roadmap, e feedback de quem já tentou construir um ERP vale ouro pra mim. No site tem o link pra comunidade no WhatsApp — se quiser acompanhar de perto e trocar ideia, será muito bem-vindo.
Forte abraço!

1
1

Parabéns pelo sistema amigo, entrei na LP e achei bem elegante.
Queria tirar uma dúvida, qual intermediário vc usou para o sistema das NFs?
Estou montando um sistema semelhante financeiro que eventualmente irá crescer para um ERP e já estamos mapeando essas questões de NFs que é uma doidera rsss.

1

Valeu demais! Então, a parte de NF é realmente a maior doidera de um ERP no Brasil kk
Eu uso o ACBr (projeto open source em Delphi/Lazarus) pra toda a parte de comunicação com a Receita — NFS-e, assinatura digital, envio de XML. É de longe o projeto mais maduro que existe no Brasil pra isso, e a comunidade é enorme. Rodo ele compilado com Lazarus em Linux, integrado com o Django. O stack inteiro é Linux-based, inclusive em produção na AWS.
Tentei fazer com libs Python no início, mas a cobertura ainda não chega perto do que o ACBr entrega. Então integrei ele como um módulo separado que o Django aciona quando precisa emitir nota.
O desafio real fica nos padrões ABRASF — cada prefeitura implementa de um jeito e o ACBr ajuda muito, mas não elimina 100% dos perrengues 😅
Se tá começando agora e quer ir mais rápido, vale considerar um intermediário tipo Focus NFe ou Enotas pro MVP, sem se perder no fiscal logo de cara. Depois quando escalar, aí avalia se internaliza.
Se quiser trocar mais ideia sobre essa parte, entra na comunidade do WhatsApp (está no memu do site). Essa dor de NF é tão comum que vale a gente documentar junto os perrengues.
Forte abraço!

1

Parabéns, camarada. Fiz um usando flask para a minha empresa. Mas depois de pronto, vi que poderia ter usado Django, talvez teria mais facilidade e não precisaria fazer tanta coisa na mão.

Trabalho com ciber segurança. Se quiser, posso fazer alguns testes controlados na aplicação 0800.

1

Valeu demais! Flask é uma ótima escolha, mas realmente o Django entrega muita coisa pronta — ORM, admin, autenticação, middleware de segurança — que no Flask você acaba construindo na mão.
E cara, aceito demais essa oferta de testes! Segurança é prioridade pra mim, ainda mais lidando com dados fiscais e financeiros de empresas. Ter um olhar profissional da área ia me ajudar muito a blindar o sistema antes de abrir pro público.
Vamos combinar por fora? Entra na comunidade do WhatsApp que tem no menu do meu site — a gente alinha escopo e acesso pra você fazer os testes num ambiente controlado.
Forte abraço!

1

Parabéns por ter lançado seu projeto amigo! Sou dev python/django em uma empresa que desenvolve software ERP e seguimos extato mesmo caminho e cara, posso te dizer que você fez a melhor escolha no que se trata de tecnologia para o backend e, no contexto de ERPs, onde tudo é interligado, não existe solução melhor do que o django e o seu ORM mesmo não, fora a extensa comunidade de pacotes que ajudam demais o desenvolvimento.

A landing page ficou bonita demais maninho, parabéns mesmo pelo progresso. Depois, se quiser, podemos trocar uma ideia e ver no que podemos nos ajudar, trabalho nesse mesmo ramo há 5 anos e já apanhamos demais para alguns erros bobos kkk. Você já deve conhecer, mas fica uma recomendação de uma ferramenta excelente o sentry

1

E ai meu caro, pois é verdade, muitos tem aversão a python, eu vejo como oportunidade. Python faz milagre e se encaixou perfeitamente no meu propósito. Se eu fosse desenhar o diagrama (fluxo) completo do sistema que desenvolvi acho que fica insano. São 35 modulos muito bem organizados e estruturadas. Sò o CRM em si é um sistem a parte mas que está totalmente integrado ao projeto e aqui vale uma obeservação que para você que entende vai saber da organização estrutural. Fiz um sistema completo de CRM integrado ao erp, integrado a vendas, fiscal, financeiro, comissões, estoque etc.. sem tocar numa linha de código do ERP. Parece mentira mas não é, isso é engenharia de primeiro nível.

Mas ai talvez você pense, pô mas nem todos querem um CRM, muitos nem sabem o que é. Ai te digo, para este cenário entra a funil de permissões granular. Eu falo funil porque o sistema de permissões que desenvolvi, permite total manipulação, transformando o sistema em uma peça lego.

O sistema de permissões é escalável, parte do Plano, depois vem subpermissões para vendedores e usuários do sistema (todos configuráveis). Plano > usuários > vendedores > acesso público (a alguns poucos recursos como compartilhamento por exemplo).

Eu preciso manter contato com pessoas como você, entra la na comunidade que estou começando https://bunto.com.br/comunidade pode tanto interagir com os demais que estão lá ou pode me chamar também, só procurar la pelo Anderson. E valeu ai pela dica do centry, pretendo implementar. Neste primeiro momento estou acompanhando logs mais de perto no braço mesmo, para acompanhar o celery, celery beat (agendador de tarefas), o backend em si django e o socketio para comunicação instantânea. Quero acompanhar isso tudo de perto agora.

Forte abraço, te espero la na comunidade.

1

Fala amigo, valeu pela rápida resposta, já entrei na comunidade, preciso de gente como você também kkkkk, alias, obrigado pelo convite!

O sentry não é só para logs não, é um detector automático de erros e analisador de performance. A instalação é em algumas linhas, e como um bom amigo, vou te passar a instalação dele aqui:

if IN_PRODUCTION:
    def before_send(event, hint):
        token = get_request_variable("token")

        if "request" in event and "headers" in event["request"]:
            event["request"]["headers"]["Authorization"] = token

        event.setdefault("extra", {})
        event["extra"]["token"] = token

        return event

    sentry_sdk.init(
        dsn=get_env_var("SENTRY_DSN"),
        environment=ENVIROMENT,
        traces_sample_rate=1.0,
        profiles_sample_rate=1.0,
        send_default_pii=True,
        before_send=before_send,
    )

É só jogar isso no topo do seu settings.py e já faz a boa.

Quanto ao seu sistema de permissões, achei muito interessante ter um sistem de subpermissões, quem sabe um dia você me mostra. Depois vamos marcar um dia pra trocar idea no discord, vê o que a gente tem de melhor para trocar. Meu ID do discord é 691010770875449426

1
1
1

Sim, isso foi o mais interessante, eu aproveitei e já fiz tudo junto, antigo com o novo, ou seja, cobertura completa para a reforma tributária, incluindo essa mudança para o emissor nacional.

Confesso que, embora eu tenha deixado compatibilidade para ambos os cenários, algumas prefeituras estão na transição, e isso tem trazido problemas para muitos sistemas do mesmo nicho, o que me favorece por estar começando. Então note, para cada situação há uma oportunidade. Eu vi como opornidade injetar a reforma em um software sem usuários o que pe permitiu erras até chegar na vitória. E ficou muto bom.

Forte abraço, te espero na comunidade.

1
1

Salve! Pode acompanhar na comunidade https://bunto.com.br/comunidade.

A comunidade estou iniciando na verdade, e a partir de hoje começarei a postar conteúdo de valor lá relatando as experiências vividas mas também relatarei todo o processo de crescimento, o progresso comercial que também é uma tarefa difícil.

Será bem vindo lá pra crescermos juntos.