Sylvino Prevot
Case Study // 003

BlipLeads

Next.js 16 (App Router + Turbopack)NextAuth v5 + Drizzle AdapterDrizzle ORM + Neon PostgresUpstash QStash (jobs assíncronos)

Toda empresa de serviço local tem cliente esperando no Google Maps. Ninguém tem tempo de garimpar isso um por um. O BlipLeads faz essa varredura, prioriza quem precisa de ajuda de verdade e entrega pronto pro time de vendas abordar.

Em Produção SaaS Multi-tenant

Galeria do Produto

A promessa central do produto: o próximo cliente já está listado no Google, só falta alguém ligar.

Saiba mais sobre a arquitetura técnica

Quer entender como isso foi construído por baixo do capô? Abra o mergulho técnico abaixo.

expand_more

Visão Técnica

O Google Maps já mostra quem precisa de ajuda: sem site, sem WhatsApp respondendo, nota baixa, comentário sem resposta. O BlipLeads varre o Maps por nicho e região, prioriza quem tem mais chance de fechar e entrega o lead pronto, com pitch de WhatsApp escrito, organizado num Kanban.

Tecnologias Principais

Next.js 16 (App Router + Turbopack) rocket_launch
NextAuth v5 + Drizzle Adapter lock
Drizzle ORM + Neon Postgres database
Upstash QStash (jobs assíncronos) bolt
dnd-kit (Kanban) view_kanban
Tailwind CSS v4 format_paint
warning

O Desafio

Ler dado do Google é a parte fácil. O difícil é virar isso numa esteira de vendas B2B que aguenta vários clientes ao mesmo tempo sem estourar limite de API, misturar conta de um com a de outro, ou travar numa busca demorada:

  • / Processar buscas de longa duração (Google Places + probe de site) sem bloquear a requisição HTTP, via jobs assíncronos.
  • / Isolar dados por tenant (campanhas, leads, métricas) e por papel de usuário (owner/admin/operator/viewer).
  • / Evitar leads duplicados por tenant mesmo com múltiplas campanhas rodando para o mesmo nicho e região.
  • / Detectar automaticamente sites 'mortos' listados no Google, transformando um falso positivo em uma oportunidade de venda.
check_circle

A Solução

O fluxo é campanha → job → lead. Criar campanha publica um job no Upstash QStash, que dispara a busca de forma assíncrona — sem travar a página. A rotina normaliza o telefone, testa se o site listado está mesmo no ar, calcula o score de prioridade e grava tudo com índice único por conta. Dois clientes rodando campanha pro mesmo nicho não duplicam lead.

src/lib/scoring.ts
export function calculatePriorityScore(input: ScoringInput): number {
  let score = 0;

  if (!input.websiteUri) score += 30;

  if (input.rating != null) {
    score += (input.rating / 5) * 20;
  }

  if (input.reviewCount != null && input.reviewCount > 0) {
    score += Math.min(25, Math.log10(input.reviewCount + 1) * 15);
  }

  if (input.businessStatus === 'OPERATIONAL') {
    score += 5;
  }

  return Math.round(score * 100) / 100;
}

Infraestrutura

architecture

Deploy & Jobs Assíncronos

Next.js na Vercel, Postgres na Neon, fila de jobs no Upstash QStash. O scraping roda fora do ciclo da requisição — nunca trava quem está usando o produto.

Projeto Anterior 3R Barber
Próximo Projeto Em Breve
rocket_launch