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 servicios locales tiene clientes esperando en Google Maps. Nadie tiene tiempo para buscarlos manualmente uno por uno. BlipLeads realiza este rastreo, prioriza a quienes realmente necesitan ayuda y los entrega listos para que el equipo de ventas los contacte.

En Producción SaaS Multi-tenant

Galería del Producto

La promesa central del producto: el próximo cliente ya está listado en Google, solo falta contactarlo.

Conozca más sobre la arquitectura técnica

¿Quiere entender cómo se construyó esto por debajo? Abra la inmersión técnica a continuación.

expand_more

Visión Técnica

Google Maps ya muestra quién necesita ayuda: sin sitio web, sin respuesta en WhatsApp, baja calificación o comentarios sin contestar. BlipLeads rastrea Maps por nicho y región, prioriza a los prospectos con mayor probabilidad de cierre y entrega el lead listo con un pitch de WhatsApp redactado, organizado en un tablero Kanban.

Tecnologías Principales

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

El Desafío

Extraer datos de Google es la parte sencilla. Lo difícil es transformarlo en un pipeline de ventas B2B capaz de atender a múltiples clientes en simultáneo sin agotar límites de API, mezclar cuentas o congelarse en búsquedas prolongadas:

  • / Procesar búsquedas de larga duración (Google Places + sondeo de sitios) sin bloquear la solicitud HTTP, mediante jobs asíncronos.
  • / Aislar datos por tenant (campañas, leads, métricas) y por rol de usuario (owner/admin/operator/viewer).
  • / Evitar leads duplicados por tenant incluso con múltiples campañas activas para el mismo nicho y región.
  • / Detectar automáticamente sitios web 'inactivos' listados en Google, transformando un falso positivo en una oportunidad de venta.
check_circle

La Solución

El flujo es campaña → job → lead. Crear una campaña publica un job en Upstash QStash, que dispara la búsqueda de forma asíncrona — sin congelar la página. La rutina normaliza teléfonos, verifica si el sitio listado está verdaderamente activo, calcula el puntaje de prioridad y guarda todo con índices únicos por cuenta. Dos clientes ejecutando campañas para el mismo nicho no duplican leads.

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;
}

Infraestructura

architecture

Deploy & Jobs Assíncronos

Next.js en Vercel, Postgres en Neon, cola de jobs en Upstash QStash. El scraping se ejecuta fuera del ciclo de la solicitud — nunca bloquea a los usuarios del producto.

Proyecto Anterior 3R Barber
Próximo Proyecto Próximamente
rocket_launch