Hoe realtime voorraad echt synchroon blijft tussen je winkel en online (Shopify)

Door Robin Laseur

Op Shopify klopt dat ene voorraadgetal omdat je webshop en je POS geen twee systemen zijn die met elkaar in de pas moeten blijven. Ze lezen en schrijven in realtime hetzelfde voorraadrecord per locatie, opgesplitst in statussen die precies bijhouden hoeveel voorraad er is, hoeveel al vastligt en hoeveel nog verkocht kan worden. Raken een POS-verkoop en een webbestelling dezelfde variant, dan passen ze allebei dat ene record aan. Het getal verandert één keer en blijft kloppen. Dat is synchronisatie door het ontwerp zelf, geen geplande afstemming achteraf. Op vier specifieke plekken gaat het mis. Als je weet waar, kun je een opzet die echt unified is onderscheiden van een opzet die alleen gesynchroniseerd lijkt. Dit artikel legt het mechanisme van begin tot eind uit.
Waar dat ene voorraadgetal eigenlijk staat
Shopify houdt niet één getal per product bij, maar meerdere, per locatie. De verhouding daartussen is het hele mechanisme. Volgens de voorraaddocumentatie van Shopify heeft elke variant op elke locatie een set statussen: On hand, Available, Committed, Unavailable en Incoming.
On hand is de totale fysieke hoeveelheid op een locatie: alles wat in het pand ligt, of het nu direct verkocht kan worden of niet. Committed is voorraad die al is toegewezen aan openstaande bestellingen die nog niet zijn verzonden. Unavailable is voorraad die apart is gezet en niet verkoopbaar is, bijvoorbeeld eenheden die vastzitten in een conceptbestelling of die als beschadigd zijn gemarkeerd. Incoming is voorraad die onderweg is van een leverancier of via een overboeking en nog niet is aangekomen. Available is het getal waar de webshop om draait: wat overblijft als je de andere eraf haalt. De berekening is On hand min Committed min Unavailable, en Incoming telt helemaal niet mee.
Die aftreksom is de kern van het systeem. Available is het aantal dat je aan een nieuwe klant kunt beloven, en Shopify rekent het automatisch opnieuw uit zodra de andere statussen veranderen. Heeft een locatie 40 stuks on hand en liggen er 6 vast voor bestellingen die nog ingepakt moeten worden, dan is Available 34. Die 34 kan een klant kopen, online of in de winkel, en verder hoort er op die locatie niets tegen die variant te worden verkocht tot de getallen verschuiven. De 40 is niet veranderd, maar voor een nieuwe verkoop tellen er maar 34.

Wat er met het getal gebeurt als iemand koopt
Volg één eenheid door een aankoop en het synchronisatiemechanisme wordt zichtbaar.
Een klant bestelt online drie stuks. Shopify verlaagt On hand dan nog niet, want de voorraad ligt fysiek nog op de locatie. In plaats daarvan verschuiven er drie eenheden van Available naar Committed. On hand blijft gelijk, Available daalt met drie, en die drie zijn nu gereserveerd voor die bestelling. Pakt het team de bestelling in en wordt die verzonden, dan gaat Committed voor die bestelling terug naar nul en daalt On hand pas, omdat de voorraad het pand fysiek heeft verlaten. Het getal verschoof in twee stappen, eerst reserveren en dan vertrekken, en Available klopte op elk moment daartussen.
Een POS-verkoop werkt op dezelfde manier en tegen hetzelfde record, maar voegt de stappen samen: de transactie wordt bij het afrekenen meteen vastgelegd en afgerond, dus de telling van de winkellocatie verandert direct. Omdat Shopify POS On hand en Unavailable nu direct aan de kassa toont, naast Committed, ziet het winkelpersoneel hetzelfde beeld als waar de website mee werkt. Daardoor wordt er aan de toonbank minder vaak per ongeluk te veel verkocht.
Het laatste stuk is hoe de website bepaalt wat te koop is. De online beschikbaarheid van een product is de som van Available over alle locaties die aan het Online Store-kanaal zijn gekoppeld. Een locatie die niet voor dat kanaal is ingeschakeld, telt niet mee voor de website, ook niet als die fysiek vol ligt. Dat is later van belang, want het is een van de plekken waar het mechanisme ongemerkt afwijkt van wat je als ondernemer aanneemt.
Binnen deze kringloop zijn online en POS unified in de strikte zin: ze wisselen geen bestanden uit, maar werken met één set statussen per locatie die wordt bijgewerkt zodra transacties binnenkomen. Er valt niets af te stemmen, omdat er geen twee getallen zijn om af te stemmen.
Waarom gesynchroniseerd en unified niet hetzelfde zijn
Dit onderscheid bepaalt of je opzet te vertrouwen is. Een unified systeem deelt het record. Een gesynchroniseerd systeem houdt een eigen kopie bij en werkt die periodiek bij. Tussen twee updates zijn de twee het dus oneens, en elk verschil is een kans om iets te verkopen wat er niet is, of iets te verbergen wat er wel is.
Standaard Shopify online plus Shopify POS is unified, omdat beide met dezelfde statussen werken. Zodra er een derde partij bij komt die die statussen niet deelt, zoals een marketplacekanaal, een 3PL, een ERP, een tweede POS of een retourproces buiten het platform, is die partij gesynchroniseerd en niet unified. Zo’n systeem leest een getal, handelt ernaar en meldt later terug. Het gat tussen dat beeld en dat van Shopify is waar de vier fouten zitten. Ze hebben allemaal dezelfde oorzaak: iets las of schreef het record zonder rekening te houden met de statussen waarop het gebouwd is.

De vier dingen die het ongemerkt breken
Dit zijn stuk voor stuk voorwaarden, geen onvermijdelijkheden. Als je het mechanisme begrijpt, weet je welke op jouw opzet van toepassing zijn.
1. De race om de laatste eenheid
Het moment tussen het lezen van Available en het wegschrijven van Committed is kort, maar niet nul. Komen twee bestellingen voor dezelfde laatste eenheid vrijwel tegelijk binnen, en controleert een kanaal of app Available voordat de Committed van de andere is verwerkt, dan kunnen ze allebei worden geaccepteerd terwijl de voorraad er maar één dekt. Het resultaat is een oversell waarbij geen enkel systeem iets fout deed: elk las een getal dat klopte op het moment dat het werd gelezen.
De Shopify-admin zelf rekent correct, dus dit ontstaat zelden binnen standaard online plus POS. Het speelt wanneer een extern kanaal of een app een eigen gecachete Available bijhoudt en verkoopt op een verouderde kopie, of wanneer een product is ingesteld om door te verkopen bij nul voorraad, wat de controle bewust overslaat. Let dus op elk verkoopkanaal dat een kopie van het getal leest in plaats van het live record.
2. Voorraad die vastligt maar niet verkocht is
Committed en Unavailable vormen het reserveringsmechanisme, en fouten in beide richtingen zijn zichtbaar. Leest een systeem On hand en behandelt het dat als verkoopbaar, zonder rekening te houden met wat al Committed is, dan belooft het voorraad die fysiek aanwezig is maar al in andere bestellingen zit. Een latere klant koopt dan een eenheid die voor hem niet bestaat. Wordt Available daarentegen één keer ingesteld en niet opnieuw berekend als Committed verandert, dan kan voorraad als uitverkocht verschijnen terwijl er vrije eenheden op de plank liggen. Conceptbestellingen voegen daar een subtielere variant aan toe: ze zetten voorraad op Unavailable, waardoor een variant uitverkocht kan lijken om een reden die je allang vergeten bent. De voorwaarde hier: elke koppeling of werkwijze die voorraad aanraakt zonder Committed en Unavailable te lezen en te respecteren zoals de webshop dat doet.
3. De verkeerde locatie
Het multi-locatiemodel van Shopify behandelt de voorraad van elke locatie als los van de rest. Voorraad wordt niet automatisch over locaties samengevoegd, dus welke locatie een kanaal leest en reserveert, is een keuze met gevolgen. Daaruit volgen verschillende foutsituaties. Een product kan On hand hebben op een locatie terwijl Available een streepje toont. Dat betekent dat het daar inactief is en vanaf die locatie niet verkocht of verzonden kan worden, hoeveel er ook fysiek ligt. Een locatie die alleen voor de winkel is, kan voorraad hebben die meetelt in je totaal maar niet voor het online kanaal, zodat de website minder beschikbaar toont dan je in bezit hebt. En orderroutering die reserveert vanaf een locatie met weinig Available kan een verkoop blokkeren terwijl een andere locatie genoeg heeft, omdat die andere locatie niet voor het kanaal is ingeschakeld. Geen van deze gevallen is een synchronisatiefout. Het is telkens de multi-locatielogica die precies doet wat is ingesteld, terwijl iemand aanneemt dat de voorraad één gedeelde pot is.
4. Alles wat alleen synchroniseert
Hier doet de grens tussen gesynchroniseerd en unified schade. Een 3PL, een ERP, een marketplaceconnector of een retourproces buiten Shopify deelt de statussen niet. Zo’n systeem kopieert getallen heen en weer, volgens een schema of via een koppeling. Twee situaties overheersen. Ten eerste timing: tussen updates lopen het beeld van het externe systeem en dat van Shopify uit elkaar, en elke verkoop op de verouderde kant is een verkoop op een getal dat al niet meer klopte. Ten tweede een verkeerd veld: een koppeling die naar de verkeerde status schrijft, bijvoorbeeld een fysieke telling in Available zet terwijl die On hand had moeten bijwerken, verkoopt Committed voorraad ongemerkt dubbel, omdat de buffer waar de reserveringslogica op leunt is overschreven. Retouren horen hier ook bij. Een retour zet voorraad terug, en of die in Available belandt of in afwachting van inspectie in Unavailable, en of het externe systeem überhaupt weet dat de retour er is, bepaalt of die teruggekomen eenheid blijft kloppen. De voorwaarde is simpel: elk systeem buiten het record van Shopify is gesynchroniseerd, en elk daarvan is een plek waar het ene getal ongemerkt niet meer één getal is.
Zo zie je of jouw opzet echt unified is of alleen gesynchroniseerd
Het mechanisme geeft je een directe test. Vraag voor elk systeem dat voorraad kan verkopen of verplaatsen met welk record het werkt. Leest en schrijft het de live statussen per locatie in Shopify, dan is het unified met de rest en klopt het getal vanzelf. Houdt het een eigen kopie bij en stemt het later af, dan is het gesynchroniseerd en hoort het op de lijst van plekken waar je op de vier fouten hierboven let.
Standaard Shopify online en Shopify POS doorstaan deze test samen. De vraag voor de meeste bedrijven is hoeveel andere partijen ze daaraan hebben toegevoegd, en of elk daarvan de statussen respecteert of alleen het getal kopieert. Zit er een marketplace, een 3PL of een ERP in de keten, dan hangt de betrouwbaarheid van het geheel af van hoe zorgvuldig die koppeling is gebouwd. Dat is een ontwerpkeuze, geen instelling die je aanzet. Zit je risico op die grens, breng dan de ERP- en integratiekant net zo zorgvuldig in kaart als de standaardkern. Precies dat soort opzet bouwt en controleert Flatline.
Belangrijkste punten
Shopify houdt één voorraadgetal kloppend door per locatie statussen bij te houden: On hand, Available, Committed, Unavailable en Incoming. Available is On hand min Committed min Unavailable. Online en POS werken allebei in realtime met datzelfde record.
Een bestelling verschuift voorraad van Available naar Committed en verlaagt On hand pas bij verzending. Een POS-verkoop doet beide tegelijk. De beschikbaarheid op de website is de som van Available over de locaties die aan het Online Store-kanaal zijn gekoppeld.
Unified betekent dat record delen. Gesynchroniseerd betekent het getal kopiëren en later afstemmen. Dat verschil is de bron van elke afwijking.
Vier situaties breken de synchronisatie: een race tussen het lezen van Available en het wegschrijven van Committed, systemen die Committed en Unavailable negeren, multi-locatielogica die wordt aangezien voor één gedeelde pot, en elk extern systeem dat alleen synchroniseert in plaats van deelt.
Om je eigen opzet te beoordelen, kijk je met welk record elk systeem werkt dat verkoopt of voorraad verplaatst. Live statussen betekent unified; een aparte kopie betekent gesynchroniseerd, en dus een plek om in de gaten te houden.
Veelgestelde vragen
Werkt Shopify POS de online voorraad in realtime bij?
Ja. Shopify POS en de webshop werken met hetzelfde voorraadrecord per locatie, in plaats van twee losse systemen te synchroniseren. Een POS-verkoop past de gedeelde telling dus direct aan en de website toont dat zonder geplande update. De uitzondering is elk extra kanaal of systeem dat een eigen kopie van het getal bijhoudt.
Waarom verkoopt mijn Shopify-winkel nog steeds te veel als de voorraad realtime is?
Meestal omdat iets werkt met een verouderde of verkeerde versie van het getal: een extern kanaal dat verkoopt op een gecachete Available, een koppeling die Committed voorraad negeert, een product dat is ingesteld om door te verkopen bij nul voorraad, of orderroutering naar de verkeerde locatie. Standaard online plus POS verkoopt zelden uit zichzelf te veel, omdat Shopify Available correct berekent.
Wat is het verschil tussen On hand en Available in Shopify?
On hand is de totale fysieke voorraad op een locatie, inclusief eenheden die al aan bestellingen zijn toegewezen of als niet beschikbaar apart zijn gezet. Available is wat je echt aan een nieuwe klant kunt verkopen: On hand min Committed min Unavailable. Verkooplogica hoort Available te lezen, niet On hand.
Gerelateerde artikelen



