SoftwareIn ontwikkeling

Booklane

Zelf een afspraak boeken, zonder een enkel bericht.

Booklane geeft klanten van een dienstverlener een zelfbedieningsflow: de juiste dienst, een prijsindicatie vooraf en een moment dat past — direct boekbaar of op aanvraag. Gebouwd voor Vancoillie IT Hulp.

Type
Boekingssoftware
Gebouwd voor
Vancoillie IT Hulp
Onderdelen
Boekingssite · web-admin · iOS-app
Stack
PHP 8 · MySQL · SwiftUI
De publieke boekingssite van Booklane
De publieke boekingssite — geen login

01Het probleem

Van een reeks berichten naar één flow.

Vroeger

De klant belt of mailt. “Wanneer kan je?” Een paar keer heen en weer. De afspraak belandt handmatig in de agenda. De prijs wordt pas achteraf duidelijk.

Met Booklane

De klant vindt de juiste dienst, ziet meteen een prijsindicatie, kiest enkel uit momenten die echt kunnen en bevestigt in één scherm. De technieker krijgt een volledige aanvraag met context.

02De klantreis

Vijf stappen, één vloeiende ervaring.

01

Kiezen wat er speelt

De klant kiest een categorie en beschrijft in eigen woorden het probleem. Booklane leidt daaruit de juiste dienst af.

Stap: categorie kiezen
02

De behoefte omschrijven

Per categorie kunnen extra vragen verschijnen. De antwoorden reizen mee met de aanvraag, zodat er meteen context is.

Stap: probleem omschrijven
03

Locatie, werkgebied en prijs

Ter plaatse of op afstand. Bij een adres wordt de rijafstand vanaf de basis berekend, gecheckt of het binnen 20 km valt, en direct een prijsindicatie getoond: duur × uurtarief + verplaatsing, als schatting.

Stap: locatie en prijsindicatie
04

Een moment kiezen

Sommige momenten zijn direct boekbaar en meteen bevestigd, andere gaan op aanvraag. Wie verder woont dan de directe straal, kan enkel aanvragen.

Stap: moment kiezen
05

Invullen en bevestigen

Contactgegevens, akkoord en overzicht op één scherm, met één knop. Daarna volgt automatisch een bevestigingsmail. Betalen gebeurt na de interventie.

Stap: gegevens en bevestiging

03De drie onderdelen

Eén systeem, drie ingangen.

Boekingssite

Voor de klant · publiek

Een server-rendered wizard: categorie, intake, dienst, locatie, moment, bevestigen. Geen account. Beschermd met honeypot, rate-limiting per IP en e-mailvalidatie.

Booklane boekingssite — bevestiging

Web-admin

Voor de technieker · aan de laptop

Single-user login met bcrypt en CSRF op elk formulier. Dashboard, aanvragen-inbox, afspraken, agenda, beschikbaarheid, diensten, prijzen en instellingen.

Web-admin — agenda en Google-koppeling
Web-admin — beschikbaarheid

Mobiele app

Voor de technieker · onderweg · iOS

Een native SwiftUI-app op een dunne JSON-API die exact dezelfde serverfuncties hergebruikt — geen logica verdubbeld. Dashboard, afspraken en aanvragen afhandelen, met pushmeldingen bij elke nieuwe boeking en deeplinks naar het juiste scherm.

Booklane iOS-app — overzicht

04Onder de motorkap

Server-rendered PHP, zonder framework.

Eén businesslaag, hergebruikt door de publieke site, de web-admin en de JSON-API voor de app. Geen logica gedupliceerd.

Stack

PHP 8 met MySQL/MariaDB via vanilla PDO, volledig server-rendered. Geen framework, geen Composer. Draait op shared hosting; elke push naar main deployt via een GitHub Action over FTPS. Alle bedrijfswaarden — tarieven, teksten, werkgebied — staan in een settings-tabel, niet in de code.

Beschikbaarheid

Terugkerende weekregels (weekdag, tijdvak, modus: direct / op aanvraag / gesloten) plus eenmalige uitzonderingen per datum. Eén functie legt beide samen tot de tijdssegmenten van een dag; uitzonderingen overrulen de weekregels.

Google Calendar

OAuth2 in de admin. Google zegt enkel wanneer je bezet bent — de agenda-inhoud blijft dicht. Vrij/bezet wordt elke 15 minuten opgehaald en gecachet. Een bevestigde afspraak verschijnt als event in de doelagenda; bij annuleren verdwijnt het weer.

Slot-engine

Berekent de concrete boekbare startmomenten. Instellingen die meespelen: opzegtermijn, boekingshorizon, slot-granulariteit en per dienst de duur, buffer en modus. Woont de klant buiten de directe straal, dan zakken direct-slots automatisch naar “op aanvraag”.

  beschikbaarheid (weekregels + uitzonderingen)
− Google-bezet (gecachte vrij/bezet)
− bestaande afspraken + hun buffer
  binnen [nu + opzegtermijn, nu + horizon]
  in stappen van de slot-granulariteit
= boekbare slots, elk met hun modus
Prijs & afstand

Postcode en gemeente worden gegeocodeerd (met cache, ook voor mislukkingen). Rijafstand via OpenRouteService, met terugval op hemelsbreed. Buiten het werkgebied is niet boekbaar; in de basisgemeente geldt een vast tarief, elders tarief per km, heen en terug.

Afspraak-levenscyclus

Eén centrale functie schrijft de statusovergang weg en voert daarna de neveneffecten uit — Google, mails, facturatie — in een try/catch, zodat een mislukte mail de statuswijziging nooit breekt. Een tegenvoorstel krijgt een geheime token die na één klik in de mail opbrandt; dat is de enige uitzondering op “geen klant-login”.

aangevraagd ──▶ bevestigd ──▶ uitgevoerd
     │              │
     ▼              ▼
 geweigerd      geannuleerd
E-mail & push

Mail via PHPMailer en SMTP, elke poging gelogd. Alle klantmails gaan automatisch — ontvangst, bevestiging, voorstel, weigering, annulatie — met een blinde kopie voor de technieker. Push naar iPhone via APNs, met een wachtrij die mislukte meldingen opnieuw probeert.

Cron

Drie taken: de vrij/bezet-cache warm houden (elk kwartier), de GDPR-bewaartermijn toepassen (dagelijks) en de push-wachtrij leegmaken (elke minuut).

05Uitgangspunten

De regels waar alles op rust.

  1. 01

    Privacy eerst

    De privé-agenda blijft dicht — alleen vrij of bezet telt mee. GDPR-tekst, toestemming en een bewaartermijn zitten ingebouwd.

  2. 02

    Geen klant-login

    De enige uitzondering is de éénklik-bevestiglink bij een tegenvoorstel: een geheime token die opbrandt na gebruik.

  3. 03

    Alles in de admin

    Tarieven, teksten, werkgebied en taal staan in de beheeromgeving. Niets hardgecodeerd — alles blijft aanpasbaar zonder de code aan te raken.

  4. 04

    Meertalig opgezet

    Nederlandstalig, met Engels, Frans en Duits voorzien in de structuur.