Saltar al contenido
POLARGATE
Hoteles y hostelería

Una web de hotel bilingüe que los rastreadores y los asistentes de IA sí leen

Un hotel de 4 estrellas en Castilla-La Mancha tenía una web que los buscadores recibían como un contenedor vacío. Polargate la reconstruyó como 16 URLs bilingües prerenderizadas y hoy la mantiene con una cuota mensual de Care y un ciclo de auditoría.

Página de inicio de hoteltalavera.com: el logo de Talavera Hotel con cuatro estrellas sobre una habitación con cama de matrimonio, cojines rojos y un ventanal a la ciudad.
hoteltalavera.com
16
URLs indexables, español e inglés
48
hallazgos de auditoría confirmados, ninguno refutado
27
preguntas frecuentes publicadas con schema FAQPage
20
tests automáticos que vigilan la coherencia SEO
0
errores en consola con la política de seguridad en modo enforce

El problema

La web del hotel era una sola página renderizada en el navegador. Los buscadores y los asistentes de IA recibían un contenedor HTML casi vacío, las subrutas devolvían 404 y las etiquetas de idioma se apuntaban a sí mismas, así que la versión en inglés no existía por separado. No había cabeceras de seguridad. El formulario de contacto escribía en una tabla que cualquier visitante anónimo podía leer y no entregaba nada a recepción. Las habitaciones, los precios, los salones y los horarios solo aparecían después de ejecutar JavaScript, es decir, para nadie que no fuera un navegador.

Qué construimos

Polargate reconstruyó la web con Vite, React y TypeScript sobre vite-react-ssg, de modo que cada ruta se sirve como HTML real. El contenido pasó a 16 URLs indexables, siete en español y siete en inglés más una página de preguntas frecuentes en cada idioma, cada una con su título, su descripción, su canonical y su hreflang con etiquetas de retorno. Un único fichero TypeScript guarda los datos del hotel y alimenta la página visible, el grafo schema.org y los ficheros llms.txt. El formulario pasó a una Edge Function de Supabase con validación en servidor y límite de envíos, y el correo sale por Resend desde un subdominio propio.

El resultado

Veinte URLs responden 200 en producción, la política de seguridad de contenido corre en modo enforce sin errores en consola y las dos habitaciones, con sus precios, se leen en el HTML servido. Una auditoría adversarial con 55 agentes dejó 48 hallazgos, todos confirmados y todos corregidos, entre ellos un fallo de herencia de grupos en robots.txt y páginas en inglés servidas con la etiqueta de idioma español. Veinte tests automáticos vigilan la paridad español-inglés, los metadatos únicos y la coherencia entre datos estructurados y texto visible. El efecto en tráfico y reservas todavía no está medido, así que Polargate no lo afirma.

Stack

  • Vite
  • React
  • TypeScript
  • Tailwind CSS
  • shadcn/ui
  • React Router
  • Vercel
  • Supabase
  • PostgreSQL
  • Deno
  • Resend
  • GA4
  • Search Console
  • Google Maps
  • Vitest
  • GitHub
hoteltalavera.com

Qué encontramos

Una auditoría externa y una revisión del código, el mismo día, dieron el mismo diagnóstico. La web era una sola página renderizada en el navegador, así que un rastreador recibía un contenedor y nada más. La versión en inglés no tenía URLs propias, las subrutas devolvían 404 y no se enviaba ninguna cabecera de seguridad. El formulario de contacto escribía en una tabla de Supabase que cualquier visitante anónimo podía leer, una exposición de datos personales que cerramos ese mismo día.

  • Contenido en el HTML servido: vacío
  • URLs indexables: una
  • Cabeceras de seguridad: ninguna
  • Formulario de contacto: guardaba el mensaje, no entregaba nada

Qué construimos

Mantuvimos el diseño y reconstruimos la entrega. La web funciona con Vite, React 18 y TypeScript, con Tailwind y shadcn/ui, prerenderizada en el build por vite-react-ssg y desplegada en Vercel. El idioma va en la ruta: español en la raíz, inglés bajo /en/, cada página prerenderizada en su idioma con su título, su descripción, su canonical y su hreflang, con etiquetas de retorno y x-default.

Un único fichero, src/lib/schema.ts, guarda los datos del hotel. De ahí salen la página visible, el grafo JSON-LD (Hotel, Organization, WebSite, HotelRoom, EventVenue, FAQPage, BreadcrumbList y un ReserveAction que apunta al motor de reservas Paraty Tech del hotel) y los ficheros llms.txt y llms-full.txt. Publicamos 27 preguntas reales de recepción en seis grupos, con elementos details nativos, para que un asistente las lea sin ejecutar JavaScript.

El formulario es una Edge Function en Deno sobre Supabase: honeypot, control de tiempo, validación en servidor, límite de envíos por IP hasheada, inserción con la clave de servicio y sin permisos para el rol anónimo, y entrega con Resend desde un subdominio de envío propio, que no toca el correo Microsoft 365 del hotel. La analítica es GA4 con Consent Mode v2 denegado por defecto y el mapa solo carga tras el consentimiento.

Cómo se mantiene hoy

La web está bajo una cuota mensual de Care, y esa cuota incluye un ciclo de auditoría, no solo parches. En agosto de 2026 lanzamos una auditoría multiagente en seis áreas, con un segundo agente intentando refutar cada hallazgo antes de aceptarlo: 48 hallazgos, 48 confirmados, ninguno refutado, 16 de ellos errores reales en producción.

  • Solo una de las dos habitaciones llegaba al HTML prerenderizado
  • Las páginas en inglés se servían con lang="es"
  • La imagen principal quedaba oculta hasta la hidratación, tras una cortina de 4,5 segundos
  • Un fallo de herencia de grupos en robots.txt
  • Coordenadas del hotel desviadas unos 430 metros

Se corrigió todo y se verificó en vivo desde fuera de la red del cliente. La política de seguridad de contenido pasó de report-only a enforce sin un solo error en consola, se eliminaron 66 ficheros huérfanos y 33 dependencias sin uso, y 20 tests de vitest tumban el build si el español y el inglés se separan, si dos páginas comparten título o si los datos estructurados dejan de coincidir con lo que lee una persona.

FAQ

Preguntas sobre este proyecto

¿Cuánto tarda una reconstrucción como esta?
El trabajo fue por fases dentro de una cuota mensual, no en un único lanzamiento. La primera versión, con la integración del motor de reservas, la marca y la analítica, se entregó como proyecto cerrado. El paso a 16 URLs bilingües prerenderizadas entró en producción en julio de 2026 y la parte de visibilidad en IA se cerró en agosto de 2026. Una reconstrucción parecida empieza por un Discovery Sprint de pago, que fija alcance y orden antes de escribir código.
¿Se puede hacer esto con nuestro motor de reservas actual?
Sí. Este hotel reserva con Paraty Tech y lo mantuvimos. Polargate trata el motor de reservas como un punto fijo: la web enlaza a él y los datos estructurados llevan un ReserveAction que apunta a la misma URL, de modo que un asistente que lee la página sabe dónde se reserva. Funciona igual con un PMS, un channel manager o el motor de una cadena. Construimos alrededor de lo que ya pagas en lugar de sustituirlo.
¿Esto hará que nuestro hotel salga en ChatGPT y en las respuestas de IA de Google?
Hace que el hotel sea legible y citable, que es la parte que se puede controlar. Servimos HTML real en cada ruta, ponemos los datos en texto visible, mantenemos un grafo schema.org que refleja ese texto, permitimos en robots.txt a los rastreadores de búsqueda y de respuestas, y publicamos llms.txt. Nadie, tampoco Polargate, puede garantizar una cita ni una posición, así que informamos de lo verificable: qué recibe un rastreador y si es correcto.
¿Qué cubre en realidad la cuota mensual de Care?
Mantenimiento, los servicios de Google (Perfil de Empresa, Search Console, Analytics), contenido y SEO, y un ciclo de auditoría. Cada pocos meses volvemos a auditar la web en vivo en seguridad, SEO, accesibilidad, rendimiento y contenido, y una segunda pasada intenta refutar cada hallazgo antes de tocar nada. En agosto de 2026 salieron 48 hallazgos confirmados y 16 errores reales. Veinte tests automáticos corren en cada build para que las mismas regresiones no vuelvan en silencio.

Proyectos relacionados

INITIATE

Arranca el motor

Cuéntanos qué estás construyendo en unas pocas preguntas cortas. Un ingeniero senior responde por escrito en 48 horas laborables con una primera lectura de alcance, plazos y precio.