Sensse
em produçãoE-commerce próprio, do catálogo ao back-office
Loja de bem-estar sexual em produção: catálogo, checkout Pix e cartão, frete por CEP, estoque reservado junto com a cobrança e um back-office que os donos tocam sozinhos.
- Next.js 16
- TypeScript
- Tailwind v4
- PostgreSQL (Supabase)
- Row Level Security
- Mercado Pago
- Melhor Envio
- Vercel
// o caso
- problema
- A loja vendia por WhatsApp, uma conversa por vez — consultar preço, calcular frete, mandar chave Pix, conferir se caiu, anotar o estoque num caderno. Isso limita as vendas ao número de mensagens que uma pessoa consegue responder, e não deixa histórico do que sai nem de onde vem quem compra.
- solução
- Uma loja completa construída do zero em Next.js com Postgres próprio: catálogo com variações e estoque, busca, favoritos, carrinho, checkout com Pix (QR que expira) e cartão, frete por CEP com entrega no mesmo dia na região, área do cliente, blog editorial com painel de publicação, e um back-office que cobre pedidos, estoque com custo e validade, financeiro, cupons de influenciador e recuperação de carrinho.
- impacto
- Em produção em sensse.com.br, atendendo Belém, Ananindeua e Marituba com entrega no mesmo dia e o resto do Brasil pelos Correios. A operação inteira — produtos, estoque, despacho, financeiro e conteúdo — é tocada pelos donos no painel, sem desenvolvedor no meio.
// meu papel
Produto, arquitetura, front-end, back-end, banco de dados e deploy — sozinho. Incluindo o esquema e as políticas de RLS, as integrações de pagamento e transportadora, o back-office, e a operação do deploy.
// visão geral
A Sensse atende Belém e região com entrega no mesmo dia, e o resto do Brasil pelos Correios. Foi construída sem plataforma de e-commerce por dois motivos que são o mesmo motivo: a categoria é restrita na maior parte dos canais de anúncio pago e em parte dos gateways, então o tráfego precisa vir de busca e conteúdo — e a discrição do cliente é requisito de engenharia, não preferência. Uma solução de prateleira decide sozinha o que sai para ferramentas de terceiros, e aqui isso não podia ser decisão dela.
O resultado é uma aplicação Next.js única — loja, rotas de API e back-office no mesmo deploy — sobre Postgres com row-level security. Ela cobre o ciclo inteiro: o cliente encontra o produto, paga no Pix ou no cartão, o estoque é reservado enquanto a cobrança vive e baixado quando o pagamento confirma; o dono acompanha, despacha, lança custo e publica conteúdo pelo painel. As decisões que valem a leitura não estão nas telas, e sim nas regras que as sustentam — onde o desconto é calculado, o que pode chegar ao Google, quanto tempo uma reserva de estoque sobrevive.
// notas de engenharia
Dado sensível não sai de casa — e o custo foi aceito
Vida sexual é dado sensível pela LGPD, então nome, categoria e id de produto são tratados como informação que não pode chegar a terceiro. Toda rota é higienizada antes de qualquer evento sair — /produto/rosa-magica vira /produto/[slug] — e o título da página vira uma constante, porque o gtag anexa os dois sozinho a cada evento. Isso foi descoberto testando no navegador, não lendo documentação. A consequência é deliberada e real: o Google Analytics nunca dirá qual produto foi visto. Então o site conta por conta própria, no Postgres, uma linha por produto por dia, sem cookie, sem IP e sem sessão — o que torna o número anônimo e, de quebra, deixa ver quem recusou o banner de cookies e é invisível no GA4.
A regra do desconto mora em um lugar só
A loja dá 5% no Pix e aceita cupom de influenciador. Somados, um cupom de 10% entregaria 15% e, com a comissão em cima, abriria um quarto do preço. A regra virou "vale o maior, nunca a soma", escrita como função pura chamada tanto pelo servidor que cobra quanto pela tela que promete — porque quando o mesmo cálculo morava em dois lugares, ele divergiu, e cliente que vê um valor e paga outro abre chamado. O empate vai para o cupom de propósito: o cliente paga igual, mas só assim a venda fica rastreada ao influenciador que a trouxe. A mesma revisão pegou uma base de comissão errada na função do banco que lança a despesa — ela pagaria comissão sobre dinheiro que o cliente não pagou.
Estoque reservado no mesmo relógio da cobrança
Gerar a cobrança Pix reserva o estoque, e a reserva e a expiração da cobrança compartilham uma constante, num arquivo só. Se divergissem, existiriam os dois piores casos: cliente pagando um QR de um pedido já cancelado, ou estoque preso por uma cobrança morta. Um cron libera as reservas vencidas de minuto em minuto, e a baixa definitiva é FIFO por lote — cada entrada carrega seu custo e validade, que é o que permite ao painel financeiro dizer a margem real de um pedido em vez de estimar.
O age gate e a embalagem neutra como requisitos que moldaram o código
O portão de 18 anos é a primeira coisa que o visitante encontra, e quem desiste ali sai antes de aceitar cookies — invisível para qualquer analytics externo. Por isso existe um contador no servidor só para o portão: a única forma de saber quantas pessoas o site perde na porta. A promessa de embalagem neutra também virou código: sem nome de produto em e-mail transacional, em push, no assunto da mensagem de recuperação de carrinho ou nos modelos de WhatsApp — nesses modelos nem existe a variável de produto, então não há como citar o item por acidente. A regra virou estrutura em vez de disciplina.
Conteúdo como canal de aquisição, não enfeite
Como anúncio pago é restrito para a categoria, a camada editorial não é acessório — é o canal. O blog tem painel próprio de publicação (a sócia publica sem tocar em código), categorias, artigos servidos do CDN com revalidação, dados estruturados e sitemap. E existe exatamente uma página sobre a entrega em Belém, deliberadamente uma em vez de espalhar a cidade pelo site, porque a loja atende o Brasil inteiro e o local é diferencial, não identidade.