Pular para o conteúdo
Erick Schaedler

Em produção

Carbase

Uma plataforma de e-commerce para uma preparadora automotiva, com um funil de credenciamento para revendedores e um construtor de páginas que o cliente usa sozinho.

Ver no ar Abre em nova aba

O problema

A loja precisava de mais que um catálogo — uma forma de avaliar candidaturas de concessionárias antes de publicá-las, e uma forma de mudar páginas de marca e promoções sem abrir chamado a cada edição.

O que construí

Uma plataforma em .NET e React com catálogo, carrinho e checkout; conta do cliente com histórico de pedidos; um funil de concessionárias em dois estágios que mantém a avaliação separada do que é mostrado publicamente; e um construtor de páginas por blocos para páginas de marca e promoções.

Página inicial da Carbase: uma Ferrari preparada, com chamadas para o catálogo de peças e para a área do representante.
Página inicial da Carbase no celular, com o destaque principal e a navegação.

Decisões técnicas

Virar concessionária listada é dois passos separados, de propósito. Um formulário público coleta os dados brutos de avaliação — CNPJ, há quanto tempo a empresa existe, o que quer vender, por quê — e um administrador revisa isso por um funil de status: nova, em contato, aprovada ou rejeitada. Aprovar uma candidatura não publica nada automaticamente; colocar uma concessionária no mapa público, com logo e dados de contato tratados, é um passo separado e deliberado. Essa diferença existe para um parceiro aprovado mas ainda não finalizado nunca aparecer pela metade no site público.

Um produto vive em duas taxonomias ao mesmo tempo, e elas não se sobrepõem. Uma é uma árvore de compatibilidade veicular — marca, modelo, variante — que responde “em qual carro essa peça serve”. A outra é marca e categoria — quem fabrica, que tipo de peça é — que responde “o que é isso”. O mesmo kit de suspensão aparece tanto para quem navega pelo carro quanto para quem navega pela marca que fabrica suspensão, porque as duas árvores são modeladas e consultadas de forma independente em vez de forçar uma dentro da outra.

Uma página não é um template com espaços fixos — é uma lista ordenada de seções tipadas (banner, FAQ, carrossel de produtos, hero, texto, e outras) guardada como dado, e é isso que deixa o cliente montar uma página de marca nova ou uma promoção sazonal a partir de blocos existentes sem precisar de deploy. Páginas do sistema são marcadas separadamente das criadas pelo cliente justamente para que a URL delas não possa mudar sem querer, já que esses slugs sustentam outras partes do site.

O checkout roda o fluxo inteiro — carrinho, endereço, cotação de frete, criação do pedido — contra uma interface de provedor de pagamento, não contra um gateway específico amarrado direto no código. Depois que o provedor anterior foi removido, a interface continua de pé, e ela se reporta como indisponível em vez de fingir que processou um cartão que não processou. Plugar um gateway novo depois significa implementar uma interface, não mexer no fluxo de checkout que já funciona em volta dela.

Os dados de produto podem ser sincronizados a partir da Akila, um ERP externo, mas só cinco campos ficam sob o controle dela — nome, unidade, preço, custo e estoque — e a sincronização nunca toca em mais nada, incluindo o slug da URL pública do produto, então uma mudança de nome vinda do ERP nunca quebra um link que alguém já compartilhou. No momento em que um administrador edita um desses cinco campos na mão, aquele campo específico fica marcado como destravado e a próxima sincronização o ignora — não precisa marcar nada manualmente, editar o campo já é a marcação. A sincronização também se protege contra um feed bagunçado: ela não aplica um nome que já está em uso por outro produto ativo, e não deixa um preço ausente vindo do ERP apagar o preço de um item que já está à venda online.

Resultado

Em produção — 15 marcas ativas em 11 categorias, um diretório público de concessionárias e páginas de conteúdo que o cliente edita sem tocar em código.

Stack

  • .NET
  • PostgreSQL
  • React
  • TypeScript
  • AWS S3