Construí un Monitor de Marca con IA que Rastrea Todos los LLM
El equipo de marketing de Freshdesk tenía un problema que no sabía que tenía.
Su producto estaba siendo recomendado por Google Search. Pero cuando alguien abría ChatGPT —que ahora maneja 900 millones de usuarios activos semanales— y escribía "¿cuál es la mejor herramienta de soporte al cliente para un equipo de 50 personas?", Freshdesk no aparecía en la respuesta. Gorgias sí. Zendesk sí. Intercom sí. ¿Freshdesk? Invisible.
Ese es el problema que me propuse resolver con una sola sesión de programación, una app de Next.js y una API de scraping. Una aplicación funcional que consulta ChatGPT, Perplexity, Gemini, Grok, Copilot y Google Search para cualquier nombre de marca — y luego te dice exactamente dónde apareces, dónde no, y cómo es el sentimiento cuando sí apareces.
Por Qué el Posicionamiento en Google Ya No Cuenta Toda la Historia
Se espera que el volumen de búsquedas en motores de búsqueda caiga un 25% para 2026 a medida que los usuarios migran a chatbots de IA. ChatGPT por sí solo superó los 1.000 millones de usuarios activos mensuales estimados en enero de 2026.
Los LLM no rankean páginas. Recomiendan marcas. Y hay menos de 1 posibilidad entre 100 de que ChatGPT dé la misma lista de recomendaciones de marcas en dos respuestas a la misma pregunta.
Herramientas comerciales como Otterly.ai, el AI Visibility Toolkit de Semrush y Siftly cobran entre $200 y $500 al mes por este monitoreo. Pero yo quería entender la mecánica construyéndolo yo mismo.
El Problema de API vs. Navegador que Nadie te Advierte
La respuesta que obtienes de la API de ChatGPT no es la misma que ve un usuario en el navegador. La aplicación web añade optimizaciones adicionales — formato de citas, vinculación de fuentes, reestructuración de respuestas. La API entrega una respuesta sin procesar. El navegador entrega una experiencia curada con fuentes y contexto.
Y Copilot no tiene ninguna API pública. Tienes que ver lo que muestra la interfaz real del navegador.
La geolocalización agrega otra capa. Un usuario en Londres que le pregunta a Perplexity "mejor herramienta de gestión de proyectos" obtiene resultados distintos que un usuario en San Francisco. Las llamadas a la API no capturan esa variación. El scraping de la interfaz de usuario sí.
Esto acabó con mi plan de "simplemente llamar a las APIs" en la primera hora. Para ver lo que ven los usuarios reales, hay que hacer scraping de la interfaz de usuario real.
Ahí fue donde Bright Data entró en la construcción.
Los Scrapers de IA de Bright Data
El scraper de IA de Bright Data: scrapers preconfigurados para plataformas de IA que devuelven datos estructurados — texto de respuesta, fuentes, citas — desde las interfaces web orientadas al usuario de ChatGPT, Gemini, Copilot, Perplexity y Google SERP.
Los precios comienzan en $0.001 por registro.
El scraping de plataformas de IA no es instantáneo. El scraper carga la página, espera a que el modelo genere su respuesta (10-30 segundos) y luego extrae el resultado. Si el scraping tarda más de 60 segundos, Bright Data devuelve un ID de snapshot. Se consulta ese ID con solicitudes GET hasta que el resultado esté listo.
Este es el patrón trigger-poll-download, y fue el que fundamentalmente moldeó la arquitectura de la app.
El Stack: Next.js, SQLite, Drizzle y un Agente de Programación
- Next.js con React para el frontend y las rutas de API
- SQLite con Drizzle ORM para persistencia local
- Bright Data API para hacer scraping de las seis plataformas
- Claude Code como agente de programación principal (con un cambio a Cursor a mitad del proceso)
Tres tablas: brands, scans y results. Cada resultado almacena el nombre del proveedor, el estado de mención, el sentimiento, el texto de respuesta sin procesar y cualquier fuente.
Lo que Salió Mal: Los Modos de Fallo de la Primera Arquitectura
Problema 1: Cascadas de timeout. Cuando el scraping de un proveedor tardaba demasiado, todo el escaneo fallaba.
Problema 2: Sin recuperación. Si cerraba mi laptop, todos los escaneos en progreso desaparecían.
Problema 3: Límites de tasa. Múltiples escaneos simultáneos chocaban contra límites de tasa sin un reintento limpio.
Inngest: La Cola en Segundo Plano que Arregló Todo
Antes (frágil):
- El usuario hace clic en "Escanear"
- La ruta de API activa los seis scrapers de forma sincrónica
- Espera todos los resultados o se agota el tiempo
Después (durable):
- El usuario hace clic en "Escanear"
- La ruta de API envía un evento a Inngest
- Inngest activa los seis scrapers en paralelo, cada uno como un paso separado
- Cada paso maneja su propio ciclo de polling de forma independiente
- Los resultados se escriben en SQLite a medida que se completan
- El frontend consulta las actualizaciones y renderiza los resultados de forma incremental
export const scanBrand = inngest.createFunction(
{
id: "scan-brand",
concurrency: { limit: 3 },
},
{ event: "brand/scan.requested" },
async ({ event, step }) => {
const { brandName, prompt, providers } = event.data;
const results = await Promise.allSettled(
providers.map((provider) =>
step.run(`scrape-${provider}`, async () => {
const snapshot = await triggerScrape(provider, prompt);
const result = await pollForResult(snapshot.id);
const analysis = analyzeMention(result, brandName);
await saveResult(brandName, provider, analysis);
return analysis;
})
)
);
return results;
}
);
El Cambio de Claude Code a Cursor
Cambié a Cursor ejecutando Opus 4.6 a la mitad del proceso. El problema era mi ingeniería de contexto — al alimentar documentación de múltiples proveedores a un agente de programación, hay que estructurar el trabajo como tareas secuenciales, cada una con únicamente la documentación del proveedor relevante.
Manejo de los Seis Proveedores
ChatGPT: Requiere prompt. country opcional para geolocalización.
Perplexity: Requiere prompt. Devuelve citas en línea.
Gemini AI Mode: Requiere tanto url como prompt.
Grok: Requiere prompt.
Copilot: Requiere url. No existe API pública.
Google SERP: Requiere query (no prompt).
const PROVIDER_CONFIG = {
chatgpt: {
datasetId: process.env.BRIGHTDATA_CHATGPT_ID,
buildPayload: (prompt: string, country?: string) => ({
prompt,
...(country && { country }),
}),
},
perplexity: {
datasetId: process.env.BRIGHTDATA_PERPLEXITY_ID,
buildPayload: (prompt: string) => ({ prompt }),
},
copilot: {
datasetId: process.env.BRIGHTDATA_COPILOT_ID,
buildPayload: (prompt: string) => ({
url: "https://copilot.microsoft.com",
prompt,
}),
},
};
Lo que Haría Diferente
Empezar con Inngest desde el principio. Construir primero la versión sincrónica me costó cuatro horas de trabajo adicional.
Simplificar el esquema de la base de datos. Los datos sin procesar pueden vivir como un blob JSON.
Construir el sistema de programación desde el primer día. Los escaneos únicos son útiles. Rastrear cambios a lo largo del tiempo es valioso.
Manejo de errores más granular. "Error de límite de tasa" → reintentar en 30 segundos. "Elemento no encontrado" → la interfaz cambió, notificarme.
El Caso de Negocio
Empresas como Otterly.ai y Siftly cobran entre $200 y $500 al mes por el monitoreo de LLM. La brecha de visibilidad entre el SEO tradicional y las recomendaciones de IA es real.
Los LLM priorizan la relevancia semántica y la claridad estructural por encima de la autoridad de dominio por sí sola. Un comentario de Reddit bien estructurado o una reseña detallada en un blog de nicho puede influir en una recomendación de LLM más que una página de inicio con DA-90.
Extendiendo el Sistema
Escaneos programados usando el disparador cron de Inngest:
export const scheduledScan = inngest.createFunction(
{ id: "scheduled-brand-scan" },
{ cron: "0 */6 * * *" },
async ({ step }) => {
const brands = await step.run("get-brands", () =>
db.select().from(brands).where(eq(brands.active, true))
);
for (const brand of brands) {
await step.sendEvent("trigger-scan", {
name: "brand/scan.requested",
data: { brandName: brand.name, prompt: brand.defaultPrompt, providers: brand.providers },
});
}
}
);
Alertas: Notificación de Slack: "Tu marca fue mencionada por ChatGPT ayer pero no aparece hoy para 'mejor CRM para startups'."
Análisis de tendencias: "Cuando publiqué ese artículo comparativo, ¿aumentó mi tasa de mención en LLM?"
El Patrón Listo para Producción que Vale la Pena Copiar
La combinación de Bright Data + Inngest + Next.js maneja la parte más difícil del desarrollo backend: hacer que las cosas poco confiables sean confiables.
Deja de intentar hacer que las llamadas externas poco confiables sean confiables solo a través del manejo de errores. Usa un motor de flujo de trabajo que trate la falta de confiabilidad como el estado predeterminado, y construye tu lógica como una serie de pasos individualmente duraderos.
Preguntas Frecuentes
¿Qué es el monitoreo de marca con IA y por qué importa?
Rastrea cómo las plataformas de IA como ChatGPT, Perplexity y Gemini mencionan tu marca cuando los usuarios piden recomendaciones.
¿Se puede usar la API de ChatGPT en lugar de hacer scraping?
Las respuestas de la API difieren significativamente de la interfaz del navegador. El scraping captura lo que ven los usuarios reales.
¿Cuánto cuesta ejecutarlo?
Bright Data comienza en $0.001 por registro. Para 10 marcas en 6 proveedores diariamente, aproximadamente $54/mes — mucho menos que las alternativas comerciales de $200-$500/mes.
¿Por qué cambian las recomendaciones de marcas de los LLM entre consultas?
Las respuestas de los LLM son no deterministas. Hay menos de 1 posibilidad entre 100 de que ChatGPT dé la misma lista de marcas en dos prompts idénticos.
¿Qué es el patrón trigger-poll-download?
Un flujo de trabajo asincrónico donde se activa una operación de larga duración, se consulta su finalización y luego se descarga el resultado cuando está listo.
Trabajemos Juntos
- Fiverr: fiverr.com/s/EgxYmWD
- Portfolio: mejba.me
- Ramlit Limited: ramlit.com
- ColorPark: colorpark.io
- xCyberSecurity: xcybersecurity.io