Kennisbank
Webshop voorraad syncen: welk getal, hoe vaak en hoe je het schrijft
Voorraad syncen betekent dat een koppeling per artikel en per locatie de vrije voorraad uit het leidende systeem haalt, er een buffer van aftrekt en alleen wat veranderd is naar elk verkoopkanaal schrijft. Of dat klopt, hangt af van drie keuzes: welk getal je doorgeeft, hoe vaak de stand wordt bijgewerkt en of de koppeling een getal zet of een verschil doorgeeft.
Bijgewerkt op
Het korte antwoord
Voorraad syncen is een ronde van vier stappen per artikel, die elke paar minuten of bij elke wijziging opnieuw loopt:
| Stap | Wat de koppeling doet | Voorbeeld, artikel 10482 |
|---|---|---|
| Lezen | vrije voorraad per locatie uit het leidende systeem | magazijn 46, winkel 8 |
| Rekenen | locaties optellen die voor dit kanaal leveren, buffer eraf | 46 min 2 = 44 |
| Vergelijken | met wat het kanaal nu toont | webshop toont 47 |
| Schrijven | alleen bij verschil, en voorwaardelijk | 44, mits het nog 47 is |
Elke stap heeft een eigen manier om mis te gaan. Hieronder de drie keuzes die bepalen of het getal in de webshop klopt. Wat de hele voorraadstroom omvat, staat bij voorraad en beschikbaarheid.
Welk getal je synct
Het getal dat naar de webshop gaat is de vrije voorraad: wat er ligt, min wat al voor orders is gereserveerd. Systemen geven dat getal onder een eigen naam:
| Systeem | Veld | Opbouw |
|---|---|---|
| Picqer | freestock per magazijn |
stock min reserved |
| Shopify | available per locatie |
naast committed, incoming en andere standen |
| AFAS Profit | StockActual of StockEconomic |
economisch: met openstaande orders verrekend |
| WooCommerce | stock_quantity |
één getal per product of variatie |
Twee dingen gaan hier stil mis. Een koppeling die stock leest in plaats van freestock, verkoopt de stuks die al voor een order klaarliggen. En vrije voorraad kan negatief zijn. In Picqer's eigen voorbeeld staat een artikel met stock 0, reserved 6 en freestock -6. De koppeling geeft een negatieve vrije voorraad door als 0 en meldt de 6 stuks in backorder apart, zodat de webshop geen tekort als voorraad leest. Welke standen er zijn en welke de klant hoort te zien, staat in welke voorraad toon je in je webshop.
Hoe vaak: webhook, ronde of allebei
Hoe vaak de stand wordt bijgewerkt, bepaalt hoe lang een ander kanaal een verkocht stuk nog aanbiedt. Er zijn twee manieren om een wijziging op te merken. Een webhook: de bron meldt de wijziging zelf, zoals Picqer met products.free_stock_changed of Shopify met inventory_levels/update. Of een ronde: de koppeling vraagt op vaste tijden wat er gewijzigd is. Hoe die twee zich tot elkaar verhouden staat in wat is een webhook.
Een rekenvoorbeeld. Artikel 10482 verkoopt 96 stuks per dag over webshop en marktplaats, tussen 08:00 en 20:00. Dat is 96 / 12 = 8 stuks per uur.
| Bijwerken | Verkoop binnen één ronde, gemiddeld | Buffer die dat opvangt |
|---|---|---|
| Ronde elke 15 minuten | 8 x 0,25 = 2 stuks | 2 |
| Ronde elke 5 minuten | 8 / 12 = 0,67 stuks | 1 |
| Webhook, binnen seconden | minder dan 0,1 stuk | alleen voor telfouten |
Een buffer van 2 kost bij een langzaam artikel omzet: bij 2 stuks beschikbaar toont de webshop 0. Een kortere ronde maakt een kleinere buffer mogelijk, maar kost verzoeken. Elke 5 minuten is 288 rondes per dag. Bij een bron met een dagbudget, zoals de 5.000 verzoeken van Exact Online, telt dat mee; de som per systeem staat in doorvoer berekenen. Wat er gebeurt als twee klanten toch binnen één ronde het laatste stuk kopen, staat in twee klanten, het laatste exemplaar.
Naast de snelle route hoort één volledige vergelijking per nacht: alle artikelen lezen en tegen alle kanalen leggen. Die vindt de afwijkingen die geen wijziging opleverden, zoals een webhook die niet aankwam of een handmatige correctie in de webshop.
Zetten of bijstellen
Een koppeling schrijft voorraad op een van twee manieren. Zetten: de voorraad is nu 19. Bijstellen: de voorraad gaat 3 omlaag. De systemen bieden niet allemaal beide:
| Systeem | Zetten | Bijstellen |
|---|---|---|
| Shopify | inventorySetQuantities |
inventoryAdjustQuantities met een delta |
| Picqer | amount |
change, positief of negatief |
| WooCommerce REST API | stock_quantity |
niet gedocumenteerd |
Bij zetten is het risico de verkoop tussen lezen en schrijven. De koppeling leest 22 uit het ERP, de webshop verkoopt intussen 3, en de koppeling zet 22. De webshop biedt dan 3 stuks aan die er niet zijn, tot de volgende ronde. Shopify heeft daar changeFromQuantity voor: de schrijfactie gaat alleen door als de stand nog is wat de koppeling verwacht.
Bij bijstellen is het risico de herhaling. Een aanroep change: -3 die na een time-out opnieuw gaat, haalt 6 stuks af. Bij Picqer is dat het veld change, met 2867 als intern product-ID en 1 als magazijn:
POST /api/v1/products/2867/stock/1 HTTP/1.1
Host: bakkerinstallatie.picqer.com
Content-Type: application/json
{ "idlocation": 5, "change": -3, "reason": "Webshoporder 10482" }
Shopify vraagt vanaf API-versie 2026-04 bij beide mutaties een verplichte idempotency key, zodat een herhaalde aanroep één keer telt. Waar het systeem dat niet heeft, legt de koppeling zelf vast welke wijzigingen al zijn doorgegeven. Hoe dat bij orders en debiteuren werkt, staat in dubbele klanten en debiteuren.
Meerdere kanalen en locaties
Elk kanaal krijgt een eigen getal, uit de locaties die voor dat kanaal leveren en met een eigen buffer. Voor artikel 10482 met 46 stuks in het magazijn en 8 in de winkel:
| Kanaal | Locaties | Buffer | Naar het kanaal |
|---|---|---|---|
| Webshop, ook afhalen | magazijn + winkel: 54 | 2 | 52 |
| Marktplaats | magazijn: 46 | 4 | 42 |
| B2B-portaal | magazijn: 46 | 0 | 46 |
Shopify kent 10 locaties op Basic, Grow en Advanced en 200 op Plus, elk met een eigen voorraad. Welke locatie voor welk kanaal levert, staat in geen enkel systeem als veld; het is een regel in de koppeling. De uitwerking staat bij voorraad uit meerdere magazijnen, en de keuze van de buffer per kanaal bij veiligheidsvoorraad en buffers.
Wat betekent dit voor je koppeling?
Wij bouwen de voorraadstroom met deze drie keuzes per kanaal vastgelegd: welk veld uit welke locaties, webhook of ronde met een controleronde ernaast, en zetten met een voorwaarde of bijstellen met een sleutel tegen herhaling. Voor de eerste live ronde laat een dry run per artikel zien welk getal naar welk kanaal gaat. Daarna toont het dashboard per ronde welke artikelen zijn gewijzigd, van welk getal naar welk getal.
De volledige voorraadstroom, met leverdatums en leveranciersvoorraad, staat bij voorraad en beschikbaarheid. Noem je systemen, je kanalen en je aantal artikelen, dan rekenen we uit hoe vaak een ronde kan lopen en welke buffer daarbij hoort.
Veelgestelde vragen
Hoe vaak moet je voorraad syncen?
Zo vaak dat de verkoop binnen één ronde kleiner is dan je buffer. Een artikel dat 8 stuks per uur verkoopt, verkoopt er in een ronde van 15 minuten gemiddeld 2. Waar de bron een webhook heeft, gaat een wijziging binnen seconden door en vangt een controleronde elk uur op wat er gemist is.
Kan ik voorraad syncen tussen twee webshops?
Ja, als één systeem de voorraad bijhoudt en beide shops daarvan lezen. Twee shops die elkaars teller bijwerken, overschrijven elkaar: een verkoop in shop A wordt in shop B gezet, en de volgende ronde zet shop B's oude stand weer terug in A. De koppeling houdt daarom één telling bij, in het ERP, WMS of de koppeling zelf, en schrijft die naar beide shops.
Wat is het verschil tussen voorraad zetten en bijstellen?
Zetten schrijft een absoluut getal: de voorraad is nu 19. Bijstellen schrijft een verschil: min 3. Zetten overschrijft een verkoop die tussen lezen en schrijven gebeurt, tenzij de schrijfactie voorwaardelijk is. Bijstellen telt dubbel als dezelfde aanroep na een time-out opnieuw gaat, tenzij er een idempotency key meegaat.
Waarom staat mijn voorraad na de sync weer op het oude getal?
Meestal omdat de koppeling de voorraad uit het ERP leest voordat de webshoporder daar is aangekomen. Het ERP meldt dan de stand van voor de order en de koppeling zet die terug. De oplossing is eerst orders, dan voorraad, of de orders die nog onderweg zijn van het antwoord aftrekken.
Synct een koppeling ook voorraad naar bol?
Ja, als bol een van de kanalen is. De koppeling schrijft dan per kanaal een eigen getal, met een eigen buffer en alleen uit de locaties die voor dat kanaal leveren. Bij verzending door bol zelf (LVB) ligt de voorraad in het magazijn van bol en is bol de bron voor dat deel.
Vertel wat je nodig hebt
Vertel welke systemen je gebruikt en wat je wilt verbeteren. Je krijgt binnen één werkdag een persoonlijk antwoord. We helpen je de werkzaamheden helder te krijgen en spreken de prijs en planning af voordat je iets toezegt.
- Je weet de prijs en de doorlooptijd voordat je iets toezegt
- Wij zoeken uit welke koppeling het werk uit handen neemt
- Wij verzorgen de bouw, hosting, bewaking en het onderhoud
- Je team krijgt minder overtypwerk en minder uitzoekwerk