Kay Smits
Alle projecten

Multisite e-commerce

Eén codebase die meerdere webshops bedient, elk met een eigen catalogus en betaalinstellingen.

Rol
Platform en uitrol
Periode
2026
Stack
  • Laravel
  • Inertia
  • React
  • Docker
  • Coolify

Een webshopplatform waarin een winkel geen kopie van de code is maar een rij in de database. Nieuwe shop erbij betekent geen nieuwe deploy.

Het inlogscherm van het commerce-platform

De tenant is de allereerste migratie

De tenants-tabel draagt tijdstempel 0000, nog voor de gebruikers. Daardoor heeft elk model dat erna komt een tenant-kolom en hangt er een globale scope onder die elke query filtert. Vergeten te filteren kan dus niet: je moet expliciet zeggen dat je de scope uitzet, en dat doet alleen de superadmin. Zonder actieve tenant filtert hij niet, zodat de console en de seeders gewoon werken.

Drie manieren om binnen te komen, drie manieren om de tenant te bepalen

Een tenantbeheerder wordt herkend aan zijn account, een superadmin kiest een tenant om in te kijken, en een storefront identificeert zich met een api-sleutel. Elk pad heeft zijn eigen middleware, en pas daarna staat de tenant vast. Dat is bewust niet één slimme functie die alle gevallen afvangt: die had bij het vierde geval een uitzondering nodig gehad.

Headless: de winkel staat los van het platform

De publieke api levert instellingen, producten, categorieën, menu's, pagina's, winkelwagen, verzendmethodes, betaalmethodes, kortingen, formulieren en de afrekening. Elk endpoint heeft zijn eigen limiet, oplopend van twaalf afrekenpogingen per minuut tot zestig winkelwagenregels. De winkel aan de voorkant is daardoor een los ding: aussieboots.lich.software is een statische site die alleen die api aanroept.

Betalen achter één contract

Afrekenen, webhook afhandelen en terugbetalen staan in één interface, met Mollie, Stripe en handmatig als implementaties. Welke provider een winkel gebruikt en met welke sleutels staat per tenant in de database, niet in de omgevingsvariabelen. Een nieuwe winkel met een eigen Mollie-account kost dus geen deploy, en een provider erbij is één klasse.

Getest tot in de browser

Naast unit- en featuretests met PHPUnit draait er een Playwright-suite die de beheeromgeving echt doorklikt. Die combinatie is er niet voor niets: dat een kleur per winkel goed in de database staat bewijst nog niet dat de juiste winkel hem ook toont. De e2e-tests controleren precies dat, met twee winkels naast elkaar en een superadmin die ertussen wisselt.

Wat een winkelbeheerder zelf kan

Producten met varianten en optietypes, categorieën, voorraad, kortingen en acties, verzendmethodes, orders met statusgeschiedenis, klanten, facturen, en daarnaast de etalage: pagina's met blokken, menu's per locatie, media en formulieren. De superadmin ziet daarboven alleen tenants en platformgebruikers.

Wat erin zit

  • Multi-tenant Eén codebase, een winkel is een rij; scheiding via een globale scope op elke query.
  • Publieke storefront-api Veertien endpoints achter een api-sleutel, elk met een eigen snelheidslimiet.
  • Producten Varianten, optietypes en -waarden, afbeeldingen, categorieën.
  • Bestellen Winkelwagen op token, afrekenen, orders met statusgeschiedenis en facturen.
  • Betalen Mollie, Stripe en handmatig achter één contract, met webhooks en terugbetalingen.
  • Kortingen Codes met een voorbeeldberekening vooraf, plus acties per product.
  • Cms erbij Pagina's met blokken, menu's per locatie, media en formulieren met reCAPTCHA.
  • Toegang Tweefactor, e-mailverificatie en een aparte superadmin-rol.
  • Tests PHPUnit voor unit en feature, Playwright voor de beheeromgeving in een echte browser.

Beeld