Sistemas que construí

O case: de R$40 mil/mês em vendas a R$2,5 milhões faturados numa Black Friday 2025 — com a máquina que construí. Aqui estão os 10 sistemas por trás disso, com mais profundidade técnica do que cabe na página inicial, e mais.

01 · BI completo da operação

Painel que reúne todos os números da operação num só lugar

Pra sua loja: um lugar só onde você vê o lucro real de cada anúncio, produto e canal — e decide sem achismo.

O desafio

O número da operação vivia espalhado: anúncios numa tela, pedidos noutra, estoque e financeiro à parte. Faltava uma visão geral única — um BI que cruzasse tudo, sem dupla contagem, para decidir sobre dado real.

O que construí

Um BI completo que puxa dado de todos os lados — pedidos da Shopify, gasto de Meta e Google, estoque, financeiro, afiliados e metas — e calcula o retorno por atribuição last-click não-direto. Banco MariaDB (~106 mil pedidos, tabela de 540 MB) com índice composto, API JWT e servidor MCP com RAG (Qdrant + bge-m3) para perguntar qualquer número em linguagem natural.

Stack

Node.jsMariaDBShopify APIMeta GraphJWTQdrantMCP

O resultado

KPIs de 7,8 s → 224 ms ao corrigir o índice; query pesada de 19 s → 467 ms ao dimensionar o buffer pool. Virou o painel único de decisão da operação.

Como funciona, em 3 passos

01 — Fontes

7 sistemas, uma verdade

Shopify, Meta, Google, ERP, afiliados, reviews e metas — cada um com seu conector.

02 — Atribuição

MariaDB + engine próprio

Sync a cada 15 min, atribuição last-click não-direto, sem dupla contagem.

03 — Resposta

Painel + linguagem natural

API JWT e RAG (Qdrant) respondem qualquer número em segundos.

Detalhe técnico: a tabela-fato consolida ~106 mil pedidos com sync incremental a cada 15 minutos, integrando 7 fontes de dados — Shopify Admin API (REST + GraphQL), Meta Marketing API, GA4 Data API, Tiny ERP de 3 empresas diferentes, UpPromote (afiliados), Stamped.io (reviews) e Google Sheets (metas). A atribuição multi-touch é motor próprio, reconstruído a partir da jornada do cliente (last-click não-direto) — não a API pronta de nenhuma plataforma. PII fica cifrada em repouso com AES-256-GCM, e um HMAC-SHA256 permite contar clientes únicos sem nunca expor o dado em claro. O motor de margem/custo por canal é configurável, então o lucro real considera custo de produto e taxa por canal, não só receita bruta.

02 · Automação de mídia

Robô que ajusta o orçamento dos anúncios sozinho

Pra sua loja: a verba sobe no que dá lucro e corta o que perde — sozinho, todo dia, sem alguém mexendo no feeling.

O desafio

Ajustar dezenas de campanhas na mão não escala — e escalar sobre ROAS inflado queima caixa. Precisava automatizar a decisão sobre o número real, com travas.

O que construí

Robô Python que lê o sROAS e ajusta orçamento por regra: só sobe acima de 1,5, reduz abaixo de 1,0 e nunca aumenta abaixo de 1. Teto diário soft + kill imediato de quem gasta demais com sROAS baixo.

Stack

PythonMeta Marketing APIShopifyDocker Swarmcron

O resultado

Escala 24/7 por regra, sem intervenção manual, com duas travas de sROAS protegendo o caixa.

Como funciona, em 3 passos

01 — Mede

sROAS real da loja

Lê o retorno de verdade da Shopify — não o inflado do gerenciador.

02 — Decide

Regra, não feeling

Sobe acima de 1,5, reduz abaixo de 1,0, nunca aumenta abaixo de 1.

03 — Protege

Guard-rails

Teto diário, cooldown e dead-man's switch cuidam do caixa sozinhos.

Detalhe técnico: a atribuição casa venda↔campanha por utm_term=campaign.id — identificador imutável que sobrevive a renomear a campanha — com 4 camadas de fallback caso o parâmetro falhe. Além das travas de sROAS, o autopilot respeita um teto agregado de conta, não mexe em campanha que ainda está na trava de aprendizado do Meta, aplica cooldown de aumento (no máximo 1x a cada N dias por campanha) e limita a variação máxima por rodada para evitar oscilação. O estado persiste cifrado em AES-256-GCM, a chamada à Graph API tem retry com backoff e respeito ao header Retry-After, e um dead-man's switch (heartbeat + healthcheck + alerta no Telegram) avisa se o robô parar de rodar. Roda via supercronic, está na versão 3, com testes unitários e deploy programático.

03 · Storefront & ticket médio

Vitrine que sugere o produto certo para cada cliente

Pra sua loja: cada cliente vê o produto certo pra ele, o carrinho cresce — e você não paga mais anúncio por isso.

O desafio

O app genérico sugeria produtos sem nexo. A 1ª versão própria, só por lift de co-compra, inflava pares raros e matava o complemento dos best-sellers.

O que construí

Motor híbrido com três sinais rank-normalizados: co-compra por cosseno, similaridade semântica (bge-m3/Qdrant) e popularidade. Intenções complemento/substituto, diversidade por família, penalidade de preço e flag de rollback.

Stack

Node.jsSQLiteQdrantbge-m3Shopify Liquid

O resultado

Recomendação coerente em 100% do catálogo (cold-start via semântico), rollback por flag. Mais itens por pedido, sem mídia.

Como funciona, em 3 passos

01 — Sinais

3 fontes combinadas

Co-compra, similaridade semântica e popularidade, cada uma com peso.

02 — Rank

Normalizado e balanceado

Diversidade por família e penalidade de preço evitam viés.

03 — Sugestão

100% do catálogo

Cold-start via semântico cobre até produto sem histórico.

Detalhe técnico: os três sinais — co-compra, semântico e popularidade — entram normalizados por rank antes de somar, para que uma escala diferente entre eles não domine o resultado sozinha. A intenção complemento/substituto decide se a sugestão empurra "leva junto" ou "alternativa"; a diversidade por família de produto evita mostrar 5 variações do mesmo item; a penalidade de preço evita empurrar sempre o mais caro do catálogo. A flag de rollback existe porque motor de recomendação é o tipo de sistema que erra silencioso — dá para reverter pro sinal anterior sem redeploy.

04 · Retenção

Resgate automático de carrinho abandonado

Pra sua loja: boa parte de quem abandona o carrinho volta e compra — no automático, sem queimar cupom à toa.

O desafio

A recuperação nativa era um e-mail atrasado. E um bug chegou a mandar cupom para quem já comprou — queimando margem.

O que construí

Fluxo por evento de checkout, dual-channel (e-mail + WhatsApp): lembrete em minutos, quebra de objeção, incentivo só no fim. Guard anti-cupom-indevido checando pedido concluído por contato, e-mail, telefone e ID Shopify.

Stack

PythonRedisWhatsApp APIActiveCampaignShopify webhooks

O resultado

Fluxo rápido no lugar de um e-mail perdido, com trava anti-cupom. A receita mais barata da loja.

Como funciona, em 3 passos

01 — Gatilho

Evento de checkout

Dispara em minutos, não horas depois.

02 — Mensagem

E-mail + WhatsApp

Quebra de objeção primeiro, incentivo só no fim.

03 — Guarda

Anti-cupom-indevido

Confere contato, e-mail, telefone e loja antes de qualquer desconto.

Detalhe técnico: o guard não se contenta com e-mail — cruza contato, e-mail, telefone e ID da loja (Shopify) antes de disparar qualquer lembrete ou cupom. O último campo importa porque a mesma automação atende mais de uma loja: sem o ID da loja no cruzamento, um cliente que já comprou na loja A poderia receber cupom disparado pela loja B só por coincidência de e-mail ou telefone. Foi exatamente essa lacuna — checagem por um campo só — que causou o bug original.

05 · Tracking server-side

Rastreamento que faz o anúncio enxergar cada venda

Pra sua loja: o anúncio volta a enxergar cada venda e otimiza melhor — mesmo com bloqueio de cookie no navegador.

O desafio

Com bloqueio de cookie, o pixel perdia conversão e o algoritmo otimizava cego. E o gasto não voltava pra Shopify, travando o cálculo de retorno real.

O que construí

Tracking server-side enviando cada pedido ao Meta via Conversions API com dedup por event_id e hashing de PII (EMQ), + conector que puxa gasto do Meta Graph e GA4 e injeta na Shopify — idempotente, cron diário.

Stack

Node.jsConversions APIGA4 Data APIShopify Engagementscron

O resultado

Pixel enxergando conversão sem cookie e gasto atribuído dentro da loja — dado limpo alimentando o algoritmo.

Como funciona, em 3 passos

01 — Bloqueio

Cookie recusado

O pixel do navegador perde a conversão sozinho.

02 — Servidor

Conversions API

Envia o pedido direto, com dedup por event_id e hash de PII.

03 — Sinal limpo

Algoritmo enxerga de novo

EMQ sobe, gasto volta pra Shopify, ROAS real fecha certo.

Detalhe técnico: a Conversions API deduplica eventos por event_id — evita contar a mesma venda duas vezes quando o pixel do navegador e o servidor mandam o mesmo evento — e faz hashing de PII antes de enviar, o que sobe o EMQ (Event Match Quality), a nota que o Meta dá pra qualidade do sinal recebido. O conector que injeta gasto do Meta Graph e do GA4 de volta na Shopify é idempotente (pode rodar de novo sem duplicar linha) e roda em cron diário, mantendo o cálculo de ROAS real sempre com o gasto do dia certo.

06 · CRM inteligente

CRM que cuida do cliente do carrinho ao pós-venda

Pra sua loja: um só sistema cuida do cliente do carrinho ao pós-venda, com WhatsApp disparando na hora certa.

O desafio

Várias lojas precisavam do mesmo CRM sem manter código diferente por marca, e sem que um bug numa respingasse nas outras.

O que construí

CRM Node + MongoDB com deploy por patches versionados sobre imagem base (cada tenant é rebrand com tag fixa). Automações por override em banco, cupom via OAuth próprio e rastreio no WhatsApp. Webhooks acionam os fluxos.

Stack

Node.jsMongoDBDockerShopify OAuthWhatsApp

O resultado

Um só código servindo várias lojas, com isolamento que evita uma marca quebrar a outra.

Como funciona, em 3 passos

01 — Várias lojas

Uma imagem-base

Cada tenant nasce do mesmo código, com patch por cima.

02 — Override

Regra por banco

Muda o fluxo de uma loja sem subir deploy novo.

03 — Contato

WhatsApp no gatilho

Webhook aciona a automação certa, na hora certa, por loja.

Detalhe técnico: cada tenant nasce de uma imagem base comum e recebe patches versionados por cima — rebrand por tag fixa, não fork de código, então uma correção sobe para todas as lojas de uma vez. A automação (que mensagem, quando, pra quem) é resolvida por override gravado em banco por tenant, não por deploy separado — mudar um fluxo de uma loja não exige subir código novo. O cupom é emitido via integração OAuth própria com a Shopify de cada loja, e webhooks de pedido/cliente acionam os fluxos em tempo real.

07 · Fiscal no automático

Emissão de nota fiscal automática, pedido por pedido

Pra sua loja: cada venda paga sai com nota fiscal sozinha, na hora certa — sem alguém emitindo nota à mão o dia inteiro.

O desafio

Emitir nota de centenas de pedidos por dia na mão não escala, e a logística tem hora pra fechar a remessa: pedido pago sem nota é pedido que não embarca. Precisava de emissão contínua, confiável, que não parasse sozinha.

O que construí

Um serviço que escuta o pedido pago na Shopify, sincroniza com o ERP (Tiny/Olist) e emite a NF-e pelo ERP de hora em hora, sozinho. Uma API recebe o webhook do pedido e um worker agendado faz a emissão em ciclo, reavaliando a fila a cada rodada.

Stack

Node.jsMariaDBTiny/Olist ERPShopify webhooksDocker Swarmsupercronic

O resultado

Nota saindo de hora em hora sem intervenção, com fila que prioriza o pedido normal e segura a pré-venda sozinha até o estoque chegar.

Como funciona, em 3 passos

01 — Pedido pago

Webhook da Shopify

A venda paga chega na hora, direto pelo evento da loja.

02 — Sincroniza

Casa com o ERP

Puxa o pedido no ERP e monta a fila de quem já pode faturar.

03 — Emite

NF-e de hora em hora

O worker fatura em ciclo, no minuto 0, e reavalia a fila a cada rodada.

Detalhe técnico: a emissão passou por três blindagens depois de incidentes reais de produção. Primeiro, a fila sofria head-of-line blocking — pedidos de pré-venda, por serem os mais antigos, ocupavam todas as vagas do ciclo e travavam os pedidos normais; corrigido com um ORDER BY que prioriza o pendente e só encaixa pré-venda se sobrar vaga. Depois, um ECONNRESET no sync abortava o ciclo inteiro e não faturava nada: agora cada etapa tem retry com backoff (respeitando 429/Retry-After) e try/catch isolado, então a emissão sempre acontece mesmo se o sync falhar. Por fim, a busca de pedidos no ERP lia só a primeira página (100 pedidos): em pico, tudo além do 100º ficava invisível — corrigido com paginação completa e teto configurável. O serviço reavalia a cada tick, e um pedido de pré-venda vira nota sozinho no instante em que o estoque fica positivo.

08 · Pré-venda & caixa antecipado

Pré-venda automática que vende o produto antes de chegar

Pra sua loja: você vende o lote antes dele chegar e entra caixa adiantado — sem risco de faturar cedo demais e sem mexer em nada à mão.

O desafio

Abrir pré-venda na mão é frágil: quando um tamanho zera por venda normal ele deveria virar pré-venda sozinho, e um pedido antigo comprado com estoque físico não pode ser segurado por engano. Faltava a regra automática, por tamanho.

O que construí

Um serviço que varre a loja a cada poucos minutos: produto com tag pré-venda cujo tamanho zerou passa a aceitar compra, entra no desconto automático e ganha um carimbo de data de início. Só pedidos feitos depois desse carimbo são etiquetados e segurados — os antigos passam limpos.

Stack

Node.jsShopify Admin APIMetafieldsDocker Swarmcron

O resultado

Pré-venda que liga e desliga sozinha por tamanho, sincronizada com a nota fiscal, sem faturar antes da hora.

Como funciona, em 3 passos

01 — Detecta

Tamanho que zerou

Enxerga a variante sem estoque de um produto marcado pra pré-venda.

02 — Ativa

Compra + desconto

Libera a venda, entra no desconto automático e carimba a data de início.

03 — Etiqueta

Só o pedido novo

Marca e segura apenas as compras feitas depois do carimbo — nunca as antigas.

Detalhe técnico: o coração da regra é um carimbo de data (metafield por variante) que resolve um problema sutil — ao ligar a pré-venda de um tamanho que acabou de zerar, pedidos antigos comprados com estoque físico seriam etiquetados e segurados por engano; a nota fiscal só segura o pedido cuja data é posterior ao carimbo. O mesmo carimbo é lido pelo serviço de faturamento, então os dois sistemas concordam sobre o que é pré-venda sem duplicar lógica. Há ainda o cuidado com o desconto automático da Shopify, que não aceita ficar sem itens: a solução foi um produto-âncora em rascunho (não comprável) fixo no desconto, para nunca vazar o desconto nos tamanhos que ainda têm estoque. Quando o lote chega, o tamanho volta a "esgotado até repor" e sai do desconto sozinho.

09 · Atendimento com IA

Robô que responde comentário e direct do Instagram com IA

Pra sua loja: o cliente pergunta preço, tamanho ou prazo no Instagram e recebe resposta certa na hora — com a informação real da sua loja, não um texto genérico.

O desafio

Comentário e direct chegam o dia todo e a resposta atrasada perde a venda. Mas um robô que responde "de cabeça" inventa preço e prazo — precisava responder rápido e com o dado verdadeiro do catálogo e das políticas da loja.

O que construí

Um respondedor que, antes de escrever, consulta a base de conhecimento da loja (catálogo + políticas, por busca semântica) e só então gera a resposta com IA. Usa uma cadeia de 3 modelos em ordem de custo, com painel próprio protegido por senha pra revisar antes de publicar.

Stack

Node.jsDeepSeekOpenRouterRAG (Qdrant + bge-m3)Instagram Graphbcrypt

O resultado

Resposta coerente e fundamentada no dado real, sem inventar — e se a IA cai, cai pra próxima da fila sem parar o atendimento.

Como funciona, em 3 passos

01 — Chega

Comentário ou direct

A pergunta do cliente entra pelo Instagram e dispara o fluxo.

02 — Consulta

Base real da loja

Busca catálogo e políticas por significado antes de escrever qualquer coisa.

03 — Responde

Cadeia de 3 IAs

Gera a resposta pelo modelo mais barato que funcionar; se cair, tenta o próximo.

Detalhe técnico: antes de gerar a resposta, o serviço faz uma busca semântica (RAG com Qdrant + embeddings bge-m3) na base de conhecimento e no catálogo da loja, com piso de score — se nada relevante volta, ele responde mesmo assim, mas sem contexto inventado (fail-open com timeout, nunca trava o atendimento). A geração usa uma cadeia de 3 provedores em ordem de custo (um modelo econômico primeiro, dois de reserva pagos e grátis), devolvendo a primeira que responder — resiliência sem depender de uma única API. O system prompt é mantido com prefixo estável e cacheável pra baratear cada chamada, e o painel de revisão tem autenticação com hash bcrypt. Roda em produção na versão 1.7.

10 · Recuperação de demanda

Avise-me quando voltar: recupera a venda do produto esgotado

Pra sua loja: quem quis comprar e o produto estava esgotado é avisado assim que volta — e você recupera uma venda que ia embora calada.

O desafio

Produto esgotado é demanda comprovada que some sem deixar rastro. O cliente ia embora e não havia como chamá-lo de volta quando o estoque retornasse — a venda mais fácil da loja virava perda silenciosa.

O que construí

Um serviço que captura o interesse de quem clicou "avise-me quando voltar" no tamanho esgotado, registra esse contato marcado por tag no e-mail marketing e dispara o aviso automático assim que aquele tamanho específico volta ao estoque.

Stack

Node.jsShopify Admin APIActiveCampaignDocker Swarm

O resultado

Demanda de produto esgotado capturada e reativada por tamanho, transformando ruptura de estoque em venda recuperada.

Como funciona, em 3 passos

01 — Interesse

Cliente pede aviso

No tamanho esgotado, o "avise-me quando voltar" registra o contato.

02 — Marca

Tag no e-mail marketing

O contato entra etiquetado por produto e tamanho, pronto pra reativar.

03 — Avisa

Estoque voltou

Assim que aquele tamanho retorna, o aviso sai sozinho pra quem esperava.

Detalhe técnico: o serviço lê o estoque pela Shopify Admin API e cruza o retorno de cada variante específica (tamanho, não produto) com a lista de quem pediu aviso — o cliente que queria o 38 não é notificado quando volta o 42. O registro do interesse é feito por tag no ActiveCampaign, o que deixa o disparo do aviso rodar dentro do próprio fluxo de e-mail marketing da loja, sem construir uma régua de envio paralela. É a mesma demanda que a pré-venda ataca pela frente: um evita perder a venda antes do produto chegar, o outro recupera a venda depois que ele esgota.

E ainda

Outros sistemas que subi

App Shopify de carrinhos

Remix + Prisma + MariaDB, jobs em cron para reconciliar estado de carrinho e checkout.

Monitor de preços

Compara com Google Shopping e alerta no WhatsApp quando um concorrente muda de faixa.

SaaS multi-tenant

Mini-Shopify SSR, PII cifrada, SSL por domínio próprio de cada cliente.

Sync de estoque de kits

Webhook mantém kits coerentes em tempo real, evitando vender combo sem componente.

Portal B2B

PII AES-256-GCM por campo, CNPJ por HMAC para não expor documento em claro.

Conector de adspend

Consolida gasto Meta+Google para painéis, com normalização de fuso e moeda.

Feed do Google Shopping

Gera o feed de produtos da loja pro Merchant Center a partir da Shopify, atualizado sozinho.

Feed do Instagram no site

Espelha o feed do Instagram da marca no site, servido por serviço próprio.

Sincronizador de catálogo

Pagina todo o catálogo e os pedidos da Shopify a cada 6h com upsert idempotente e reconciliação de deleções.

Como roda em produção

Infraestrutura

Todo esse conjunto — BI, autopilot, storefront, retenção, tracking, CRM, fiscal, pré-venda e atendimento com IA — roda sobre Docker Swarm com Traefik como proxy reverso e TLS automático via Let's Encrypt, somando mais de 25 serviços em produção. A camada de servidor é hardenizada: SSH com acesso restrito, UFW e fail2ban ativos, headers de segurança aplicados nas respostas e portas administrativas liberadas só para IPs específicos. É a mesma disciplina de engenharia que sustenta o pico da Fiber sem cair.

Quer saber mais

Continue por aqui

Trajetória completa

Como cheguei da nutrição e suporte técnico até construir essa máquina — 4+ anos de estrada, na página Sobre mim →.

Automação para ecommerce

Autopilot de orçamento, recuperação de carrinho e tracking server-side como serviço — veja em Automação para ecommerce →.

Tráfego pago para ecommerce

Gestão de Meta e Google Ads sobre ROAS real, não sobre o número inflado do gerenciador — veja em Tráfego pago para ecommerce →.

Diagnóstico gratuito

Vamos olhar os números da sua loja

Sem intermediário e sem compromisso. Me chama no WhatsApp e a gente olha os seus números juntos — costumo responder no mesmo dia útil.

Prefere o direct? Instagram @rafaeltondin →