Art & Reno

Van drie bestanden naar marge per werf

Sector
Bouw · mechanische betonvloerbehandeling
Grootte
Kleine kernploeg, ± € 2 mln omzet
Looptijd
Vanaf februari 2026, in fases
Status
Live in gebruik

De situatie

Art & Reno slijpt en polijst betonvloeren. Vijfentwintig jaar ervaring, meer dan tweeduizend vijfhonderd projecten, samen ruim honderdtachtig hectare vloer. Het bedrijf draait goed, maar de vraag die de zaakvoerder elke maand stelde — welke werven hebben we winstgevend afgesloten en welke niet — kon niemand snel beantwoorden.

De cijfers waren er wel. Ze zaten alleen verspreid: het gefactureerde bedrag in het facturatiepakket, de gewerkte uren in een Excel-bestand dat de administratie centraal bijhield, het materiaalverbruik nergens systematisch, en de kennis over welke werf lastig was in het hoofd van de ploegbaas. Een marge per werf berekenen betekende drie bestanden naast elkaar leggen en handmatig rekenen. Dat gebeurde dus zelden, en nooit op tijd om er nog iets aan te doen.

Het probleem was niet dat er te weinig gegevens waren. Het probleem was dat dezelfde gegevens op drie plaatsen stonden en nergens samenkwamen.

Wat er al draaide

Bij de start hebben we het volledige landschap in kaart gebracht. Art & Reno bleek allesbehalve digitaal achterop: er waren tools genoeg, ze praatten alleen niet met elkaar.

ToolRolBeslissingToelichting
BelmoniFacturatie tot 2026, historiek vanaf 2019behoudenArchief; historische omzetdata geëxporteerd voor de nulmeting
TeamleaderCRM sinds 2026, offertes en facturatiebehoudenKoppeling voorzien voor offerte- en factuurdata
Microsoft 365Agenda, planning, bestandsdelinggekoppeldAgenda gekoppeld aan de planningsmodule
FrontGedeelde mailbox en klantcommunicatiebehoudenWordt de werkplek van de prospectie-agent
Meta Business + Google AdsBetaalde campagnesbehoudenCampagnedata wordt meetbaar tot op de werf
WordPressBedrijfswebsitebehoudenApart traject voor SEO en herbouw
LeadinfoHerkenning van websitebezoekersbehoudenLeadbron voor de prospectie-agent
ExcelUren per medewerker per werfgekoppeldBlijft als invoerroutine; wordt de seed-import van het dashboard

Niets van deze lijst is vervangen. Het bedrijf betaalde al voor deze licenties, de mensen konden ermee werken, en het probleem zat niet in de tools maar in de ruimte ertussen.

Wat we hergebruikt en vereenvoudigd hebben

Zeven jaar historiek als vertrekpunt

De omzetdata uit Belmoni loopt terug tot 2019. Die is geëxporteerd en geïmporteerd, zodat het dashboard op dag één niet leeg stond maar meteen kon vergelijken over de jaren heen. Een nieuw systeem dat pas over twee jaar iets zinnigs zegt, wordt in die twee jaar niet gebruikt.

De Excel is niet afgeschaft

De administratie voert de uren al jaren centraal in en doet dat nauwkeurig. Die routine hebben we laten staan en het bestand ingelezen. Pas toen het dashboard bewezen had wat het waard was, is de invoer stap voor stap naar het scherm verhuisd — op vraag van de administratie zelf.

De agenda blijft in Microsoft 365

De planning stond al in de agenda die iedereen op zijn telefoon heeft. In plaats van een tweede planning te bouwen, schrijft de planningsmodule naar diezelfde agenda. Eén plaats, geen dubbele waarheid.

De rekenregels komen van de zaakvoerder

Het margemodel is samen met hem opgesteld, niet uit een pakket overgenomen. Hij is de enige die weet dat een lichte polijstbeurt minder pads verslijt dan een zware. Die kennis zat in zijn hoofd en zit nu in het systeem.

Wat we gebouwd hebben

Het Partner Dashboard, een eigen webapplicatie die per werf de marge berekent als omzet min loonkost min verbruiksmateriaal min machinekost min brandstof.

De loonkost gebruikt het uurtarief zoals het gold op het moment van de prestatie, zodat een latere loonsverhoging oude werven niet met terugwerkende kracht onrendabel maakt. De kost van de diamantpads wordt berekend per vierkante meter, gecorrigeerd met een factor voor de zwaarte van het polijstwerk. Machinekost en dieselverbruik volgen dezelfde logica. Alle tarieven en factoren staan in een instellingenscherm: als de dieselprijs verandert, past de zaakvoerder dat zelf aan zonder ons te bellen.

Rond dat rekenmodel zit de rest: klanten en werven, medewerkers en onderaannemers, urenregistratie, en een kaartweergave waarop de werven verschijnen. Wie wat mag zien is vastgelegd per rol — de zaakvoerder ziet alles, een planner ziet de planning, een medewerker ziet enkel zijn eigen uren.

Onder de motorkapDe technische keuzes en waarom ze zo gemaakt zijn

Next.js met TypeScript op Vercel

Eén codebase voor de schermen en de serverlogica, serverless gedeployed: er draait geen server die betaald en beheerd moet worden, en elke branch krijgt automatisch een preview-omgeving om iets te tonen voor het live gaat. TypeScript is geen luxe maar noodzaak: als een groot deel van de code door een AI-agent geschreven wordt, is de compiler de eerste lezer die alles naleest.

Supabase: managed Postgres met Row Level Security

De database is gewone PostgreSQL, beheerd door Supabase, met authenticatie en toegangsregels erbovenop. Het belangrijkste punt: wie wat mag zien is niet in het scherm geregeld maar in de database zelf. Een medewerker die zijn uren opvraagt, krijgt via RLS enkel zijn eigen rijen terug — ook als er ooit een fout in de frontend sluipt. Voor een systeem met loonkosten en marges is dat het verschil tussen een lek en geen lek.

Historische tarieven in het datamodel

Uurtarieven en kostenfactoren zijn niet één waarde per medewerker maar een reeks met geldigheidsdatums. De margeberekening zoekt het tarief dat gold op de prestatiedatum. Dat lijkt een detail tot iemand in maart de lonen indexeert en het rendement van vorig jaar plots verandert.

Google Calendar via OAuth met refresh token

Service-accountsleutels waren geblokkeerd door de organisatiepolicy van de klant, dus loopt de koppeling via OAuth met een refresh token — minder elegant op papier, maar het werkt binnen de regels die de klant zelf heeft ingesteld. Dat soort beperking hoor je pas als je in kaart brengt in plaats van veronderstelt.

Kaartweergave met Leaflet/MapLibre

Open-source mapping in plaats van Google Maps: geen kosten per weergave, en voor een werfkaart met eigen markers is er geen enkele functie die je mist.

Gepland

Teamleader-integratie via REST voor offerte- en factuurdata, en een LLM-laag op de Anthropic API waarmee de zaakvoerder zijn eigen data in gewone taal kan bevragen. Dat laatste is bewust fase 7 en niet fase 1: een AI-laag op data die nog niet klopt, geeft welbespraakte onzin.

Het resultaat

  • Marge per werf beschikbaar zonder handwerk, in plaats van drie bestanden naast elkaar
  • Historiek vanaf 2019 geïmporteerd, waardoor vergelijken over de jaren heen mogelijk werd
  • Tarieven en kostenfactoren beheerbaar door het bedrijf zelf
  • Planning en agenda op één plaats, geen dubbele invoer
  • Toegangsrechten afgedwongen in de database, niet enkel in het scherm
  • 60% minder administratief werk