Naar de inhoud
POLARGATE
Hotels en hospitality

Een tweetalige hotelsite die crawlers en AI-assistenten wél kunnen lezen

Een viersterrenhotel in Castilla-La Mancha had een site die zoekmachines als een lege container binnenkregen. Polargate bouwde die om tot 16 voorgerenderde tweetalige URL's en beheert hem nu met een maandelijkse Care-retainer en een terugkerende auditcyclus.

Homepage van hoteltalavera.com: het logo van Talavera Hotel met vier sterren boven een hotelkamer met tweepersoonsbed, rode kussens en een groot raam op de stad.
hoteltalavera.com
16
indexeerbare URL's, Spaans en Engels
48
auditbevindingen bevestigd, geen weerlegd
27
gepubliceerde FAQ's met FAQPage-schema
20
geautomatiseerde tests die de SEO-coherentie bewaken
0
consolefouten met het security policy in enforce-modus

Het probleem

De site van het hotel was één pagina die pas in de browser werd opgebouwd. Zoekmachines en AI-assistenten kregen een vrijwel lege HTML-container, elke subroute gaf 404 terug en de taaltags verwezen naar zichzelf, waardoor de Engelse versie niet apart bestond. Security headers ontbraken. Het contactformulier schreef naar een tabel die elke anonieme bezoeker kon lezen en bezorgde niets bij de receptie. Kamertypes, prijzen, zalen en openingstijden bestonden pas nadat JavaScript had gedraaid, dus voor niemand behalve een browser.

Wat we bouwden

Polargate bouwde de site opnieuw op met Vite, React en TypeScript via vite-react-ssg, zodat elke route echte HTML uitlevert. De inhoud werd 16 indexeerbare URL's, zeven in het Spaans en zeven in het Engels plus een FAQ-pagina per taal, elk met een eigen title, description, canonical en hreflang met return tags. Eén TypeScript-bestand bevat de hotelgegevens en voedt de zichtbare pagina, de schema.org-graaf en de llms.txt-bestanden. Het contactformulier verhuisde naar een Supabase Edge Function met validatie op de server en een verzendlimiet, en mail vertrekt via Resend vanaf een eigen verzendsubdomein.

Het resultaat

Twintig URL's geven 200 terug in productie, het content security policy draait in enforce-modus zonder consolefouten en beide kamertypes staan met hun prijzen in de geserveerde HTML. Een adversarial audit met 55 agents leverde 48 bevindingen op, allemaal bevestigd en allemaal opgelost, waaronder een overervingsfout in robots.txt en Engelse pagina's met een Spaanse taaltag. Twintig geautomatiseerde tests bewaken nu de pariteit tussen Spaans en Engels, unieke metadata en de gestructureerde data tegenover de zichtbare tekst. Het effect op verkeer en boekingen is nog niet gemeten, dus Polargate claimt dat niet.

Stack

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

Wat we aantroffen

Een externe audit en een code review op dezelfde dag kwamen tot hetzelfde oordeel. De site was één pagina die pas in de browser werd opgebouwd, dus een crawler kreeg een container en verder niets. De Engelse versie had geen eigen URL's, subroutes gaven 404 terug en er werden geen security headers meegestuurd. Het contactformulier schreef naar een Supabase-tabel die elke anonieme bezoeker kon lezen, een lek van persoonsgegevens dat we dezelfde dag hebben gedicht.

  • Inhoud in de geserveerde HTML: leeg
  • Indexeerbare URL's: één
  • Security headers: geen
  • Contactformulier: bewaarde het bericht, bezorgde niets

Wat we hebben gebouwd

We hielden het ontwerp aan en bouwden de levering opnieuw. De site draait op Vite, React 18 en TypeScript met Tailwind en shadcn/ui, wordt tijdens de build voorgerenderd door vite-react-ssg en staat op Vercel. De taal zit in de route: Spaans op de root, Engels onder /en/, elke pagina voorgerenderd in de eigen taal met een eigen title, description, canonical en hreflang, inclusief return tags en x-default.

Eén bestand, src/lib/schema.ts, bevat de gegevens van het hotel. Daaruit komen de zichtbare pagina, de JSON-LD-graaf (Hotel, Organization, WebSite, HotelRoom, EventVenue, FAQPage, BreadcrumbList en een ReserveAction die naar de Paraty Tech-boekingsmotor van het hotel wijst) en de bestanden llms.txt en llms-full.txt. Zevenentwintig echte vragen van de receptie staan in zes groepen online, met native details-elementen, zodat een assistent ze leest zonder JavaScript uit te voeren.

Het formulier is een Deno Edge Function op Supabase: honeypot, timingcontrole, validatie op de server, een limiet per gehasht IP-adres, invoegen via de service role zonder rechten voor de anonieme rol, en bezorging via Resend vanaf een eigen verzendsubdomein, waardoor de Microsoft 365-mail van het hotel ongemoeid blijft. Analytics loopt via GA4 met Consent Mode v2 standaard geweigerd, en de kaart laadt pas na toestemming.

Hoe het nu draait

De site valt onder een maandelijkse Care-retainer, en die retainer bevat een auditcyclus, niet alleen losse pleisters. In augustus 2026 draaiden we een multi-agent audit over zes gebieden, waarbij een tweede agent elke bevinding probeerde te weerleggen voordat we die accepteerden: 48 bevindingen, 48 bevestigd, geen enkele weerlegd, waarvan 16 echte fouten in productie.

  • Slechts één van de twee kamertypes stond in de voorgerenderde HTML
  • Engelse pagina's werden geserveerd met lang="es"
  • De hero-afbeelding bleef verborgen tot de hydratie, achter een gordijn van 4,5 seconden
  • Een overervingsfout in de groepen van robots.txt
  • Coördinaten die er ongeveer 430 meter naast lagen

Alles is hersteld en live geverifieerd van buiten het netwerk van de klant. Het content security policy ging van report-only naar enforce zonder één consolefout, 66 verweesde bestanden en 33 ongebruikte dependencies zijn verwijderd, en 20 vitest-tests laten de build falen als Spaans en Engels uit elkaar lopen, als twee pagina's dezelfde title krijgen of als de gestructureerde data niet meer overeenkomt met wat een bezoeker leest.

FAQ

Vragen over dit project

Hoelang duurt zo'n herbouw?
Het werk liep in fasen binnen een maandelijkse retainer, niet als één lancering. De eerste versie, met de koppeling van de boekingsmotor, het merk en de analytics, is als vaste-prijsproject opgeleverd. De overgang naar 16 voorgerenderde tweetalige URL's ging in juli 2026 live en het AI-zichtbaarheidswerk werd in augustus 2026 afgerond. Een vergelijkbare herbouw begint met een betaalde Discovery Sprint, die scope en volgorde vastlegt voordat er code wordt geschreven.
Kunnen jullie dit doen met onze huidige boekingsmotor?
Ja. Dit hotel boekt via Paraty Tech en dat hebben we behouden. Polargate behandelt de boekingsmotor als een vast punt: de site linkt ernaartoe en de gestructureerde data bevat een ReserveAction naar dezelfde URL, zodat een assistent die de pagina leest weet waar geboekt wordt. Dezelfde aanpak werkt met een PMS, een channel manager of de motor van een keten. We bouwen om wat je al betaalt heen in plaats van het te vervangen.
Komt ons hotel hierdoor in ChatGPT en in de AI-antwoorden van Google?
Het maakt het hotel leesbaar en citeerbaar, en dat is het deel dat je kunt sturen. We serveren echte HTML voor elke route, zetten de feiten in zichtbare tekst, houden een schema.org-graaf bij die die tekst weerspiegelt, laten de zoek- en antwoordcrawlers toe in robots.txt en publiceren llms.txt. Niemand, Polargate zelf inbegrepen, kan een citatie of een positie garanderen, dus rapporteren we wat verifieerbaar is: wat een crawler binnenkrijgt en of dat klopt.
Wat dekt de maandelijkse Care-retainer eigenlijk?
Onderhoud, de Google-diensten (Bedrijfsprofiel, Search Console, Analytics), content en SEO, en een auditcyclus. Om de paar maanden auditen we de live site opnieuw op security, SEO, toegankelijkheid, performance en content, en een tweede ronde probeert elke bevinding te weerleggen voordat we iets aanpassen. In augustus 2026 leverde dat 48 bevestigde bevindingen en 16 echte fouten op. Twintig geautomatiseerde tests draaien bij elke build, zodat dezelfde regressies niet stilletjes terugkomen.

Gerelateerd werk

INITIATE

Start de motor

Vertel ons in een paar korte vragen wat je bouwt. Een senior engineer antwoordt binnen twee werkdagen schriftelijk met een eerste inschatting van scope, planning en prijs.