E-commerce

Beliscou

Tralha de pesca em Sinop - MT

Loja virtual de artigos de pesca em Sinop - MT: varas, molinetes, carretilhas, iscas e acessórios, com catálogo, carrinho, blog e painel administrativo. Receba em casa ou combine a retirada.

ver detalhes técnicos
Página inicial com as vantagens da loja e acesso rápido às categorias

O desafio

Uma loja de pesca de Sinop - MT, 100% online, precisava de vitrine própria: catálogo com preços claros e pedidos organizados, sem abrir mão do atendimento pelo WhatsApp, que é como o cliente da região prefere comprar.

O que foi feito

  • Catálogo com categorias, busca, filtro por peixe-alvo, marcas e variações de produto (como manivela esquerda ou direita)
  • Carrinho que fecha o pedido no WhatsApp com a mensagem pronta e o preço conferido no servidor
  • Desconto no Pix e frete grátis em Sinop acima de um valor mínimo, calculados automaticamente no carrinho e no pedido
  • Painel pensado para o celular: cadastro de produtos e fotos, marcas, avaliações e acompanhamento dos pedidos
  • Blog de dicas de pesca e SEO local para aparecer nas buscas da região
  • Páginas de privacidade, termos e trocas, e proteção contra robôs no cadastro e no fechamento do pedido

Resultado

Loja no ar desde 8 de outubro de 2026. O catálogo é atualizado pelo celular e cada pedido chega já organizado no WhatsApp, com código próprio e o total que o cliente viu na tela.

Telas do projeto

Catálogo com filtros por categoria e peixe-alvo e preço no Pix em cada produto
Catálogo com filtros por categoria e peixe-alvo e preço no Pix em cada produto
Página de produto com variações, galeria de fotos e dúvida direto no WhatsApp
Página de produto com variações, galeria de fotos e dúvida direto no WhatsApp
Fechamento do pedido: itens, dados de contato, entrega ou retirada e busca de CEP
Fechamento do pedido: itens, dados de contato, entrega ou retirada e busca de CEP
Blog com dicas e pontos de pesca da região, para atrair quem busca no Google
Blog com dicas e pontos de pesca da região, para atrair quem busca no Google
A loja no celular, com busca e categorias sempre à mão
A loja no celular, com busca e categorias sempre à mão
Catálogo no celular, com filtros recolhidos num botão
Catálogo no celular, com filtros recolhidos num botão
Preço, desconto no Pix, frete e escolha da variação antes de comprar
Preço, desconto no Pix, frete e escolha da variação antes de comprar
Carrinho mostra quanto falta para o frete grátis e o total no Pix
Carrinho mostra quanto falta para o frete grátis e o total no Pix

// por dentro

Como foi construído

Aplicação Next.js 16 com App Router e Cache Components: a vitrine e o blog são pré-renderizados com "use cache" e cacheTag, e o que depende da requisição (menu do usuário, filtros, carrinho) faz streaming dentro de Suspense. Toda escrita passa por Server Actions validadas com Zod, que acessam o Postgres do Supabase diretamente via Drizzle ORM; a Data API do Supabase fica fechada por RLS sem policies. O login é feito pelo Firebase Auth (e-mail/senha e Google) e trocado por um cookie de sessão httpOnly no servidor, com o papel de administrador num custom claim. O carrinho vive no navegador (Zustand + localStorage), mas preço, estoque e frete são sempre recalculados no servidor no fechamento do pedido.

Front-end
Next.js 16.3 (App Router, Cache Components, Partial Prefetching, typed routes)React 19.2Tailwind CSS 4shadcn/ui (Radix)Zustand 5
Back-end
Server Actions e Route HandlersZod 4 para validaçãoDrizzle ORM 0.45 com o driver postgres.js
Banco e arquivos
Supabase Postgres (7 migrações versionadas com drizzle-kit) e Supabase Storage para as fotos
Autenticação
Firebase Auth (cliente) + Firebase Admin SDK (cookie de sessão e custom claims)
Integrações
WhatsApp (link com mensagem pronta)Cloudflare TurnstileResend (e-mail de novo pedido)Mercado Pago e Focus NFe (ligados por variável de ambiente)
Infra e qualidade
Vercel e Vercel AnalyticsPWA com service worker próprioTypeScript strict e ESLint

Segurança

Preço conferido no servidor

O carrinho do navegador nunca é fonte de verdade: a Server Action de checkout busca cada produto e variação no banco, bloqueia o pedido se algo saiu do catálogo ou se o estoque não cobre a quantidade, e recalcula desconto do Pix e frete com as mesmas funções puras que a vitrine usa para exibir o preço. O código curto do pedido é UNIQUE no banco e o insert usa ON CONFLICT DO NOTHING com nova tentativa em caso de colisão.

Dados

Banco fechado para a API pública

Todas as tabelas têm RLS ligado e nenhuma policy, então a chave publicável do Supabase não lê nem escreve nada; só o servidor Next.js, conectado direto ao Postgres, acessa os dados. O bucket de imagens é de leitura pública, mas aceita apenas PNG, JPEG e WebP até 5 MB (SVG fica de fora por poder carregar script), e o upload só acontece por URL assinada gerada depois de verificar o administrador.

Arquitetura

Autorização junto ao dado, não só no proxy

O proxy.ts do Next 16 faz apenas uma checagem otimista da existência do cookie, sem chamada de rede. A verificação real fica em requireAdmin()/assertAdmin(), chamadas em cada página e Server Action do painel, porque Server Actions são endpoints POST públicos. O papel de administrador é um custom claim assinado pelo Firebase, e a verificação do cookie de sessão usa checkRevoked para derrubar sessões revogadas.

Performance

Vitrine em cache com revalidação por tag

Com cacheComponents ligado, as leituras públicas usam "use cache" e cacheTag; quando o lojista salva um produto ou post, a Server Action chama revalidateTag() e só aquele conteúdo é reconstruído. Páginas de produto não são geradas no build: com partialPrefetching, a primeira visita recebe o App Shell na hora e a página completa entra em cache em seguida.

Segurança

Webhook de pagamento que não confia no corpo

A integração com o Mercado Pago valida o header x-signature, reconsulta o pagamento na API antes de marcar qualquer coisa, confere se o valor bate com o total gravado no pedido e é idempotente para lidar com reenvios. A baixa de estoque roda numa transação condicionada a uma flag no pedido, então não é aplicada duas vezes.

SEO

SEO local e conteúdo para IA

Dados estruturados schema.org (OnlineStore com endereço e área atendida, Product, BlogPosting e WebSite com SearchAction), sitemap dinâmico, robots, imagem Open Graph gerada no servidor e canonical por página. A loja também publica /llms.txt e /llms-full.txt, gerados a partir do catálogo em cache e marcados com X-Robots-Tag: noindex.

Quer um projeto como este?

Conte o que você precisa e receba uma proposta sem compromisso.

Pedir orçamento