Un píxel AEO es el equivalente analítico de Google Analytics para el tráfico de agentes. Detecta cuando los agentes LLM (ChatGPT-User, ClaudeBot, PerplexityBot, OAI-SearchBot) recuperan su página durante la sesión de IA de un usuario. Este tutorial conecta un píxel AEO mínimo que informa a su backend y clasifica los UA desconocidos mediante la búsqueda inversa de Scavio.
Requisitos previos
- Nodo 20+ backend o tiempo de ejecución perimetral
- Una clave API de Scavio
- Un destino de registro simple (Supabase, SQLite, PostHog)
Guia paso a paso
Paso 1: Agregue el middleware de píxeles
Ejecute un middleware que inspeccione cada página HTML recuperada.
export async function aeoPixel(req, res, next) {
const ua = req.headers['user-agent'] || '';
const type = classify(ua);
if (type !== 'human') await log({ ua, path: req.path, type, ts: Date.now() });
next();
}Paso 2: Clasificar agentes conocidos
Lista codificada de UA de agentes documentados.
const KNOWN = [/ChatGPT-User/, /GPTBot/, /ClaudeBot/, /PerplexityBot/, /OAI-SearchBot/];
function classifyKnown(ua) {
return KNOWN.find(r => r.test(ua))?.source || null;
}Paso 3: Búsqueda inversa de UA desconocidos con Scavio
La búsqueda de Scavio confirma si una UA desconocida es un bot documentado.
async function reverseLookup(ua) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: `\"${ua}\" bot user agent` })
});
const d = await r.json();
return d.organic_results?.some(o => /bot|crawler/i.test(o.snippet)) ? 'suspected_agent' : 'human';
}Paso 4: Iniciar sesión en Supabase
Una fila por agente golpeado.
import { createClient } from '@supabase/supabase-js';
const supa = createClient(URL, KEY);
export const log = (row) => supa.from('aeo_pixel').insert(row);Paso 5: Crear un panel
Visitas diarias por agente, tendencia en el tiempo.
-- Supabase SQL
SELECT DATE(ts), type, COUNT(*) FROM aeo_pixel GROUP BY 1, 2 ORDER BY 1;Ejemplo en Python
import os, requests, re
API_KEY = os.environ['SCAVIO_API_KEY']
KNOWN = [r'ChatGPT-User', r'GPTBot', r'ClaudeBot', r'PerplexityBot']
def classify(ua):
for p in KNOWN:
if re.search(p, ua): return p
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY}, json={'query': f'"{ua}" bot'})
return 'suspected_agent' if r.json().get('organic_results') else 'human'
print(classify('ClaudeBot/2.0'))Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
const KNOWN = [/ChatGPT-User/, /GPTBot/, /ClaudeBot/, /PerplexityBot/];
export async function classify(ua) {
const m = KNOWN.find(r => r.test(ua));
if (m) return m.source;
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: `"${ua}" bot` })
});
const d = await r.json();
return d.organic_results?.length ? 'suspected_agent' : 'human';
}Salida esperada
Dashboard showing daily AEO pixel hits split by agent. B2B sites typically see 100-1000 agent hits per 1000 human sessions by Q2 2026.