Warehouse management in Excel werkt totdat het niet meer werkt. Op welk moment bouw je een custom WMS op Laravel, wat kost het, en wat levert het op?
WMS bouwen op Laravel — van handmatig naar geautomatiseerd
Een klant van ons verwerkte 400 orders per dag met een combinatie van Excel, WhatsApp en een gedeeld Google Drive-account. Dat werkte — tot de dag dat twee medewerkers dezelfde order picten en een andere order niet werd gepickt. De klacht kostte hem €2.400 aan retouren en drie negatieve reviews.
Een Warehouse Management System (WMS) lost dat op. Maar een standaard WMS is duur, complex en vaak niet passend voor de specifieke situatie. Een custom WMS op Laravel is een alternatief dat wij voor een groeiend aantal klanten bouwen. Dit artikel legt uit wanneer dat zinvol is en wat je kunt verwachten.
Wat je leert in dit artikel
- Wanneer Excel en een standaard WMS niet meer werken
- Waarom custom WMS op Laravel een reële optie is
- De architectuur van een typisch Laravel WMS
- Wat het kost en wat je ervoor terugkrijgt
- Vergelijking met standaard WMS-pakketten
Wanneer is een WMS nodig?
Handmatig orderbeheer heeft een grens. Die grens zit doorgaans bij 50-150 orders per dag, afhankelijk van de complexiteit van de orders.
Signalen dat je een WMS nodig hebt:- Pickfouten komen wekelijks voor en kosten je meer dan €500 per maand in retouren en klantenservice
- Voorraadtelling klopt niet overeen met wat je systemen zeggen
- Inwerken van nieuwe magazijnmedewerkers duurt meer dan twee weken
- Je hebt meerdere opslaglocaties en weet niet precies waar een product staat
- FIFO (first-in-first-out) wordt niet consequent gevolgd
- Retouren worden niet systematisch verwerkt
Als drie of meer van deze punten van toepassing zijn, betaal je al voor een WMS — alleen heet het nu klantenservicekosten, retouren en voorraadafschrijvingen.
Standaard WMS vs custom: de afweging
Voordat je kiest voor een custom oplossing, moet je eerlijk de alternatieven bekijken.
| Criterium | Standaard WMS (bijv. Picqer, MyParcel WMS) | Custom WMS op Laravel |
|---|---|---|
| Implementatietijd | 2-8 weken | 3-6 maanden |
| Initiële kosten | €5.000 - €30.000 implementatie | €40.000 - €120.000 ontwikkeling |
| Doorlopende kosten | €500 - €3.000/maand licentie | €300 - €1.000/maand hosting + onderhoud |
| Aanpasbaarheid | Beperkt tot configuratie-opties | Volledig |
| Integraties | Standaard connectors | Volledig maatwerk |
| Kennisafhankelijkheid | Afhankelijk van leverancier | Afhankelijk van ontwikkelaar |
- Je processen grotendeels standaard zijn
- Je snel live wilt
- Jouw volume past in de licentiemodel (doorgaans op basis van orders/maand)
- Je processen fundamenteel afwijken van standaard (bijv. serienummerbeheer, specifieke picking-strategieën, batchproductie)
- Je diep wilt integreren met bestaande systemen die geen standaard connector hebben
- Het licentiemodel op schaal duurder wordt dan de ontwikkelkosten
De architectuur van een Laravel WMS
Een typisch WMS dat wij bouwen bestaat uit vier lagen.
Laag 1: Orderinname en synchronisatie
Orders komen binnen uit meerdere bronnen: Magento, Shopify, bol.com, of direct via API. Een synchroon Laravel-component haalt orders op via webhooks of polling en normaliseert ze naar een intern formaat.
// OrderSyncService: verwerk inkomend webhook-payload van Magento
class OrderSyncService
{
public function handle(array $payload): Order
{
return DB::transaction(function () use ($payload) {
$order = Order::updateOrCreate(
['external_id' => $payload['increment_id'], 'source' => 'magento'],
[
'customer_name' => $payload['customer_firstname'] . ' ' . $payload['customer_lastname'],
'shipping_method' => $payload['shipping_description'],
'status' => OrderStatus::PENDING,
'ordered_at' => Carbon::parse($payload['created_at']),
]
);
foreach ($payload['items'] as $item) {
$order->lines()->updateOrCreate(
['sku' => $item['sku']],
[
'product_name' => $item['name'],
'quantity' => (int) $item['qty_ordered'],
'picked' => 0,
]
);
}
return $order;
});
}
}
Laag 2: Voorraad- en locatiebeheer
Producten staan op locaties. Locaties zitten in zones. Zones hebben picking-prioriteit. Het datamodel is hiërarchisch maar moet snel bevraagbaar zijn.
Magazijn
└── Zone (bijv. A, B, C)
└── Rij (bijv. A01, A02)
└── Locatie (bijv. A01-01, A01-02)
└── Voorraad (product + batch + hoeveelheid)
Per locatie worden bijgehouden: product-SKU, batchnummer (voor FIFO), hoeveelheid en eventueel houdbaarheidsdatum. Bij een pickactie vermindert het systeem de voorraad op de specifieke locatie en logt de transactie.
Laag 3: Pick- en packflow
Dit is de kern van het systeem. Orderpicking kan op drie manieren georganiseerd zijn:
Orderpicking: één medewerker pickt één order volledig. Eenvoudig, geschikt voor lage volumes. Batch picking: één medewerker pickt meerdere orders tegelijk, gesorteerd op locatie om looproutes te minimaliseren. 30-50% efficiënter bij grotere volumes. Zone picking: verschillende zones worden door verschillende medewerkers gepickt. Orders worden samengebracht op een consolidatiepunt. Geschikt voor grote magazijnen.Een Laravel WMS implementeert dit als een Filament-admin voor supervisors en een eenvoudige mobile-first interface (of barcodescanner-interface) voor medewerkers.
// Genereer pick-lijst gesorteerd op magazijnlocatie (batch picking)
class PickListGenerator
{
public function generate(Collection $orders): Collection
{
return $orders
->flatMap(fn(Order $order) => $order->lines)
->groupBy('sku')
->map(fn($lines, $sku) => [
'sku' => $sku,
'quantity' => $lines->sum('quantity'),
'location' => $this->findOptimalLocation($sku),
'orders' => $lines->pluck('order_id')->unique(),
])
->sortBy('location.sort_key')
->values();
}
}
Laag 4: Verzending en tracering
Na picken en packen genereert het systeem verzendlabels via de API van de carrier (PostNL, DPD, DHL). Track & trace-codes worden teruggekoppeld naar de webshop en naar de klant.
// PostNL API: label aanmaken en traceercode opslaan
$shipment = $this->postnlClient->createShipment([
'Shipment' => [
'Addresses' => [['AddressType' => '01', ...], ['AddressType' => '02', ...]],
'ProductCode' => '3085',
'Reference' => $order->id,
],
]);
$order->update([
'tracking_code' => $shipment['Barcode'],
'label_url' => $shipment['Labels'][0]['Content'],
'status' => OrderStatus::SHIPPED,
]);
Integraties die standaard WMS-pakketten moeilijk aankunnen
Dit is waar custom ontwikkeling zijn waarde bewijst. Wij bouwen regelmatig integraties die standaard WMS-pakketten niet ondersteunen:
Serienummerbeheer. Elektronica, gereedschap, apparatuur — producten waarbij je per verkocht stuk het serienummer moet registreren voor garantie en traceability. Productieorders. Kits die uit losse componenten worden samengesteld in het magazijn. Het WMS beheert zowel de componentenvoorraad als de samengestelde producten. Douane- en exportdocumentatie. Exporterende bedrijven hebben per zending specifieke documentatie nodig. Het WMS genereert packing lists, certificaten van oorsprong en pro forma facturen op basis van orderdata. Koppeling met eigen ERP. Standaard WMS-paketten hebben connectors voor gangbare ERP's. Een koppeling met een maatwerk-ERP of een ouder systeem zonder REST API vereist custom integratiecode.Kosten en ROI
Een custom WMS is een investering van €40.000-120.000, afhankelijk van complexiteit. Dat lijkt veel. Hier is de rekening die wij bij klanten maken.
Voorbeeld: klant met 200 orders/dag| Kostenpost | Voor WMS | Na WMS |
|---|---|---|
| Pickfouten (retouren + klantenservice) | €3.000/maand | €300/maand |
| Handmatige administratie (2 FTE) | €5.000/maand | €2.500/maand |
| Voorraadafschrijvingen (telling fouten) | €1.500/maand | €300/maand |
| WMS licentie/hosting | €0 | €800/maand |
| Netto besparing | €5.900/maand |
Terugverdientijd: 7-15 maanden afhankelijk van de exacte implementatiekosten.
Dit zijn gemiddelden. De werkelijke cijfers hangen af van jouw foutpercentage, ordervolume en arbeidskosten.
Wat je niet moet onderschatten
Procesontwerp kost tijd. Voordat we een regel code schrijven, brengen we de bestaande processen in kaart. Dat duurt 2-4 weken en is niet goedkoop — maar een WMS dat de verkeerde processen automatiseert is waardeloos. Adoptie door medewerkers. Een WMS verandert hoe magazijnmedewerkers werken. Dat vereist training en een periode van weerstand. Plan dit in. Data-initialisatie. Alle producten moeten worden ingevoerd met de juiste locaties, batchnummers en hoeveelheden. Bij een grote catalogus is dit weken werk. Onderhoud. Een custom WMS vereist een onderhoudssrelatie met een ontwikkelaar. Zorg dat die contractueel is vastgelegd. Meer hierover op onze Laravel-pagina.Conclusie
Een custom WMS op Laravel is geen voor elke situatie het juiste antwoord. Maar als jouw processen complex zijn, standaard pakketten niet passen, of het licentiemodel op schaal te duur wordt — dan is het een serieuze optie.
De businesscase is doorgaans sluitend boven 100 orders per dag met een foutpercentage boven de 1%. Daaronder is een standaard pakket zoals Picqer of MyParcel WMS waarschijnlijk sneller en goedkoper.
Wij bouwen WMS-systemen als onderdeel van bredere Laravel-trajecten. Bekijk wat wij doen met Laravel of neem contact op voor een gesprek over jouw specifieke situatie. Voor de webshop-kant van de integratie werken wij met Magento en Shopify.
Veelgestelde vragen
Hoe lang duurt de ontwikkeling van een custom WMS?Een basis WMS (orderinname, picking, verzending) is in 3-4 maanden te bouwen. Met uitgebreide features zoals serienummerbeheer, productieorders en meerdere magazijnlocaties: 5-8 maanden.
Kan een custom WMS integreren met bol.com en Magento tegelijk?Ja. Wij bouwen standaard multi-source orderinname. Orders uit alle kanalen worden genormaliseerd naar één intern formaat.
Is Filament de juiste keuze voor het admin panel?Voor de supervisors-interface: ja, Filament bespaart significant ontwikkeltijd. Voor de picker-interface (mobiel, barcodescanner) bouwen we een aparte lichtgewicht interface.
Wat als mijn volume sterk groeit? Schaalt een Laravel WMS?Laravel schaalt horizontaal via queue workers en database read replicas. Tot een miljoen orders per maand is er geen fundamenteel schaalbaarheidsplafond. Daarboven vereist de architectuur aanpassingen.

Geschreven door Ruthger Idema
15+ jaar ervaring in e-commerce development. Gespecialiseerd in Magento, Shopify en Laravel maatwerk.
Meer over ons team →