01 / Problema
Um aluguel de campers vende principalmente para turistas estrangeiros que comparam pelo celular, às vezes do exterior e com pressa. Precisa mostrar disponibilidade real, cobrar sem intermediários e aparecer em vários idiomas. E a auditoria no celular de agosto de 2026 mostrou que a imagem principal levava quase cinco segundos para aparecer na tela, não pelo peso, mas por esperas evitáveis.
02 / Contexto
Contexto
A auditoria dividiu o problema em partes mensuráveis. A espera até a imagem principal começar a carregar respondia por 65% do atraso, porque o elemento não existia até a página ser hidratada. A isso se somavam dois contêineres de analítica em paralelo, um redirecionamento da raiz para o espanhol que custava cerca de 700 ms e imagens carregadas de domínios de terceiros.
Ver o serviço de web design ↗ 03 / Solução
Como resolvemos
O site foi construído com Next.js sobre Supabase e Stripe. A disponibilidade é lida de uma view diária por veículo e sincronizada com calendários externos via iCal. O preço é recalculado no servidor antes de criar o pagamento, e o próprio banco de dados impede que duas reservas se sobreponham. Depois da auditoria, as causas encontradas foram corrigidas no código, uma por uma.
Fluxo
- 01
Restrição de exclusão no Postgres para que duas reservas não possam se sobrepor
- 02
Preço recalculado no servidor, sem confiar no total enviado pelo navegador
- 03
Checkout com chave de idempotência e webhook com assinatura verificada
- 04
Hero renderizado no servidor com prioridade alta em vez de esperar a hidratação
- 05
Hreflang por idioma com x-default e sitemap com data de modificação real
Eixos do trabalho
Reservas que não se sobrepõem
O overbooking é evitado no banco de dados, não na interface. Mesmo que dois pagamentos cheguem ao mesmo tempo, o Postgres rejeita o segundo.
- Intervalos de datas com restrição de exclusão
- Sincronização iCal idempotente com outros canais
- Reservas pendentes de pagamento reaproveitadas, não duplicadas
Desempenho tratado pelas causas
Cada correção responde a um achado medido na auditoria, não a uma lista genérica de boas práticas.
- Um só contêiner de analítica em vez de dois
- Reescrita na raiz em vez de redirecionamento 307
- Polyfills antigos removidos com uma lista de navegadores atualizada
Internacional de verdade
O público chega em muitos idiomas, então os roteiros, os veículos e as páginas de destino têm versão própria e hreflang recíproco.
- Nove idiomas na interface
- Dados estruturados de empresa de aluguel, roteiros e perguntas frequentes
04 / Escopo
O que faz
- Mostra a disponibilidade de cada camper com os dias bloqueados no calendário
- Calcula o preço com extras e cobra com Stripe Checkout
- Sincroniza reservas de outros canais via iCal
- Publica roteiros pela Andaluzia e páginas de veículos em vários idiomas
- Oferece contato direto pelo WhatsApp em cada veículo
05 / Resultados
O que mudou
A imagem principal agora é renderizada no servidor com prioridade alta, resta um único contêiner de analítica carregado de forma adiada, a raiz é resolvida com uma reescrita em vez de um redirecionamento e todas as imagens são servidas pelo próprio domínio. Falta medir de novo com a mesma metodologia para publicar os números de depois; quando estiverem prontos, aparecerão aqui com a data.
Segurança e confidencialidade
- Segurança em nível de linha nas tabelas do Supabase.
- O webhook do Stripe verifica a assinatura de cada evento antes de confirmar uma reserva.
- As imagens de terceiros foram substituídas por imagens próprias hospedadas no domínio.
06 / Perguntas
Perguntas frequentes
Por que os números de desempenho ainda não foram publicados?
Porque só publicamos números medidos com método e data. As correções estão no código; a nova medição com o PageSpeed Insights, com a mediana de várias execuções, será publicada nesta ficha quando estiver feita.
Por que o problema não era o peso da imagem?
O download da imagem levava cerca de 126 ms. O tempo ia embora na espera: quase 1,8 segundo até começar a carregá-la, porque o elemento não existia no HTML inicial, e mais 0,8 segundo até poder exibi-la.