Core Web Vitals
Zenovay recopila los Core Web Vitals de Google (LCP, CLS, INP) más dos métricas complementarias (FCP, TTFB) de cada sesión de visitante real. Los datos aparecen en la pestaña Performance del panel de cada dominio.
No requiere instalación. La recopilación de Web Vitals forma parte del tracker estándar de Zenovay. Si tu script de seguimiento ya está activo, los vitals empiezan a llegar en cuanto los visitantes carguen tus páginas.
Qué miden los Web Vitals
Los Core Web Vitals son las señales estables de Google para la experiencia real de la página. Aparecen en Google Search Console, influyen en el posicionamiento y se correlacionan fuertemente con la tasa de rebote y la conversión.
| Métrica | Qué mide | Bueno | Por mejorar | Malo |
|---|---|---|---|---|
| LCP — Largest Contentful Paint | Cuándo el contenido principal se vuelve visible | ≤ 2,5 s | ≤ 4,0 s | > 4,0 s |
| CLS — Cumulative Layout Shift | Cuánto se desplaza inesperadamente el contenido visible | ≤ 0,1 | ≤ 0,25 | > 0,25 |
| INP — Interaction to Next Paint | Peor demora entre un clic/toque y el siguiente render | ≤ 200 ms | ≤ 500 ms | > 500 ms |
| FCP — First Contentful Paint | Cuándo se renderiza el primer texto/imagen | ≤ 1,8 s | ≤ 3,0 s | > 3,0 s |
| TTFB — Time to First Byte | Cuándo llega el primer byte desde el servidor | ≤ 800 ms | ≤ 1,8 s | > 1,8 s |
Los umbrales siguen las recomendaciones publicadas por Google y se reflejan directamente en la codificación de colores del panel de Zenovay (verde / ámbar / rojo).
Cómo recopila los datos Zenovay
La recopilación ocurre íntegramente en el navegador mediante la API estándar PerformanceObserver y la entrada Navigation Timing — sin bibliotecas de terceros ni scripts adicionales.
Flujo resumido:
- En cuanto el tracker se inicializa, registra observers para
largest-contentful-paint,layout-shift,event(para INP) ypaint(para FCP). - TTFB se lee una sola vez desde
performance.getEntriesByType('navigation')[0].responseStart. - Los valores finales se agrupan en una sola carga y se envían a
POST /api/track/<tu-código-de-seguimiento>/performancecuando el visitante abandona la página (visibilitychange→ hidden, máspagehidepara el bfcache móvil). - La API etiqueta cada fila con
country_code,device_type,browsery, cuando esté disponible,connection_type.
La carga útil no contiene valores de formulario, ni contenido del DOM, ni PII más allá de lo que ya forma parte de un pageview analítico (la URL).
Una baliza por ciclo de vida de la página. Los vitals se envían exactamente una vez cuando el visitante deja una página. Las SPA que rutan en el cliente envían una baliza nueva por cada transición — igual que los eventos pageview.
Dónde ver tus datos
Abre cualquier dominio en app.zenovay.com y haz clic en la pestaña Performance.
Verás:
- Una barra lateral de métricas con el valor actual, la calificación por umbral y la distribución por percentil para LCP / CLS / INP / FCP / TTFB.
- Un panel de detalle con la tendencia de la métrica seleccionada en el rango horario elegido, más una explicación contextual de qué influye en ella.
- Desgloses por Rutas y Países mostrando qué páginas y qué regiones tienen peor rendimiento.
- Controles para:
- Dispositivo — Todos / Escritorio / Móvil
- Percentil — P75 / P90 / P95 / P99 (Google usa P75 por defecto)
- Rango horario — limitado por plan (ver abajo)
Orientación sobre percentiles
Google usa el percentil 75 de usuarios reales para las señales de posicionamiento en Search Console. Los percentiles superiores (P90, P95, P99) resaltan a tus visitantes más lentos — útiles al investigar una regresión específica o una cola de dispositivos lentos.
Disponibilidad por plan y retención
La recopilación de Web Vitals está incluida en todos los planes, incluido Free. El acceso al rango horario es escalonado por plan:
| Plan | Rango horario de Performance |
|---|---|
| Free | Últimos 7 días |
| Pro | Últimos 30 días |
| Scale | Últimos 90 días |
| Enterprise | Hasta 1 año |
Estos topes coinciden con los niveles más amplios de retención analítica — consulta Precios y límites de plan para las reglas subyacentes.
Desactivar Web Vitals para un sitio específico
Los vitals están activos por defecto. Para desactivarlos en un solo sitio rastreado, establece la feature flag en los ajustes de ese sitio:
{
"feature_flags": {
"enable_core_web_vitals": false
}
}
Cuando la flag está en false:
- El tracker omite el registro de los observers por completo (coste cero en el navegador).
- El endpoint API acepta la baliza pero no almacena nada (no-op silencioso para peticiones en curso).
Para reactivar, vuelve a poner la flag en true o elimínala (activada por defecto).
Preguntas frecuentes
¿Por qué falta INP en Safari?
Safari no implementó el tipo de entrada event de PerformanceObserver con interactionId hasta muy recientemente. En versiones antiguas de Safari, Zenovay informa LCP, CLS, FCP y TTFB y deja INP en null para esa sesión. El panel simplemente mostrará menos muestras de INP hasta que mejore la cobertura de Safari — no requiere acción por tu parte.
¿Las SPA reciben una baliza por cada cambio de ruta?
Sí. El tracker reinicia los observers en cada transición de página rastreada (incluidas las rutas SPA que disparan pushState o replaceState). Verás una fila de rendimiento por pageview, no una por sesión de navegador.
¿La recopilación de vitals afecta al rendimiento de mi sitio?
PerformanceObserver es una API de navegador pasiva diseñada exactamente para este caso de uso. Los observers se disparan en eventos existentes del navegador; no hay polling ni trabajo extra en el hilo principal. La única baliza al descargar la página se envía vía fetch con keepalive: true, por lo que no bloquea la navegación.
¿Por qué mis números no coinciden con los datos de CrUX de Google?
Dos razones normales:
- Población de muestra. Zenovay mide a cada visitante real que carga tu sitio. CrUX mide solo a usuarios de Chrome que han optado por la anonimización de URL — un subconjunto estricto.
- Ventana temporal. CrUX es una ventana móvil de 28 días, solo con datos de Chrome. Zenovay te permite elegir tu propia ventana y segmentar por dispositivo, percentil, ruta y país.
Ambas señales son válidas; responden preguntas ligeramente distintas. Google usa CrUX para posicionar; tú usas Zenovay para depurar.
¿Dónde encuentro los valores de umbral en el código?
Viven en app-zenovay/lib/api/performance.ts (constantes del frontend) y reflejan los umbrales publicados por Google. Cambiarlos requiere una actualización del código — no se exponen al cliente de forma deliberada, para que las etiquetas «Bueno» / «Por mejorar» / «Malo» sigan siendo comparables en todo el producto.
Solución de problemas con paneles vacíos
Si la pestaña Performance muestra el estado vacío («No performance data yet»):
- Verifica que el tracker dispara. Abre el diagnóstico Install Health. Si los pageviews no llegan, los vitals tampoco.
- Revisa la feature flag. Asegúrate de que
feature_flags.enable_core_web_vitalsno esté explícitamente enfalseen los ajustes del sitio. - Permite algo de tráfico. Las balizas de vitals se disparan al descargar la página. Un sitio con muy poco tráfico — o que pruebas solo tú con caché recién vaciada — puede necesitar varias sesiones antes de mostrar números.
- Amplía el rango horario. Un sitio nuevo en Free muestra por defecto los últimos 7 días — si acabas de instalarlo, amplía al máximo permitido por tu plan.
- Abre las DevTools → Red. Con el filtro
Performance, busca unPOSTa/api/track/<code>/performance. La respuesta es un pequeño JSON consuccess: true.
Si la petición se dispara pero no aparecen datos, contacta [email protected] con tu código de seguimiento — existe una flag de opt-out por sitio y podemos confirmar que no está establecida.
Relacionado
- Install Health — confirma que el tracker dispara
- Seguimiento en tiempo real — ver a los visitantes en cuanto llegan
- Cumplimiento de privacidad — qué datos envía el tracker y por qué