WoolWood
Een webshop die zijn eigen B2B-logica moest kunnen dragen
De situatie
WoolWood verkoopt houten akoestische panelen aan particulieren én aan professionele kopers: interieurbouwers, architecten, aannemers. Die twee groepen kopen fundamenteel anders. Een particulier bestelt twee panelen en betaalt met Bancontact. Een interieurbouwer vraagt een offerte voor honderdtwintig panelen in een specifieke afwerking, verwacht een staffelkorting die past bij zijn volume, en wil een factuur op de juiste vennootschap.
Het bestaande platform kon het eerste vlot en het tweede niet. Elke professionele aanvraag werd handwerk: korting berekenen in Excel, offerte apart opmaken, en bij bestelling alles opnieuw intikken. Dat kost tijd, en erger, het geeft fouten in precies die orders waar het meeste geld in zit.
Als we niet exact weten wat elke prijsafspraak ons kost, sturen we blind bij.
Wat er al draaide
Hier lag de conclusie anders dan bij Art & Reno. Odoo is degelijke software, maar het knelpunt zat niet tussen de tools — het zat ín het pakket.
| Tool | Rol | Beslissing | Toelichting |
|---|---|---|---|
| Odoo — CRM | Klanten- en orderbeheer | vervangen | Uitgefaseerd; data gemigreerd |
| Odoo — webshop | Verkoopkanaal | vervangen | Bestaande SEO-posities en URL's meegenomen |
| Stripe | Online betalingen | herzien | Voor de Belgische markt is Bancontact de dominante betaalwijze |
| Excel | Prijs- en margeberekeningen, kortingsstaffels | gekoppeld | Blijft als analyse-instrument; de logica verhuist naar het platform |
| Google Workspace | Mail, documenten, samenwerking | behouden | Ongewijzigd |
De B2B-logica die WoolWood nodig heeft — prijsniveaus per klantbedrijf, meerdere gebruikers onder één account, een offertestroom die de klant zelf start, en straks meerdere merken onder één structuur — is precies het soort maatwerk waar een standaardwebshop op stukloopt. Wij vervangen niet uit principe, en we behouden ook niet uit principe. We rekenen uit wat het bedrijf op termijn het minst kost.
Wat we hergebruikt en vereenvoudigd hebben
De volledige productcatalogus is meeverhuisd
Alle productdata uit Odoo is overgezet met een importscript dat je zonder risico opnieuw kan draaien — draai je het tweemaal, dan krijg je geen dubbele producten. Dat is het verschil tussen een migratie die je op een rustige avond durft te doen en een migratie waar je een weekend voor blokkeert.
De SEO-posities zijn niet weggegooid
Bestaande URL's en zoekposities zijn meegenomen naar het nieuwe platform. Een nieuwe webshop die zes maanden onvindbaar is, is geen vooruitgang.
De Excel stond alleen op de verkeerde plaats
De kortingsstaffels en margeberekeningen die WoolWood in Excel had opgebouwd, waren correct en doordacht. Die logica is niet opnieuw uitgevonden maar overgezet, zodat ze automatisch toegepast wordt in plaats van handmatig opgezocht. Excel blijft in gebruik als analyse-instrument, want daar is het goed in.
Eén invoer, drie uitkomsten
Een prijsafspraak wordt één keer vastgelegd en werkt door in de offerte, in de bestelling en in de factuur. Waar vroeger drie keer hetzelfde ingetikt werd, met drie kansen op een fout, is er nu één bron.
Wat we gebouwd hebben
Een headless commerce-platform: het bedrijf heeft de commerce-basis zelf in handen, met daarbovenop de modules die WoolWood specifiek nodig heeft.
De B2B-kant is het zwaartepunt. Een professionele klant is niet langer een e-mailadres maar een bedrijf, met meerdere medewerkers eronder, een eigen prijsniveau en eigen factuurgegevens. Prijsafspraken en volumekortingen zitten in het systeem, wat betekent dat elke offerte automatisch de juiste prijs toont en dat de marge per order zichtbaar is op het moment van bestellen, niet drie maanden later.
Facturen en offertes leggen bij het aanmaken hun volledige inhoud vast. Wijzigt de prijs van een paneel volgend jaar, dan blijft een factuur van vandaag tonen wat er toen effectief is afgesproken. De factuurnummering loopt in één doorlopende reeks over alle merken heen, afgestemd met de accountant, zodat een tweede merk later kan aansluiten zonder boekhoudkundige knoop.
Onder de motorkapDe technische keuzes en waarom ze zo gemaakt zijn
Medusa.js v2 als commerce-backend
Open source, in Node en TypeScript, en vooral modulair. De B2B-logica zit in eigen modules naast de kern, niet als aanpassing ín de kern. Dat is het verschil met een aangepast standaardpakket: bij de volgende update van de basis blijft het maatwerk staan.
Eigen modules voor wat uniek is
Een Brand-module voor de multi-brand-structuur, een eigen Mollie-provider, en het importscript uit Odoo. Alles wat generiek is komt uit het platform; alles wat specifiek is voor WoolWood is eigen code.
Zelf gehost, en waarom
De backend draait in Docker-containers op een Hetzner-VPS in de EU, met Coolify als deploy-laag erop: het git-push-gemak van Vercel, op een server van enkele tientallen euro's per maand. Postgres 16 en Redis 7 draaien in dezelfde compose-opstelling; Redis is geen tweede database maar de cache- en wachtrijlaag die Medusa nodig heeft voor webhooks en achtergrondtaken. De server is gehard met firewall en automatische blokkering van inbraakpogingen. Dit is het enige traject met echt serverbeheer, en dat is een bewuste afweging.
Storefront apart, op Vercel
De winkel zelf is een Next.js-app die serverless draait en via API met de backend praat. Voorkant en achterkant zijn los vervangbaar; een redesign raakt de bestellogica niet.
Prijzen bevriezen bij aanmaak
Een offerte of factuur bewaart de prijzen zoals ze golden op dat moment, in plaats van ze bij het openen opnieuw te berekenen. Zonder dat mechanisme verandert een factuur van vorig jaar mee met de prijslijst van dit jaar — een boekhoudkundig probleem dat je pas ontdekt wanneer het al bestaat.
Betalingen als eigen module, niet als plugin
Voor Bancontact is gekozen voor Mollie, met een zelfgeschreven provider-module in plaats van een community-plugin op versie 0.0.x. Betalingen zijn het laatste onderdeel waar je afhankelijk wil zijn van code die iemand in zijn vrije tijd onderhoudt.
Content los van commerce, mail in twee stromen
Marketingteksten staan in een headless CMS, productdata in de commerce-backend: wie de teksten aanpast komt niet in de buurt van de bestellogica. Orderbevestigingen en facturen gaan via een transactionele maildienst, nieuwsbrieven via een aparte marketingtool — andere opt-in-regels, en de afleverbaarheid van je facturen mag niet lijden onder een nieuwsbrief.
Het resultaat
- Prijsafspraken per professionele klant in het systeem in plaats van in Excel
- Offertes met de juiste prijs zonder handmatige berekening
- Marge per order zichtbaar op het moment zelf
- Facturatie die de afspraak van dat moment vastlegt, en klaar voor een tweede merk
- Betaalwijzen afgestemd op de Belgische markt
- Catalogus en SEO-posities meeverhuisd in plaats van opnieuw opgebouwd
- nog in te vullen: tijdswinst per offerte
- 90% van de omzet komt uit B2B