Voorraad- en magazijnwebhooks
QrX kan uw eigen systeem melden wanneer voorraad wijzigt, wanneer een artikel laag wordt en wanneer een order is gepickt.
Het kan uw systeem ook informeren over magazijndocumenten: ontvangsten, inkooporders, tellingen, containers, teamtaken en meer events van picklijsten en orders. Zie "Events van magazijndocumenten" hieronder.
Dit artikel is voor ontwikkelaars. Het behandelt de events stock/adjusted, stock/low en fulfilment/picked. Voor handtekeningen, nieuwe pogingen en het afleverlogboek zie "Webhooks en API-sleutels in PortalX" en "Snelstart voor ontwikkelaars: QrX Public API en webhooks".
Abonneren op de events
Ga naar Settings > Advanced > Webhooks en open of maak een webhook.
Open in de lijst met events de groep Voorraad en vink
stock/adjustedenstock/lowaan.Open de groep Fulfilment en vink
fulfilment/pickedaan.De voorbeeldpayload van elk event toont een volledig voorbeeld. Kies met Customize payload welke velden worden verstuurd.
Open voor magazijndocumenten de groepen Ontvangsten, Inkooporders, Tellingen, Containers, Teamtaken en Overboekingen en vink de events aan die u nodig hebt. De extra events van picklijsten en orders staan in de groep Fulfilment.
Sla de webhook op.
Via de API voegt u dezelfde eventnamen toe aan eventTypes in POST /api/v1/webhooks. Voor de voorraadevents hebt u QrX-magazijnvoorraad op uw account nodig, of voorraad die een fulfilmentpartner voor u bewaart.
stock/adjusted
Verstuurd wanneer de voorraad van een artikel in een magazijn wijzigt: een ontvangst, een pick, een verzending, een retour, een telling, een verplaatsing of een correctie. U krijgt één event per voorraadartikel, magazijn en handeling, nooit één per scan. Een wijziging wordt ongeveer een minuut na het boeken gemeld.
{
"eventId": "stock/adjusted:1:98231",
"occurredAt": "2026-10-11T09:12:03Z",
"movementId": 98231,
"sequence": 98231,
"stockItemId": 345, "sku": "TSHIRT-M", "ean": "8712345678906",
"ownerCustomerId": null,
"partnerCustomerId": null,
"warehouseId": 1, "warehouseCode": "MAIN",
"fromLocationCode": "A-01-02", "toLocationCode": null,
"reason": "adjusted",
"documentType": "adjust", "documentId": 5521,
"movementCount": 1,
"quantity": 3,
"delta": -3,
"onHand": 42, "sellable": 40, "available": 35
}
eventId: de sleutel om dubbele events te herkennen. Behandel het als een ondoorzichtige tekst; ontleed het niet.sequence: een getal dat per artikel en magazijn altijd oploopt. Het is gelijk aanlastSequencevanGET /api/v1/stock/levelsdirect na de beweging.movementId,occurredAt: de nieuwste voorraadbeweging in het event en het tijdstip (UTC).ownerCustomerId: de merchant voor wie de voorraad wordt bewaard; null voor uw eigen voorraad.partnerCustomerId: null, behalve in de kopie voor de eigenaar die hieronder staat.fromLocationCode,toLocationCode: de locatie die de stuks verlieten en waar ze binnenkwamen. Null betekent buiten de voorraad (leverancier, klant, correctie) of meerdere locaties in één event.reason: bijvoorbeeldreceived,putaway,moved,adjusted,shipped,returned,scrapped,blocked,unblocked. Behandel een waarde die u niet kent als een algemene beweging.documentType,documentId,movementCount: het voorraaddocument achter de wijziging en hoeveel bewegingen het event optelt.quantity: verplaatste stuks.delta: wijziging van de aanwezige voorraad in dit magazijn; 0 bij een verplaatsing, een pick of een wegzetting binnen het magazijn.onHand,sellable,available: de stand van het artikel in dit magazijn direct na de beweging.
stock/low
Eén keer verstuurd telkens wanneer een artikel daalt tot op of onder zijn waarschuwingsniveau voor lage voorraad, op hetzelfde moment als de belmelding. Het wordt niet herhaald zolang het artikel laag blijft. Zie "Waarschuwingen bij lage voorraad" voor het instellen van een waarschuwing.
{
"eventId": "stock/low:12:4",
"occurredAt": "2026-10-11T09:13:00Z",
"ruleId": 12, "crossing": 4,
"stockItemId": 345, "sku": "TSHIRT-M", "ean": "8712345678906", "name": "T-shirt M",
"ownerCustomerId": null,
"partnerCustomerId": null,
"warehouseId": null, "warehouseCode": null,
"threshold": 10, "available": 7
}
ruleId: de waarschuwing.crossing: telt de waarschuwingen van deze regel (1, 2, 3 enzovoort).warehouseId,warehouseCode: null wanneer de waarschuwing alle magazijnen samen telt.threshold: het waarschuwingsniveau.available: het beschikbare aantal toen de waarschuwing afging.
fulfilment/picked
Eén keer per order verstuurd wanneer het picken op de telefoon is afgerond: zodra de picker de picklijst in de QrX-app afrondt, krijgt elke order op die picklijst één event. Een papieren picklijst, of een picklijst die alleen op het scherm wordt afgehandeld, verstuurt het niet: voor die orders is fulfilment/packed het eerste event.
{
"eventId": "fulfilment/picked:881:120045",
"occurredAt": "2026-10-13T10:02:11Z",
"sessionId": null,
"transactionId": 120045,
"transactionKey": "TR-8F3K2M",
"orderId": "1001",
"picklistId": 881,
"pickedAt": "2026-10-13T10:02:11Z",
"pickedByUserId": "b6c0...",
"hasShorts": false
}
transactionId,transactionKey,orderId: de order, zoals infulfilment/packed.picklistId: de picklijst. Null wanneer een fulfilmentpartner de order voor u pickte.pickedAt: wanneer de picklijst is afgerond.hasShorts: true wanneer minstens één regel van deze order te weinig is gepickt.pickedByUserId: de picker. Dit veld staat standaard uit; zet het aan met Customize payload. Null wanneer een fulfilmentpartner pickte.sessionId: altijd null bij dit event.
Events van magazijndocumenten
Elk event hieronder heeft een eventId (ondoorzichtig, ontdubbel erop) en occurredAt. De voorbeeldpayload in de editor toont elk veld. Geen enkel event bevat prijzen of kosten.
Ontvangsten:
receipt/created,receipt/line_received(één event per geboekte ontvangst, met de ontvangen regels) enreceipt/completed. Velden zijn onder meerreceiptId,receiptNumber,state,warehouseCode,purchaseOrderId,reference,supplierNameentotals.Inkooporders:
purchase_order/created,purchase_order/sent,purchase_order/received(ook wanneer een dropshiporder wordt afgerekend) enpurchase_order/closed(metreason). Velden zijn onder meerpurchaseOrderId,purchaseOrderNumber,state,supplierName,expectedOnen aantallen intotals.Tellingen:
count/completed(de telling is ingediend) encount/approved, metcountId,kind,stateentotalszoals getelde regels en regels met een verschil.Containers:
container/created,container/moved(met de vorige locatie) encontainer/emptied(met de doellocatie, regels en aantal).Teamtaken:
task/createdentask/completed, mettaskId,title,status,dueAten het object waar de taak over gaat.Fulfilment:
picklist/assigned(een picklijst is aan een picker gegeven),picklist/cancelled,picklist/batch_created(een batchrun heeft meerdere picklijsten gemaakt; de ids staan erin) enfulfilment/snoozed(een order is gesnoozed of de snooze is opgeheven;snoozedvertelt welke).Overboekingen:
transfer/sent,transfer/received(één gebeurtenis per ontvangst op de bestemming, metdocumentIden de ontvangenlines),transfer/completedentransfer/cancelled. De velden zijn onder meertransferId,transferNumber,state, het van- en naar-magazijn,reference,expectedOn,sentAt,completedAt,shipping(vervoerder, trackingnummer en link, pakketten, gewicht) en de aantallen intotals. Ze horen bij geen enkel verkoopkanaal.Ontvangstgebeurtenissen bevatten nu
supplierIdals de ontvangst aan een leverancier is gekoppeld. Gebeurtenissen van inkooporders voegenreference,supplierReference,supplierConfirmedAtenpartialDeliveryAllowedtoe, nog steeds zonder prijzen.
Dubbele events herkennen en de volgorde bewaren
Elk event wordt minstens één keer afgeleverd, dus hetzelfde event kan twee keer aankomen. Bewaar de
eventId-waarden die u hebt verwerkt en sla een bekende over.Events kunnen in een andere volgorde aankomen. Bewaar voor
stock/adjustedde laatstesequenceper voorraadartikel en magazijn en negeer een event met een lager getal.Om te starten, of om te herstellen nadat uw endpoint uit de lucht was, leest u de standen met
GET /api/v1/stock/levelsen vergelijkt ulastSequence. Na een lange onderbreking worden voorraadwijzigingen ouder dan 6 uur niet meer alsstock/adjustedgemeld.
Afleverregels
Een voorraadevent hoort bij geen verkoopkanaal.
stock/adjustedenstock/lowgaan naar elke actieve webhook van uw account die het event heeft aangevinkt, ook naar een webhook die op één kanaal is ingesteld.fulfilment/pickedvolgt het verkoopkanaal van de order, net alsfulfilment/packed, en vereist de paktafel op uw account.Een grote stroom voorraadevents, bijvoorbeeld na een import of een volledige telling, wordt over de volgende minuten verspreid. Uw order- en fulfilmentevents lopen daardoor nooit vertraging op.
Een gepauzeerde webhook slaat events over; ze worden niet bewaard.
De events van ontvangsten, inkooporders, tellingen, containers, teamtaken,
fulfilment/snoozeden de inbound-events horen ook bij geen enkel verkoopkanaal. Elke actieve webhook van uw account die ze heeft aangevinkt ontvangt ze, ook een webhook die op één kanaal is ingesteld, en ook als de paktafel uit staat. De ontvanger is het account van wie het magazijndocument is.De picklijst-events volgen het verkoopkanaal van de picklijst, net als
picklist/created.Een webhook die minder dan 15 seconden geleden is opgeslagen, kan een event van dat moment missen.
Wanneer een fulfilmentpartner uw voorraad bewaart
Als eigenaar van de voorraad krijgt u een eigen kopie van de voorraadevents voor uw eigen artikelen, zolang de toegang van de partner actief is. De veldnamen zijn gelijk, met deze verschillen:
partnerCustomerIdis het partnermagazijn enownerCustomerIdis uw eigen account.fromLocationCode,toLocationCode,documentTypeendocumentIdzijn altijd null. U ontvangt nooit locaties.De
eventIdis anders dan die uw partner ontvangt.stock/lowkomt alleen van uw eigen waarschuwingen bij lage voorraad, nooit van de waarschuwingen van uw partner.
Wanneer neemt u contact op met ons supportteam
Neem contact op met QrX support wanneer voorraadevents niet aankomen terwijl het event is aangevinkt, de webhook actief is en uw endpoint 2xx teruggeeft. Vermeld de naam van de webhook, de SKU, het magazijn en het tijdstip van de voorraadwijziging.
