Casesheet

Booking-planner

Een zelfgebouwde vervanger van Cal.com die vrije slots uit Google Calendar haalt, met een Meet-link boekt en via een ondertekende link laat annuleren. Geen database, en met bewust zo smal mogelijke agenda-rechten.

Bekijk de live site

XBAS Business Intelligence · Almere NL · Case booking-planner

Het boekingsformulier van de planner: stap 1 met een rij beschikbare dagen (vrijdag 24 juli geselecteerd), stap 2 met tijdvakken van 08:30 tot 11:30, en het label 'Tijden in Europe/Amsterdam'.
Plaat · Booking-planner

Samenvatting

Booking-planner is de kennismakingsplanner op deze site: een zelfgebouwd alternatief voor Cal.com. Hij leest vrije tijd uit Google Calendar, biedt bezoekers open slots aan, en legt bij het boeken een afspraak met Google Meet-link vast. Annuleren gaat via een ondertekende link met bevestigingsknop. Er is geen database: elke boeking leeft in de agenda zelf. De kern is een bewuste keuze in rechten: de app krijgt alleen toegang tot de kalender die hij zelf via de API heeft aangemaakt, plus vrij/bezet-informatie, en kan zo niet in de hoofdagenda schrijven of lezen waarmee ik bezet ben.

De vraag

De site had geen boekingspad en eindigde in een mailto. Cal.com vraagt volledige lees- en schrijfrechten op de hele agenda; dat was de reden om het zelf te bouwen met zo smal mogelijke scopes.

Wat ik heb gebouwd

  • Vrije-slot-berekening uit Google Calendar op basis van werkuren, met buffer tussen afspraken en een boekingshorizon
  • Boeken van een afspraak met automatisch aangemaakte Google Meet-link, rechtstreeks in een aparte, via de API aangemaakte kalender
  • Annuleren als POST met bevestigingsknop achter een HMAC-ondertekende link, niet als GET (mailscanners volgen GET-links automatisch)
  • Tijdzone-logica die intern altijd met UTC-instants rekent en per slotgrens naar Europe/Amsterdam converteert, zodat slots rond de zomertijdovergang niet een uur verschuiven
  • Bevestigings- en annuleringsmail via Resend, met de Meet-link en de annuleerknop erin
  • Bot-afweer: een honeypot-veld en een minimale invultijd, zonder echte bezoekers te hinderen

In detail

  • Zo smal mogelijke agenda-rechten: alleen de zelf aangemaakte boekingskalender plus vrij/bezet, geen lees- of schrijftoegang op de hoofdagenda
  • Geen database: elke boeking leeft in Google Calendar zelf, dus geen aparte opslag om te beheren of te beveiligen
  • DST-correcte tijdzone-conversie, gedekt door tests op de slotgrenzen rond de zomertijdovergang
  • Annuleren via een ondertekende link met bevestiging, bestand tegen mailscanners die links vooraf openen
  • Beschikbaarheid aanpassen is één bestand: werkuren, slotlengte, buffer en horizon staan op één plek

Resultaat

In gebruik op deze site als primaire kennismakingsroute. De code draait met een testsuite die het tijdzone-rekenwerk en de HMAC-signing dekt, de plekken waar een fout stil en pas veel later pijn zou doen.