Naar de inhoud
POLARGATE
Reizen en toerisme

Het corporate webplatform van Globalia

Globalia, de Spaanse reisgroep, had haar personeelsgegevens in Microsoft 365 staan en haar publieke website ergens anders. Polargate bouwde één webplatform op één repository: een medewerkersgids die synchroon loopt met Microsoft 365, een digitaal visitekaartje met passen voor Apple Wallet en Google Wallet, en de publieke site van de groep, leesbaar gemaakt voor AI-crawlers zonder die opnieuw te bouwen. Pedro Ciordia werkt bij Globalia, dus dit is omzet van een verbonden partij en geen klant die op de open markt is gewonnen.

In een kantoor boven de stad in de schemering werkt een webredacteur een pagina van een van meerdere merksites bij, met een mobiele preview ernaast
1
repository voor het interne platform, de gids en de publieke site
11.421
tekens echte inhoud die een AI-crawler van een nieuwsbericht krijgt
707
gearchiveerde nieuwsartikelen die nu leesbaar zijn voor AI-crawlers
39
tabellen met row-level security en nul fouten in de controle van augustus 2026

Het probleem

Globalia heeft meerdere consumentenmerken, en de personeelsgegevens stonden in Microsoft 365 terwijl de publieke website ergens anders draaide. De groep had een medewerkersgids nodig die gelijke tred houdt met Microsoft 365 op de schaal van tienduizenden mensen, één kaartje en één identiteit per merk, en een publieke site waarvan het nieuwsarchief gelezen en geciteerd kan worden door de assistenten waar mensen nu aan vragen wat ze vroeger intypten.

Wat we bouwden

Polargate bouwde het geheel als één webplatform op één repository, zodat het interne deel en de publieke site dezelfde code, build en deploy delen. De synchronisatie van de gids is herbouwd op Microsoft Graph delta-queries en hervatbaar gemaakt, met een opgeslagen vervolgverwijzing en een tijdsbudget per run, en medewerkers melden zich aan met hun eigen Microsoft 365-account, zodat de accounts in beheer van de groep blijven. De gids kent drie privacylagen en serveert avatars ondertekend en met vervaltijd. Daarbovenop zit het digitale visitekaartje: het wordt vanuit de gids aangemaakt, de medewerker claimt het bij de eerste keer aanmelden via SSO zonder dat de publieke link verandert, de Wallet-passen worden op de server ondertekend en contactgegevens komen alleen vrij tegen een ondertekend toegangstoken. Elk merk van de groep wordt toegewezen op e-maildomein. Op de publieke site injecteert edge middleware echte inhoud, uitsluitend voor crawlers, zonder migratie naar statische generatie en zonder wijziging aan de applicatie.

Het resultaat

De gids bevat nu tienduizenden actieve medewerkers, run na run gelijk met Microsoft 365. Op de publieke site ging één nieuwsbericht van 14 tekens leesbare inhoud voor een crawler naar 11.421, en werden 707 gearchiveerde artikelen leesbaar. In de controle van augustus 2026 telde de database 39 tabellen met row-level security en nul fouten, waren de waarschuwingen van de security advisors verholpen en waren de row-level security-policies samengebracht tot één policy per rol en actie. Voor de deploy: typecheck, 18 tests, de webbuild en de appbuild groen, en 20 routes nagelopen op desktop en mobiel. De eerste negen kaartjes zijn met de hand aangemaakt voor directieleden en werken van begin tot eind.

Stack

  • Vite
  • React
  • TypeScript
  • Tailwind CSS
  • shadcn/ui
  • Supabase
  • PostgreSQL
  • Deno
  • Microsoft 365
  • Microsoft Entra ID
  • Vercel

De context

Globalia is een Spaanse reisgroep met meerdere consumentenmerken. De personeelsgegevens stonden in Microsoft 365 en de publieke website ergens anders. Polargate bouwde het corporate webplatform van de groep: een intern webplatform met de medewerkersgids die synchroon loopt met Microsoft 365, een digitaal visitekaartje met passen voor Apple Wallet en Google Wallet, en de publieke site van de groep, alles in één repository. Pedro Ciordia werkt bij Globalia, dus dit project is omzet van een verbonden partij en geen klant die op de open markt is gewonnen.

Die ene repository is geen detail. Het interne platform en de publieke site delen dezelfde code, dezelfde build en dezelfde deploy, dus een merkwijziging gebeurt één keer in plaats van per site. De stack is React, Vite, TypeScript, Tailwind en shadcn/ui aan de voorkant, Supabase aan de achterkant (Postgres met row-level security, Edge Functions op Deno, Storage en Auth), Microsoft Graph voor de gids en het aanmelden, Apple PassKit en de Google Wallet API voor de passen, en Vercel als hosting. Het project begon met steigerwerk uit een visuele bouwtool en staat daar nu volledig los van, met de backend samengebracht in één eigen Supabase.

De gids: delta-queries en een hervatbare synchronisatie

Medewerkers melden zich aan met hun eigen Microsoft 365-account, en de gids leest uit datzelfde Microsoft 365, zodat de accounts onder beheer van de groep blijven en niemands gegevens opnieuw in een tweede systeem worden getypt.

De synchronisatie draait op Microsoft Graph delta-queries, dus elke run haalt alleen op wat is gewijzigd in plaats van de hele gids opnieuw.

De synchronisatie is van opzet hervatbaar: de vervolgverwijzing wordt bewaard, elke run krijgt een tijdsbudget en de volgende run gaat verder waar de vorige stopte in plaats van opnieuw te beginnen. Alleen zo raakt een synchronisatie van deze omvang ooit klaar. Hij bevat nu tienduizenden actieve medewerkers.

Dubbelingen worden opgelost met een omkeerbare samenvoegregel op identiteit, die de aliassen van één persoon samenbrengt en nooit twee verschillende mensen samenvoegt die toevallig dezelfde naam hebben.

Drie privacylagen

Een medewerkersgids is persoonsgegeven, dus het is niet één dataset. Het zijn er drie. De publieke laag bevat professionele informatie. De tweede bevat zakelijke contactgegevens. De derde, de persoonlijke gegevens, zit achter een expliciete toestemming. Avatars worden ondertekend en met vervaltijd geserveerd, zodat de URL van een foto geen permanente deur is.

Het digitale visitekaartje

Elke medewerker heeft een publieke kaartpagina, met een spiegelroute in het Engels, een vCard-download, knoppen voor Apple Wallet en Google Wallet en een QR-code in de huisstijl. Kaartjes worden vanuit de gids aangemaakt en claimen zichzelf zodra de medewerker zich via SSO aanmeldt, waarbij de publieke link niet verandert, dus wat al gedrukt is blijft geldig.

Passen worden op de server ondertekend, nooit in de browser

Apple-passen krijgen een manifest met een hash per bestand en een PKCS#7-handtekening. Google-passen krijgen een JWT die met RS256 is ondertekend. De passen werken met QR, niet met NFC.

Contactgegevens komen alleen vrij tegen een ondertekend toegangstoken, stabiel per kaart zodat gedrukte QR-codes niet verlopen. Het veldcontract werkt met een allowlist, met expliciet verboden velden, het mobiele nummer standaard uit en een opschoonfunctie als extra verdedigingslaag. Kaartjes worden niet geïndexeerd.

De vCard volgt RFC 2426, met de foto in base64 ingesloten omdat iOS geen foto's via een URL importeert, en de pagina wijst visueel aan welke knop het contact echt opslaat.

Meerdere bedrijven, op e-maildomein

Globalia bestaat uit meerdere bedrijven, dus het platform is multi-bedrijf. Elk merk wordt toegewezen op e-maildomein en draagt zijn eigen naam en identiteit op het kaartje. De toegang is rolgebaseerd en geverifieerd, en de minimale rol wordt bij de eerste aanmelding automatisch toegekend door een databasetrigger.

De publieke site, leesbaar voor AI-assistenten

Een moderne webapplicatie wordt in de browser opgebouwd, en vrijwel geen enkele AI-crawler voert JavaScript uit. De lezer en de crawler krijgen dus niet dezelfde pagina, en dat gat sluiten was de opdracht op de publieke site.

Dat hebben we opgelost zonder de site naar statische generatie te migreren. Edge middleware injecteert, uitsluitend voor crawlers, title, description, canonical, hreflang, Open Graph, JSON-LD en een echte body met een kop en alinea's. Mensen krijgen nog steeds de applicatie zoals die was, en noch de build noch de app is veranderd.

De cijfers zijn het punt. Eén nieuwsbericht ging van 14 tekens leesbare inhoud naar 11.421. Over zes routes en hun taalspiegels ging de voor crawlers zichtbare inhoud van ongeveer 14 tot 80 tekens naar 756 op de homepage en 200 tot 260 op de onderliggende pagina's. 707 gearchiveerde artikelen werden leesbaar.

Wat er verder in zit

Meldingen worden niet uitgewaaierd: één melding is één record met een doelgroep, en de feed van elke gebruiker wordt ter plekke berekend, met respect voor de voorkeuren en de verplichte typen. Er is een visueel bord met personeelsvoordelen en aanbiedingen, gepubliceerd door het HR-team en zichtbaar voor iedereen. Het platform is bovendien een installeerbare PWA die de gebruiker waarschuwt bij een update, en gebruikt Supabase Realtime in plaats van periodiek pollen.

Waar het nu staat

Gemeten, niet geprojecteerd. In de controle van augustus 2026: 39 tabellen met row-level security en nul fouten, de waarschuwingen van de security advisors verholpen en de row-level security-policies samengebracht tot één policy per rol en actie, wat leesbaarder is en goedkoper draait. Het opruimen van dode code haalde er 27 componenten en 16 dependencies uit. In diezelfde fase zijn de securityheaders en TLS aan de edge aangescherpt.

Over gewicht: het hercoderen van de 153 frames van de hero op de homepage naar WebP scheelde 38% zonder zichtbaar verschil, één component ging van 739 KB naar 3,6 KB nadat een volledige import van een iconenbibliotheek was vervangen, en een grafiekenbibliotheek van 423 KB is naar lazy loading verplaatst.

Voor de deploy: typecheck, 18 tests, de webbuild en de appbuild groen, en 20 routes nagelopen op desktop en mobiel.

FAQ

Vragen over dit project

Kunnen we onze medewerkersgids vanuit Microsoft 365 synchroniseren zonder handmatig kopiëren?
Ja, met Microsoft Graph delta-queries: elke run haalt alleen op wat is gewijzigd, niet de hele gids. Waar het meestal misgaat is de omvang. Een synchronisatie die bij elke run opnieuw begint komt op de schaal van een grote groep nooit rond, dus deze is hervatbaar gebouwd: de vervolgverwijzing wordt bewaard, elke run krijgt een tijdsbudget en de volgende run gaat verder waar de vorige stopte. Die houdt nu tienduizenden actieve medewerkers synchroon. Medewerkers melden zich aan met hun eigen Microsoft 365-account, en de gids levert gegevens in drie privacylagen, zodat professionele informatie, zakelijke contactgegevens en persoonsgegevens niet dezelfde dataset zijn.
Is het veilig om elke medewerker een visitekaartje in Apple Wallet en Google Wallet te geven?
Dat is het, als het ondertekenen op de server blijft en het kaartje wordt behandeld als wat het is, een publieke pagina. Apple-passen worden ondertekend met een manifest en PKCS#7, Google-passen met een JWT op RS256, en geen enkele ondertekeningssleutel bereikt ooit de browser. Contactgegevens komen alleen vrij tegen een ondertekend toegangstoken, stabiel per kaart zodat gedrukte QR-codes blijven werken. De velden die mogen verschijnen staan op een allowlist met expliciet verboden velden, het mobiele nummer staat standaard uit en kaartjes worden niet geïndexeerd.
Moeten we onze website eerst als statische HTML herbouwen voordat AI-assistenten die kunnen lezen?
Nee. Statische generatie is het betere antwoord op lange termijn, maar niet het enige, en op een draaiende corporate site zelden het snelste. Hier injecteert edge middleware title, description, canonical, hreflang, Open Graph, JSON-LD en een echte body met een kop en alinea's, uitsluitend voor crawlers. Mensen krijgen de applicatie ongewijzigd, en noch de build noch de applicatie is aangepast. Gemeten resultaat: één nieuwsbericht ging van 14 tekens leesbare inhoud naar 11.421, en 707 gearchiveerde artikelen werden leesbaar. Kijk eerst of je eigen robots-regels AI-crawlers uitsluiten, want veel regels doen dat nog steeds.

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.