Ga naar inhoud
Twee maanden platformbouw: zes modules die er nu staan

Twee maanden platformbouw: zes modules die er nu staan

De afgelopen twee maanden zat ik vrijwel fulltime in één codebase: een boekingsplatform voor verblijfsrecreatie, gebouwd in PHP op een eigen MVC-opzet. Geen nieuw project vanaf nul, maar een bestaand systeem dat draait, geld verwerkt en klanten bedient. Daar bouw je anders in dan in een leeg mapje.

Het resultaat staat in het changelog van het systeem: 269 genummerde wijzigingen, van versie 1.0.0 tot 1.0.271, tussen half juni en eind juli. Dat klinkt als heel veel kleine dingen, en dat was het deels ook. Maar er zitten zes samenhangende modules in die het noemen waard zijn.

Interactieve boekingskaart met live beschikbaarheid

Het oude boekingsformulier was een lijst met dropdowns. Bezoekers moesten raden welke plek waar lag en of hun datum vrij was. De nieuwe versie is een plattegrond: je ziet de locatie van bovenaf, met genummerde markers per plek, en per datum kleurt elke marker groen, rood of geel.

Daaronder zit meer dan het lijkt. Een plek kan aan een hoofdplek gekoppeld zijn, zodat ze alleen samen boekbaar zijn. Er geldt een maximum aan personen per locatie, waarbij de resterende plekken automatisch dichtgaan zodra dat maximum bereikt is. Prijzen die in de kalender staan zijn de prijzen ná korting, niet de kale dagprijs die later in het formulier alsnog verandert.

De kaart draait als insluitcode op externe sites, in vier talen, zonder framework. Vanilla JavaScript, omdat de widget op sites van derden terechtkomt en daar niets mag breken.

Een takenbord waar AI het voorwerk doet

Dit is het project waar ik zelf het meest van geleerd heb. Opdrachtgevers en medewerkers dienen een wens in op een Kanban-bord. Vanaf daar loopt een keten. Eerst wordt automatisch een verslag geschreven waarin de wens wordt uitgewerkt tot een concreet voorstel. Daarna volgt een checklist met testpunten, en tot slot een visuele mockup gebaseerd op het huidige thema en de echte pagina-indeling van het systeem.

De laatste stap is een knop waarmee de ontwikkelaar de wens daadwerkelijk laat bouwen, op basis van het verslag, de mockup, alle bijlagen en het gesprek eronder. Er zit een notitieblok bij dat werkt als gesprek tussen indiener en ontwikkelaar, met rechten per rol, en e-mail bij een reactie.

Wat het oplevert: de vage wens "kan de kalender niet wat duidelijker" wordt binnen een paar minuten een uitgewerkt voorstel met plaatje, waar de aanvrager ja of nee op kan zeggen. Dat scheelt een hoop heen en weer.

Agendakoppelingen die niet stiekem dingen overschrijven

Locatie-eigenaren houden hun bezetting op verschillende plekken bij. Sommigen in een agenda die een iCal-adres kan geven, anderen in een Google Sheet met gekleurde cellen. Beide zijn nu gekoppeld.

Voor de spreadsheets was AI de logische keuze: een sheet met samengevoegde cellen en kleurcodes heeft geen vast formaat, dus er leest een model overheen dat er bezette periodes uit haalt en per regel een betrouwbaarheidsscore geeft. Wat eruit komt gaat niet direct de agenda in. Alles landt op een werklijst waar een mens goedkeurt of negeert.

Dat laatste is bewust. Een koppeling die zelfstandig reserveringen aanpast is een koppeling die op een dag stilletjes een boeking wegdrukt. De goedkeuringsstap kost tien seconden per wijziging en voorkomt dat gesprek volledig.

Partnerportaal met een maandrapport dat zichzelf schrijft

Locatie-eigenaren hebben een eigen omgeving gekregen, met eigen tweetrapsauthenticatie, los van het boekingssysteem. Daarin: een jaardashboard, de eigen agenda, en de mogelijkheid om zelf periodes op bezet te zetten.

Daarbovenop komt een maandrapport als PDF. Dat combineert de boekingscijfers uit het systeem met bezoekcijfers uit Google Analytics, opgehaald voor alle taalpaden van dezelfde pagina. Er zit een AI-beoordeling van de eigen locatiefoto's in, met concrete punten over wat beter kan. Het rapport bestaat in twee versies: één voor de eigenaar, en een uitgebreidere interne versie.

Nieuwsbrief en gedeelde postbus in eigen beheer

De nieuwsbrief stelt zichzelf grotendeels samen op basis van wat er daadwerkelijk vrij is, inclusief last-minutes. Hij vertaalt naar de talen van de ontvangers, verstuurt in delen op de achtergrond, en houdt bij wie opent, klikt en zich uitschrijft.

Dat laatste bleek belangrijker dan verwacht. De mailprovider bewaart zijn logboek maar kort, dus zonder eigen registratie is "wanneer opende deze persoon voor het laatst iets" een half jaar later niet meer te beantwoorden. Daar staat nu een eigen tabel voor.

Ernaast staat een gedeelde postbus met regels en een wachtrij, als vervanging van een los ticketsysteem. Minder abonnementen, en klantgegevens blijven op één plek.

Prijzen en commissie met een spoor terug

Het minst zichtbare, en waarschijnlijk het belangrijkste. Prijzen kennen nu seizoenen, vijf soorten korting, en wijzigingen die je vooruit inplant op een datum. Elke wijziging bewaart een momentopname met wie hem doorvoerde. Pondprijzen rekenen mee met de ECB-dagkoers plus een instelbare opslag.

De commissie kent drie varianten, waaronder een staffel per persoon. Belangrijker: de grondslag staat nu zwart op wit vastgelegd, met een gedeelde berekening in plaats van vier plekken die net iets anders rekenden.

Wat ik hiervan meeneem

Drie dingen die ik bij elk volgend project weer zo doe.

Een goedkeuringsstap is goedkoper dan een terugdraaiactie. Overal waar een koppeling of AI iets voorstelt, stelt het alleen voor. Een mens drukt op akkoord.

Betaalstatussen gaan alleen omhoog. Geen enkele automatische flow mag een factuur terugzetten naar onbetaald. Dat is nu een harde regel in de code, geen afspraak.

Een changelog in het systeem zelf werkt. Niet in een los document, maar op een pagina in de admin, in de taal van de gebruiker. Iedereen ziet wat er veranderd is zonder ernaar te vragen.

Lees ook

Speelt er iets vergelijkbaars in jouw organisatie? Een boekingssysteem dat vastloopt, een koppeling die niet betrouwbaar is, of handwerk dat elke maand terugkomt? Plan een vrijblijvend gesprek. Ik luister eerst, en zeg het ook als ik denk dat je iets simpelers nodig hebt dan wat je vraagt.

Bert

Chat met ons