Auditoría y consultoría · Prijsvrij

CLS de 0,4 a 0,06 en un flujo de reserva de vacaciones

Los layout shifts estaban en el flujo de reserva, y la mayoría ocurrían después de la primera carga de la página.

1,8sLCP, antes 2,6s
0,06CLS, antes 0,4
160msINP, antes 215ms
ClientePrijsvrij, Prijsvrij.be y D-reizen, reserva de vacaciones
PlataformaUna single page application
ServicioAuditoría en marzo de 2026 y luego consultoría cada trimestre
El cliente

Una single page application con un flujo de reserva que se desplazaba

Prijsvrij es una web holandesa de viajes: buscar, comparar y reservar vacaciones. Todo el sitio es una single page application, y el mismo equipo gestiona Prijsvrij.be y D-reizen.

Pasé dos días de cuatro horas en sus oficinas. El primer día audité la web. El segundo revisé los resultados con el equipo y expliqué, paso a paso, cómo resolver primero los problemas más urgentes.

Página de inicio de Prijsvrij
Qué encontramos, qué hicimos

La primera pantalla, el flujo de reserva y los clics

La mayoría de los layout shifts ocurrían en soft navigations: la app cambia el contenido sin cargar una página nueva. Un análisis de Lighthouse en la página de inicio nunca los ve. Los visitantes reales que avanzan en una reserva, sí; y CrUX contabiliza esos layout shifts en la URL que abrieron primero.

Qué fallaba
Qué hicimos
LCP
El CSS estaba dividido de una forma que retrasaba la primera pantalla, los preloads apuntaban a archivos que la primera pantalla no necesitaba, se cargaban imágenes que la primera pantalla no mostraba y el hero solo se descubría al ejecutarse el JavaScript. Las etiquetas de terceros y las fuentes también cargaban demasiado pronto.
El hero recibió un preload y fetchpriority="high", y decidimos página por página qué va primero. El LCP pasó de 2,6 a 1,8 segundos.
CLS
Mientras la app obtenía los datos de las vacaciones, sobre todo los del vuelo, mostraba una animación de carga, y el contenido real desplazaba el resto al llegar. Entre pasos, las imágenes, los banners y los avisos hacían lo mismo.
Le dimos al estado de carga el tamaño final del bloque del vuelo, y dimensiones fijas a imágenes, banners y avisos. El CLS pasó de 0,4 a 0,06.
INP
Un clic en un filtro recalculaba y volvía a renderizar todos los resultados, el selector de fechas generaba meses de precios dentro del clic y cambiar de viajeros o habitaciones recalculaba la reserva entera. El tracking se ejecutaba dentro de esos mismos clics.
Enseñé a los desarrolladores en su propio código qué ejecutaba cada clic y cómo actualizar la pantalla primero para ejecutar el resto después. El INP pasó de 215 a 160 ms.
Flujo de reserva de Prijsvrij: la mayoría de los layout shifts ocurrían después de la primera carga, donde un análisis de Lighthouse en la página de inicio no mira
Después de la auditoría

Entregué la auditoría a finales de marzo de 2026 y la repasé con sus desarrolladores en Den Bosch el 15 de abril y online una semana después. El CLS fue la parte difícil, con más causas de lo habitual en una arquitectura así. Sus desarrolladores lo solucionaron en las tres webs, y en mayo el CLS en desktop pasó a verde en todas ellas.

0,100,250,13Mar 2026Abr0,38MayJunJulAgoSepOct0,06prijsvrij.nl, CLS en desktop, p75
0,100,12Mar 2026Abr0,20MayJunJulAgoSepOct0,05prijsvrij.be, CLS en desktop, p75
0,100,11Mar 2026Abr0,14MayJunJulAgoSepOct0,04d-reizen.nl, CLS en desktop, p75
Las tres webs en CrUX, de marzo a octubre de 2026. Una barra por semana; cada una representa los 28 días previos a esa fecha, p75. Verde es bueno, naranja necesita mejorar y rojo es deficiente.
Desde entonces

Una mañana de junio, su front-end lead me escribió. Llevaba semanas haciendo ajustes en prijsvrij.nl a partir de los datos de CoreDash a través de su conexión con Claude Code, y las gráficas iban en la dirección correcta. ¿Se podía meter también D-reizen? En menos de una hora, tanto D-reizen como Prijsvrij.be estaban ya en CoreDash.

Lo siguiente es el INP. Cuando lo revisé a finales de junio, reconocí el patrón: lo he visto muchas veces y se corrige con un plan paso a paso probado, siempre que cada paso se ejecute con total precisión. Eso resuelve la mayor parte. Solo entonces asoman los problemas de fondo, que siempre son menores. Así que propuse trabajar de forma más práctica: cambios pequeños y quirúrgicos, menos teoría y más acción. En julio nos reunimos en sus oficinas, comida incluida, y nos seguimos viendo cada trimestre.

El LCP en móvil sube durante las vacaciones, cuando gran parte del tráfico viene de usuarios que están de viaje. Se mantiene muy por debajo de los 2,5 segundos y ya está bajando de nuevo.

Qué aprendimos

Una animación de carga solo traslada el layout shift

La animación parecía cubrir la espera. El layout shift se producía en el momento en que dejaba paso a los detalles del vuelo.

El tracking en el clic penaliza cada clic

Una etiqueta en el handler del clic se ejecuta antes de que la pantalla pueda cambiar. Si se mueve a después de la actualización, el visitante ve el resultado primero y la etiqueta se ejecuta igualmente.

Una single page application cambia constantemente

Cada despliegue añade componentes y etiquetas que la última revisión nunca vio. Por eso vuelvo cada trimestre.

Arjen Karel

¿Layout shifts en una single page app que Lighthouse nunca ve?

Envíame la URL de tu flujo de reserva o checkout y lo recorreré haciendo clics igual que un visitante, soft navigations incluidas.

Prijsvrij: CLS de 0,4 a 0,06 en un flujo de reserva Core Web Vitals Prijsvrij: CLS de 0,4 a 0,06 en un flujo de reserva