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

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.

Como roda em produção

Infraestrutura

Todo esse conjunto — BI, autopilot, storefront, retenção, tracking e CRM — roda sobre Docker Swarm com Traefik como proxy reverso e TLS automático via Let's Encrypt, somando 15 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 →