Auditoria e consultoria · Prijsvrij

CLS de 0,4 para 0,06 num fluxo de reserva de férias

Os layout shifts estavam no fluxo de reserva, e a maioria acontecia depois do primeiro carregamento da página.

1,8sLCP, era 2,6s
0,06CLS, era 0,4
160msINP, era 215ms
ClientePrijsvrij, Prijsvrij.be e D-reizen, reservas de férias
PlataformaUma single page application
ServiçoAuditoria em março de 2026, depois consultoria todos os trimestres
O cliente

Uma single page application com um fluxo de reserva que saltava

A Prijsvrij é um site de viagens neerlandês: pesquisar, comparar e reservar férias. Todo o site é uma single page application, e a mesma equipa gere o Prijsvrij.be e o D-reizen.

Passei dois dias de 4 horas no local. No primeiro dia auditei o site. No segundo dia analisei os resultados com a equipa e expliquei, passo a passo, como resolver primeiro os problemas mais urgentes.

Prijsvrij homepage
O que encontrámos, o que fizemos

O primeiro ecrã, o fluxo de reserva e os cliques

A maioria dos layout shifts acontecia em soft navigations: a app troca o conteúdo sem carregar uma nova página. Um teste do Lighthouse à homepage nunca os vê. Já os visitantes reais que avançam na reserva sentem esses shifts, e o CrUX conta-os no URL que abriram primeiro.

O que estava mal
O que fizemos
LCP
O CSS estava dividido de forma a atrasar o primeiro ecrã, os preloads apontavam para ficheiros de que o primeiro ecrã não precisava, carregavam-se imagens que o primeiro ecrã não mostrava e o hero só era descoberto depois de o JavaScript correr. As tags de terceiros e as fontes também carregavam cedo demais.
O hero recebeu um preload e fetchpriority="high", e definimos página a página o que carrega primeiro. O LCP passou de 2,6 para 1,8 segundos.
CLS
Enquanto a app obtinha os dados das férias, sobretudo do voo, mostrava uma animação de carregamento, e o conteúdo real empurrava tudo ao chegar. Entre passos, as imagens, os banners e os avisos faziam o mesmo.
O estado de carregamento passou a ter o tamanho final do bloco do voo, e as imagens, banners e avisos ganharam dimensões fixas. O CLS passou de 0,4 para 0,06.
INP
Um clique num filtro recalculava e voltava a renderizar todos os resultados, o date picker construía meses de preços dentro do clique e a escolha de passageiros ou quartos recalculava a reserva inteira. O tracking corria dentro desses mesmos cliques.
Mostrei aos developers, no próprio código deles, o que cada clique executava e como atualizar primeiro o ecrã e correr o resto depois. O INP passou de 215 para 160 ms.
Prijsvrij's booking flow: most layout shifts happened after the first load, where a Lighthouse run of the homepage doesn't look
Após a auditoria

Entreguei a auditoria no final de março de 2026 e analisei-a com os developers deles em Den Bosch a 15 de abril e online uma semana depois. O CLS foi a parte difícil, com mais causas do que o habitual num setup deste tipo. Os developers resolveram o problema nos três sites e, em maio, o CLS em desktop ficou verde em todos eles.

0,100,250,13Mar 2026Abr0,38MaiJunJulAgoSetOut0,06prijsvrij.nl, CLS no desktop, p75
0,100,12Mar 2026Abr0,20MaiJunJulAgoSetOut0,05prijsvrij.be, CLS no desktop, p75
0,100,11Mar 2026Abr0,14MaiJunJulAgoSetOut0,04d-reizen.nl, CLS no desktop, p75
Os três sites no CrUX, de março a outubro de 2026. Uma barra por semana, cada uma correspondente aos 28 dias até essa data, p75. Verde é bom, laranja precisa de melhorias, vermelho é fraco.
Desde então

Numa manhã de junho, o lead de front-end deles enviou-me um email. Tinha passado as últimas semanas a afinar o prijsvrij.nl com base nos dados do CoreDash através da ligação ao Claude Code, e os gráficos estavam a ir na direção certa. O D-reizen também podia entrar? Em menos de uma hora, o D-reizen e o Prijsvrij.be estavam ambos no CoreDash.

A seguir vem o INP. Quando o analisei no final de junho, reconheci o padrão: já o vi muitas vezes, e um plano passo a passo comprovado resolve-o, desde que cada passo seja executado com rigor. Isso resolve a maior parte. Só depois é que os problemas subjacentes aparecem, e esses são sempre mais pequenos. Por isso sugeri trabalharmos de forma mais prática: alterações pequenas e cirúrgicas, menos teoria, mais ação. Em julho estivemos no escritório deles, com almoço incluído, e continuamos a reunir-nos todos os trimestres.

O LCP no telemóvel sobe nas férias, quando grande parte do tráfego vem de pessoas que estão elas próprias de férias. Mantém-se bem abaixo dos 2,5 segundos e já está a descer novamente.

O que aprendemos

Uma animação de carregamento só desloca o layout shift

A animação parecia cobrir a espera. O layout shift surgia no momento em que dava lugar aos detalhes do voo.

O tracking no clique penaliza todos os cliques

Uma tag no click handler corre antes de o ecrã poder mudar. Passada para depois da atualização, o visitante vê primeiro o resultado e a tag corre na mesma.

Uma single page application está sempre a mudar

Cada release adiciona componentes e tags que a última verificação nunca viu. É por isso que volto todos os trimestres.

Arjen Karel

Layout shifts numa single page application que o Lighthouse nunca vê?

Envie-me o URL do seu fluxo de reserva ou checkout e percorro-o como faz um visitante, soft navigations incluídas.

Prijsvrij: CLS de 0,4 para 0,06 num fluxo de reserva Core Web Vitals Prijsvrij: CLS de 0,4 para 0,06 num fluxo de reserva