Blog · 13/09/2026

Construindo o Max Bid: um limite antes do lance

Como construí uma calculadora simples de margem de revenda para tomar decisões em leilões considerando o custo completo.

Banner da calculadora de margem de revenda Max Bid

Gosto de projetos pequenos que terminam em uma resposta clara. O Max Bid nasceu de uma pergunta prática: quando um item parece barato em um leilão, qual é o maior valor que posso pagar e ainda alcançar o lucro que planejei?

É fácil olhar apenas para o preço de compra e tratar a diferença como lucro. Na revenda, também entram a comissão do leilão, a taxa da plataforma, o frete, a embalagem e o lucro que você quer preservar. Se um desses custos ficar de fora, o que parecia uma oportunidade pode virar prejuízo.

O Max Bid é o primeiro produto que publiquei pela Mirtilo IO. Escolhi começar por ele porque tinha um caso de uso concreto, uma explicação simples e um resultado que qualquer pessoa pode conferir.

Uma calculadora para uma decisão

Mantive o escopo propositalmente direto. O Max Bid não dá lances nem se conecta a marketplaces. Ele responde a uma pergunta: qual é o maior valor que posso pagar por um item e ainda atingir o lucro desejado depois da venda?

A conta usa sete valores:

  • preço de venda esperado
  • custo de compra
  • custo de frete
  • custo de embalagem
  • comissão do leilão
  • taxa da plataforma
  • lucro desejado

A fórmula parte do preço de venda esperado:

lance máximo =
  preço de venda
  − comissão do leilão
  − taxa da plataforma
  − frete
  − embalagem
  − lucro desejado

Vamos supor que eu espere vender um item por €200,00. A comissão do leilão é de 10%, a taxa da plataforma é de €20,00, o frete custa €10,00, a embalagem não custa nada e eu quero manter €50,00 de lucro. O lance máximo será de €100,00.

Se o custo de compra for €80,00, o lucro projetado será de €70,00 e o resultado será Compre. Se o valor do lance passar de €100,00, a recomendação muda para Não compre! A calculadora chega à mesma resposta da fórmula sem me obrigar a refazer a conta em uma planilha a cada oportunidade.

O número precisa ser explicado

Uma calculadora que mostra apenas um número grande pede que a pessoa confie nela. Eu preferi deixar a conta visível. O Max Bid mostra primeiro o lance máximo recomendado e depois detalha a venda esperada, a comissão, a taxa da plataforma, o frete, a embalagem, o custo de compra, o lucro desejado, os custos totais e o lucro projetado.

A implementação trabalha com valores em centavos e com um arredondamento consistente. Quando o custo de compra é igual ao lance máximo, a decisão continua sendo Compre. Quando é maior, o resultado é Não compre! São detalhes pequenos, mas são eles que fazem uma calculadora financeira parecer confiável.

O Max Bid também deixa claros os seus limites. Ele serve como apoio ao planejamento. Não substitui orientação financeira, fiscal ou jurídica, nem a consulta às políticas do marketplace. Impostos, devoluções, descontos e regras da plataforma podem mudar o resultado real, então esses custos ainda precisam ser conferidos antes de dar um lance.

Duas implementações, um mesmo contrato

O projeto tem duas implementações. A aplicação Rails é a referência para as fórmulas, os textos, a acessibilidade, a segurança e os testes. A aplicação em TypeScript preserva esse comportamento em um site estático publicado no GitHub Pages, em maxbid.mirtilo.io.

Escrever a versão pública em TypeScript foi uma decisão de entrega. O Vite compila o projeto em arquivos que o GitHub Pages serve diretamente. Assim, o Max Bid pode usar um domínio próprio sem um servidor de aplicação rodando continuamente ou um banco de dados para a calculadora pública. O TypeScript também cria uma fronteira tipada entre as regras do domínio, o tratamento de idiomas e moedas e a interface no DOM. A escolha veio do modelo de publicação e da vontade de manter o cálculo no navegador.

Manter a versão pública estática deixou o limite do produto mais claro. Depois que a página carrega, a conta é feita no navegador. Os valores ficam apenas na memória e não são enviados ao serviço de métricas de visualização de páginas. Não há conta nem backend para os cálculos, histórico ou armazenamento dos dados de revenda na calculadora pública.

Essa simplicidade ajuda tanto o produto quanto o trabalho de engenharia. A versão que roda no navegador tem menos partes para operar, enquanto a aplicação Rails oferece uma implementação de referência e um conjunto de testes mais completo. Mesmo assim, o site público precisa manter o mesmo comportamento e a mesma experiência que a pessoa encontra na versão de referência.

Uma aplicação pequena, engenharia séria

Quem usa o Max Bid vê sete campos e um resultado. O repositório guarda muito mais contexto. A intenção do produto está registrada no README, nas especificações do Speckit, no contrato canônico de conteúdo em src/content.ts, nos guias de segurança e topologia, na estratégia de testes e no registro de evidências da publicação. Juntos, esses documentos descrevem as fórmulas, os casos de borda, as expectativas de navegador e acessibilidade, as limitações do hosting, o limite de privacidade e o procedimento de rollback.

Eles também deixam explícitas decisões pequenas de comportamento. Quando o custo de compra é igual ao lance máximo, a decisão é Compre. Uma submissão inválida não pode deixar uma recomendação antiga na tela. Escolher outra moeda muda a unidade e a formatação, mas nunca faz uma conversão. Registrar essas decisões dá à implementação e aos testes algo preciso para proteger.

A segurança faz parte do mesmo desenho. A aplicação em TypeScript valida a entrada na fronteira do cálculo, aceita apenas idiomas e moedas permitidos, renderiza os valores controlados pelo usuário como texto, mantém os dados do cálculo na memória e não os envia para métricas, URLs ou APIs externas. O artefato de produção não publica source maps, e a verificação do artefato procura segredos e conteúdo inseguro nos arquivos gerados. A aplicação Rails de referência acrescenta proteção contra CSRF, Content Security Policy, HTTPS, strong parameters e filtragem de parâmetros. Brakeman, auditoria de dependências e o checklist de publicação cobrem o que um teste no navegador não consegue enxergar.

O fluxo de CI e CD também faz parte do produto. Em um push ou pull request que altere typescript/, o GitHub Actions faz checkout do código sem manter credenciais, instala as dependências travadas do Node.js 22 com npm ci, instala os navegadores do Playwright e executa verificação de tipos, lint, testes unitários e de DOM, testes end-to-end, testes de acessibilidade, build de produção, verificação do artefato, varredura de segurança e auditoria de dependências com severidade alta. O CI usa permissões de leitura no repositório, cancela execuções antigas e fixa as actions de terceiros em SHAs de commit.

O fluxo de deploy espera o CI terminar com sucesso depois de um push na main. Ele faz checkout do commit exato avaliado pelo CI, instala novamente as dependências travadas, recompila e inspeciona o artefato de produção, configura o GitHub Pages, envia typescript/dist e publica o site. Apenas o job de deploy recebe permissões de escrita no Pages e o token OIDC. Um pull request pode passar por toda a barreira de qualidade sem publicar nada; um push aprovado segue um caminho repetível até o domínio próprio.

Localização também faz parte do produto

O Max Bid está disponível em inglês e português brasileiro. A versão em inglês oferece as opções EUR e dólar americano. A versão em português oferece EUR e real brasileiro. Trocar a moeda muda a unidade e a formatação, mas não aplica conversão cambial. Por isso, todos os valores de uma mesma conta precisam usar a mesma moeda.

O formato dos números importa tanto quanto as palavras. Na interface em português, é possível informar valores como 1.200,50; na interface em inglês, o formato exibido é o conhecido 1,200.50. A entrada também aceita números no padrão europeu, desde que a separação não seja ambígua, para que um valor válido não seja rejeitado por uma diferença de convenção.

Esse projeto reforçou uma ideia importante para mim: localização não é apenas traduzir rótulos. Os exemplos, as máscaras de entrada, as moedas disponíveis, as mensagens de validação e o detalhamento do resultado precisam fazer sentido juntos.

Decidir o que fica de fora

O Max Bid atual não tem contas de usuário, pagamentos, exportação, uploads, comparação de marketplaces, links de afiliados nem telemetria dos valores calculados. Esses recursos podem fazer sentido mais adiante, mas adicioná-los agora mudaria o limite de privacidade e aumentaria o tamanho do produto que eu teria de manter.

Por enquanto, manter a calculadora gratuita e pequena tem um objetivo claro. Ela permite que a Mirtilo IO tenha um produto real para publicar, manter e acompanhar. Também me dá um exemplo público de como gosto de trabalhar: começar por uma decisão concreta, deixar as regras visíveis, testar os casos de borda e manter a arquitetura proporcional ao problema.

O Max Bid está disponível em maxbid.mirtilo.io. É uma ferramenta pequena, mas representa um primeiro passo importante para a Mirtilo IO e uma base útil para os produtos que vierem depois.

Voltar ao blog