Jeroen de Reus

13 december 2023

Door Jeroen de Reus

Magento Certified Developer

How to: Magento MSI (Multi Source Inventory) instellen

Veel van onze klanten werken met meerdere magazijnen van waaruit ze producten leveren aan hun klanten. Vooral wanneer er over de grens verkocht wordt, is er vaak sprake van lokale opslag van voorraad. De grote vraag is, hoe beheer je nou de voorraden vanuit alle verschillende locaties, bepaal je de onderlinge afhankelijkheden en hou je deze realtime up to date in je Magento webshop? Daarvoor kijken we deze week naar de Magento MSI (Multi-Source Inventory). 

Wat is Magento MSI (Multi Source Inventory)

De MSI van Magento 2 is een community engineering project geweest met als doel om voorraadbeheer mogelijk te maken wanneer er  sprake is van meerdere voorraden, vooral voor bedrijven die opereren vanuit meerdere magazijnen of locaties. 

Waarom is de Multi Source Inventory waardevol?

We leggen het uit aan de hand van een praktijkvoorbeeld. Stel je hebt een groothandel webshop, waarbij je producten levert aan zowel lokale winkels als online klanten. Je hebt zowel in Nederland als België magazijnen en wil je voorraadbeheer instellen met behulp van MSI. We lopen even ‘hoog over’ de stappen door waardoor je ziet hoe je te werk zou gaan en wat MSI vervolgens voor je kan betekenen.

Om te starten met MSI moet je twee zaken aanmaken, namelijk een ‘Stock’ (voorraad) en een ‘Source’ (voorraad bron). We leggen in de context van Magento eerst uit wat deze twee begrippen/entiteiten zijn en wat ze voor functie dienen. Vervolgens leggen we uit hoe je ze kunt configureren. Om verwarring te voorkomen hanteren we hier de Engelse terminologie.

Source

Een source is een fysieke locatie vanuit waar je producten geleverd en/of verstuurd kan krijgen. Denk hierbij aan een winkel, diverse magazijnen of zelfs een externe leverancier. Een bepaald product kan dus per source een numerieke waarde als voorraad hebben. 

Stock 

De stock kan soms wat verwarrend zijn voor mensen. In principe is de stock een virtuele representatie van je volledige voorraad. Deze virtuele representatie heeft een paar functies:

Ten eerste groepeer je enkele sources samen. Deze groepering wijs je dan vervolgens toe aan een verkoopkanaal, veelal gewoon een Store binnen je Magento installatie.

De tweede functie is dat je in deze voorraad ook direct de prioritering aangeeft van je verschillende sources. Dit betekent dat je aangeeft in welke volgorde je sources gebruikt moeten worden voor het leveren van de producten aan de klant 

De derde functie is dat de stock je een werkbare optelsom geeft. Dit is in de basis je volledige aanwezige voorraad, ofwel je opgetelde stock. 

Belangrijk is om te weten dat Magento, zodra er gebruik wordt gemaakt van MSI, overstapt op een Salable Quantity. Zodra je een product verkoopt, wordt je salable quantity direct verminderd met het aantal gekochte producten. Zodra je het product echter ook verzendt (en deze dus de voorraad daadwerkelijk verlaat) zal de quantity van de betreffende stock ook verminderd worden. Let op: Wanneer voor een product backorders mogelijk zijn, dan wordt de negatieve out-of-stock threshold hierbij opgeteld.

Voorbeeld: Voor een product A heb je in het magazijn Nederland 10 producten en in het magazijn België 15 producten. Echter heb je voor Product A ook aanstaan dat je 100 producten via de backorder kunt verkrijgen. Je totale Salable Quantity is dan 125 voor Product A. 

De basisconfiguratie van je voorraden 

Je begint na installatie met het toevoegen van twee Magazijnen in de Magento backend onder ‘Stores > Inventory > Sources’;

We willen dan graag de volgende magazijnen instellen.

Je klikt vervolgens op 'Add New Source'. Enkele gegevens zijn verplicht zoals de naam en de code die je wilt gebruiken voor het magazijn. In ons voorbeeld zouden wij twee 'sources' aanmaken met:

Naam: Voorraad Groningen | Voorraad Antwerpen

Code: groningen | antwerpen

source aanmakenDaarnaast moet ook minimaal het juiste land + postcode worden ingevuld. Sla vervolgens op. 

Nadat de sources zijn aangemaakt, kan de stock aangemaakt worden. Dit doe je onder ‘Stores > Inventory > Stocks.

stock aanmakenHier knoop je een paar eindjes aan elkaar. Ten eerste geef je een naam aan je voorraad. Onze suggestie is om hier “Totaal te verkopen voorraad” van te maken. Dit zodat je ook in de naam meegeeft dat backorders mogelijk zijn (zie eerdere omschrijving salable quantity). 

Ten tweede kies je het verkoopkanaal. Veelal is dit de betreffende store waar je de voorraad voor aanmaakt.

Ten derde wijs je de sources toe aan de stock. Zoals aangegeven geeft dit aan van welke sources een product gebruik kan maken. Je stelt hier ook direct in welke volgorde je sources gebruikt moeten worden. Je kan ze drag-n-droppen door te klikken en te slepen op het icoontje voorafgaand aan de code (de 8 vierkantjes). Sla vervolgens op.

Gefeliciteerd, hiermee is je Magento MSI in de basis geconfigureerd!

Let op dat er altijd een default stock & default source aanwezig is in de twee bovenstaande lijsten. Als je van een oudere Magento versie komt dan moeten deze handmatig worden aangemaakt. Als je Magento 2.4 direct hebt geïnstalleerd, zullen deze reeds aanwezig zijn. Je hoeft deze source & stock niet te gebruiken. 

Voorraden toewijzen aan je producten

Nu de stock en sources zijn aangemaakt, kan je beginnen met het configureren van de juiste voorraden per product. 

Enkel product

De wijze waarop je dit doet voor een nieuw product en een bestaand product is hetzelfde. In de backend ga je hiervoor naar je producten catalogus “Catalog -> Inventory -> Products” en open je het gewenste product. Je zult op de product bewerken pagina zien dat er nu een nieuwe dropdown bij is gekomen genaamd ‘Sources’. 

sources onder productKlik op ‘Assign Sources’, vink de ‘sources’ aan die je wilt gebruiken en klik op ‘Done’. Vervolgens zie je de ‘sources’ toegewezen en kun je het aantal producten invoeren. 

Meerdere producten

Wanneer je het overzicht van de producten ziet, is er in Magento de mogelijkheid om in bulk wijzigingen uit te voeren. Gelukkig is dat voor het toewijzen van de ‘sources’ ook mogelijk zodat je in bulk je ‘sources’ kan toewijzen aan je producten.

Linksboven de product grid is de mogelijkheid om alle producten (of alle huidig zichtbare producten) te selecteren die op dat moment niet uitgefilterd zijn. Dit doe je door op het witte vierkantje te klikken.

product selectie bulkZodra je een selectie hebt gemaakt kun je vervolgens gebruikmaken van het actiemenu. Daar krijg je drie opties die zich bezighouden met MSI. Assign Inventory SourceTen eerste zul je al je nieuwe ‘sources’ moeten toewijzen. Dit doe je door gebruik te maken van “Assign Inventory Source”. Door daarop te klikken kom je op een pagina terecht waar je de juiste ‘sources’ kunt aanklikken. Voer dit uit en klik op ‘Assign Sources’. Je producten zijn nu toegewezen aan je ‘sources’.

Belangrijk 1: Let op dat wanneer je nog geen ‘default stock & source’ hebt, omdat je bijvoorbeeld van een oudere Magento versie komt, dat voorraad voor alle geselecteerde producten op 0 komt te staan zodra je gebruik gaat maken van Magento MSI.

Belangrijk 2: Sommige samengestelde producten zoals het type Bundle Product kunnen voor problemen zorgen zolang staat aangevinkt dat de onderliggende types altijd samen worden verstuurd. Je kan dit (ook in bulk) omzetten. 

Zodra je nieuwe ‘sources’ zijn toegewezen, kun je gebruik gaan maken van ‘Unassign Inventory Source’. Hiermee kan je de default source van de producten weghalen. Als alternatief kun je ook gebruik gaan maken van ‘Transfer Inventory To Source’. Hiermee kun je de voorraad van je default source overhevelen naar één van de nieuwe ‘sources’. Hierbij is ook de mogelijkheid om te selecteren dat hij van de oude source (in dit geval de default source) ontkoppeld wordt. 

Na deze handeling zul je zien dat ook in je ‘product grid’ de ‘salable quantity’ en de voorraad per ‘source’ zijn vermeld. 

Orderafhandeling met Magento MSI

Wanneer een klant een order plaatst wordt deze direct van je 'salable quantity' afgehaald. Het is belangrijk om op te merken dat op dat moment je ‘salable quantity’ en je daadwerkelijke aantal producten op voorraad niet in balans zijn. Deze balans wordt hersteld op het moment dat je een shipment aanmaakt. Het is belangrijk deze balans periodiek even te controleren. Hier komen we later op terug.

Nu de klant een order heeft geplaatst wil je deze versturen. Hiervoor gebruik je de normale stappen in Magento. Open de geplaatste order en klik op ‘Ship’. Je komt nu op de pagina terecht in de backend waar je de zending kunt aanmaken. 

source selection algorithmOp deze pagina zie je rechtsboven een knop genaamd 'Source Selection Algorithm' (SSA). Per default staat deze ingesteld op Source Priority. 

In principe kan je gebruik maken van twee algoritmes die je juiste hoeveelheden van de producten selecteren per magazijn.

Source Priority Algorithm 

Dit is het algoritme waarin Magento selecteert op basis van de ‘Source Priority’ zoals je die hebt ingesteld in je ‘Stock’ (zie uitleg aanmaken Stock). 

Om ons eerdere voorbeeld aan te halen. We hebben een product A en een product B. Product A is alleen op voorraad in Groningen en product B alleen in Antwerpen. Een klant plaatst een order met beide producten. Het SSA op basis van ‘source priority’ zal nu aanbevelen dat er vanuit beide magazijnen een product wordt verstuurd. Je doet dit door bovenin bij Source het Groningse magazijn te kiezen. Klik vervolgens door op ‘Proceed With Shipment’ en klik op ‘Ship’. Nu zul je wederom hetzelfde moeten doen voor het magazijn Antwerpen. Hiermee wordt voor deze ene order dan 2 shipments aangemaakt en zal je order op complete komen te staan.

Distance Priority Algorithm

De ‘distance priority algorithm’ werkt qua handelingen op dezelfde manier. Het enige verschil is dat de aanbevolen toewijzing werkt op basis van afstand van de ‘source’ tot het leveradres van de klant. Deze optie vergt wel wat extra configuratie. Zie hiervoor: 

/docs/commerce-admin/inventory/basics/selection-reservations.html

Annuleringen en refunds

Uiteraard krijgt elke online merchant te maken met annuleringen en refunds, gezien consumenten hiertoe gerechtigd zijn. 

Wanneer een klant een annulering plaatst zal Magento dit omgekeerd verwerken. De ‘stock’ wordt dan weer bijgeschreven bij de ‘Salable Quantity’.

Wanneer er een ‘refund’ wordt gedaan op een order die reeds was verzonden (en de status dus ‘completed’) hangt er vanaf wat er in de backend geconfigureerd is m.b.t. shipments. 

Onder Stores -> Configuration -> Catalog -> Inventory -> Product Stock Options -> Automatically Return Credit Memo Item to Stock. Als deze optie uit staat zal Magento alleen crediteren maar zal er ten aanzien van de voorraad en de salable quantity geen wijzigingen optreden. Als deze optie aanstaat zullen de producten respectievelijk bij hun originele ‘sources’ worden opgeteld en de ‘salable quantity’. Mogelijk is dit onder MSI niet handig als alle producten naar 1 source worden teruggestuurd. 

De balans 

De balans tussen de opgetelde kwantiteiten en de ‘salable quantities’ voor een bepaald product zou altijd in evenwicht moeten zijn als alle orders die dit product bevatten zijn afgerond tot op zijn minst een ‘cancelled’, ‘complete’ of ‘closed status’. 

We hebben al uitgelegd dat op het moment van plaatsen Magento een bepaald aantal van de ‘salable quantity’ aftrekt. Dit wordt het plaatsen van een ‘reservering’ genoemd. Zodra het product wordt verstuurd (of geannuleerd) wordt deze reservering losgelaten. Op database niveau ziet dit er als volgt uitdatabase viewDoor diverse redenen kan het zijn dat alle orders correct verwerkt zijn maar dat er toch voor een bepaald product een disbalans is. Een voorbeeld van hoe dit kan ontstaan is dat er nog pending orders waren toen Magento MSI werd aangezet. Zo heeft Magento het moment van de reservering ‘gemist’ maar wel ‘loslaten’ van de reservering geplaatst. 

Alle inbalansen zijn te vinden door in de commandline van magento inventory:reservation:list-inconsistencies te draaien. Het is aan te bevelen de orderlijst die hieruit voortvloeit na te gaan en deze orders nog op een correcte manier af te werken (onbehandelde orders worden namelijk vanzelf opgelost dan). Alles wat je dan overhoudt is dan een permanente disbalans die je kan oplossen met het commando inventory:reservaction:create-compensations

Tip: De output van het eerste commando kan ‘raw’ worden uitgeprint (operator -r) en als parameter worden ‘gepiped’ in het tweede commando. 

Magento Multi Source Inventory: Tot slot

Magento’s Multi Source Inventory is een backend onderdeel van Magento om het beheren van voorraden en het slim toepassen van verzendingen mogelijk te maken. De klanten merken hier, meerdere zendingen uitgesloten, niets van tijdens hun winkelervaring. Er zijn echter modules ontwikkeld die het mogelijk maken om de verschillende hoeveelheden per source door te geven aan de klanten om de winkelervaring te verbeteren. De volgende blog in deze reeks zal zich daar op focussen. 

Magento 2 MSI is een krachtige tool voor ondernemingen die streven naar efficiënt voorraadbeheer over meerdere magazijnen. Door de implementatie van dit systeem kun je niet alleen de nauwkeurigheid van je voorraadgegevens verbeteren, maar ook de algehele operationele efficiëntie vergroten. Als je de bovenstaande stappen om MSI in te stellen volgt en configureert in Magento 2, zal je de voordelen ervaren van geavanceerd voorraadbeheer voor e-commerce.

Heb je hulp nodig met het installeren of instellen van MSI voor jouw Magento webshop? Wij helpen je graag! Of wil je gewoon eens sparren over de mogelijkheden of meer informatie, neem contact met ons op voor een vrijblijvend gesprek.

Jeroen de Reus
Over de auteur

Jeroen de Reus (Magento Certified Developer)

13 december 2023

Jeroen is een doorgewinterde ontwikkelaar met 5 jaar ervaring in Magento en is erkend Magento Certified Developer. Zijn no-nonsense aanpak in webontwikkeling weerspiegelt solide technische kennis. Jeroen deelt praktische inzichten, waardevol voor iedereen in de wereld van e-commerce en webdevelopment.