Webhooks de stock et d'entrepôt
QrX peut prévenir votre propre système lorsque le stock change, lorsqu'un article devient faible et lorsqu'une commande est prélevée. QrX peut aussi informer votre système des documents d'entrepôt : réceptions, commandes fournisseur, inventaires, conteneurs, tâches d'équipe et d'autres événements de listes de prélèvement et de commandes. Voir "Événements des documents d'entrepôt" ci-dessous. Cet article s'adresse aux développeurs. Il couvre les événements stock/adjusted, stock/low et fulfilment/picked. Pour les signatures, les nouvelles tentatives et les journaux de livraison, voir "Webhooks et clés API dans PortalX" et "Démarrage rapide pour les développeurs : API publique QrX et webhooks".
S'abonner aux événements
Allez dans Settings > Advanced > Webhooks et ouvrez ou créez un webhook.
Dans la liste des événements, ouvrez le groupe Stock et cochez
stock/adjustedetstock/low.Ouvrez le groupe Traitement et cochez
fulfilment/picked.L'exemple de payload de chaque événement montre un exemple complet. Utilisez Customize payload pour choisir les champs envoyés.
Pour les documents d'entrepôt, ouvrez les groupes Réceptions, Commandes fournisseur, Inventaires, Conteneurs, Tâches d'équipe et Transferts et cochez les événements dont vous avez besoin. Les événements supplémentaires de listes de prélèvement et de commandes se trouvent dans le groupe Traitement.
Enregistrez le webhook.
Par l'API, vous ajoutez les mêmes noms d'événements à eventTypes dans POST /api/v1/webhooks. Les événements de stock demandent le stock en entrepôt de QrX sur votre compte, ou du stock qu'un partenaire logistique détient pour vous.
stock/adjusted
Envoyé lorsque le stock d'un article change dans un entrepôt : une réception, un prélèvement, une expédition, un retour, un inventaire, un déplacement ou une correction. Vous recevez un événement par article de stock, entrepôt et opération, jamais un par scan. Un changement est annoncé environ une minute après son enregistrement.
{
"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: la clé pour repérer les doublons. Traitez-la comme un texte opaque ; ne l'analysez pas.sequence: un nombre qui augmente toujours par article et par entrepôt. Il est égal àlastSequencedeGET /api/v1/stock/levelsjuste après le mouvement.movementId,occurredAt: le mouvement de stock le plus récent de l'événement et son heure (UTC).ownerCustomerId: le marchand pour qui le stock est détenu ; null pour votre propre stock.partnerCustomerId: null, sauf dans la copie du propriétaire décrite plus bas.fromLocationCode,toLocationCode: l'emplacement que les unités ont quitté et celui où elles sont entrées. Null signifie hors stock (fournisseur, client, correction) ou plusieurs emplacements dans un même événement.reason: par exemplereceived,putaway,moved,adjusted,shipped,returned,scrapped,blocked,unblocked. Traitez une valeur inconnue comme un mouvement générique.documentType,documentId,movementCount: le document de stock à l'origine du changement et le nombre de mouvements que l'événement additionne.quantity: unités déplacées.delta: variation du stock présent dans cet entrepôt ; 0 pour un déplacement, un prélèvement ou un rangement à l'intérieur de l'entrepôt.onHand,sellable,available: le niveau de l'article dans cet entrepôt juste après le mouvement.
stock/low
Envoyé une fois chaque fois qu'un article descend à son seuil d'alerte de stock faible ou en dessous, au même moment que la notification de la cloche. Il n'est pas répété tant que l'article reste faible. Voir "Alertes de stock faible" pour définir une alerte.
{
"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: l'alerte.crossing: compte les alertes de cette règle (1, 2, 3 et ainsi de suite).warehouseId,warehouseCode: null lorsque l'alerte compte tous les entrepôts ensemble.threshold: le seuil d'alerte.available: les unités disponibles au déclenchement de l'alerte.
fulfilment/picked
Envoyé une fois par commande lorsque le prélèvement sur téléphone est terminé : dès que le préparateur termine la liste de prélèvement dans l'application QrX, chaque commande de cette liste reçoit un événement. Une liste de prélèvement sur papier, ou traitée seulement à l'écran, ne l'envoie pas : pour ces commandes, le premier événement est fulfilment/packed.
{
"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: la commande, comme dansfulfilment/packed.picklistId: la liste de prélèvement. Null lorsqu'un partenaire logistique a prélevé la commande pour vous.pickedAt: quand la liste de prélèvement a été terminée.hasShorts: true lorsqu'au moins une ligne de cette commande a été prélevée en quantité insuffisante.pickedByUserId: le préparateur. Ce champ est désactivé par défaut ; activez-le avec Customize payload. Null lorsqu'un partenaire logistique a prélevé.sessionId: toujours null pour cet événement.
Événements des documents d'entrepôt
Chaque événement ci-dessous a un eventId (opaque, dédupliquez dessus) et occurredAt. L'exemple de payload dans l'éditeur montre chaque champ. Aucun événement ne contient de prix ni de coûts.
Réceptions :
receipt/created,receipt/line_received(un événement par réception enregistrée, avec les lignes reçues) etreceipt/completed. Les champs comprennentreceiptId,receiptNumber,state,warehouseCode,purchaseOrderId,reference,supplierNameettotals.Commandes fournisseur :
purchase_order/created,purchase_order/sent,purchase_order/received(aussi quand une commande en dropship est soldée) etpurchase_order/closed(avecreason). Les champs comprennentpurchaseOrderId,purchaseOrderNumber,state,supplierName,expectedOnet les quantités danstotals.Inventaires :
count/completed(l'inventaire est soumis) etcount/approved, aveccountId,kind,stateettotalscomme les lignes comptées et les lignes avec un écart.Conteneurs :
container/created,container/moved(avec l'emplacement précédent) etcontainer/emptied(avec l'emplacement cible, les lignes et la quantité).Tâches d'équipe :
task/createdettask/completed, avectaskId,title,status,dueAtet l'objet concerné par la tâche.Traitement :
picklist/assigned(une liste de prélèvement a été attribuée à un préparateur),picklist/cancelled,picklist/batch_created(un lot a créé plusieurs listes de prélèvement ; leurs identifiants y figurent) etfulfilment/snoozed(une commande a été mise en pause ou sa pause a été levée ;snoozedindique lequel).Transferts :
transfer/sent,transfer/received(un événement par réception à destination, avecdocumentIdet leslinesreçues),transfer/completedettransfer/cancelled. Les champs comprennenttransferId,transferNumber,state, l'entrepôt de départ et d'arrivée,reference,expectedOn,sentAt,completedAt,shipping(transporteur, numéro et lien de suivi, colis, poids) et lestotalsde quantités. Ils n'appartiennent à aucun canal de vente.Les événements de réception contiennent désormais
supplierIdquand la réception est liée à un fournisseur. Les événements de commande fournisseur ajoutentreference,supplierReference,supplierConfirmedAtetpartialDeliveryAllowed, toujours sans prix.
Repérer les doublons et garder l'ordre
Chaque événement est livré au moins une fois, le même événement peut donc arriver deux fois. Conservez les valeurs
eventIdtraitées et ignorez celle que vous avez déjà vue.Les événements peuvent arriver dans le désordre. Pour
stock/adjusted, conservez la dernièresequencepar article de stock et par entrepôt et ignorez un événement dont le nombre est inférieur.Pour démarrer, ou pour reprendre après une panne de votre endpoint, lisez les niveaux avec
GET /api/v1/stock/levelset comparezlastSequence. Après une longue interruption, les changements de stock de plus de 6 heures ne sont plus annoncés commestock/adjusted.
Règles de livraison
Un événement de stock n'appartient à aucun canal de vente.
stock/adjustedetstock/lowvont à chaque webhook actif de votre compte qui a coché l'événement, y compris un webhook réglé sur un seul canal.fulfilment/pickedsuit le canal de vente de la commande, commefulfilment/packed, et demande le poste d'emballage sur votre compte.Une grande vague d'événements de stock, par exemple après un import ou un inventaire complet, est répartie sur les minutes suivantes. Elle ne retarde jamais vos événements de commande et de fulfilment.
Un webhook en pause ignore les événements ; ils ne sont pas mis en file d'attente.
Les événements des réceptions, commandes fournisseur, inventaires, conteneurs, tâches d'équipe,
fulfilment/snoozedet les événements d'entrée n'appartiennent pas non plus à un canal de vente. Chaque webhook actif de votre compte qui les a cochés les reçoit, y compris un webhook réglé sur un seul canal, et aussi quand le poste d'emballage est désactivé. Le destinataire est le compte à qui appartient le document d'entrepôt.Les événements de listes de prélèvement suivent le canal de vente de la liste, comme
picklist/created.Un webhook enregistré il y a moins de 15 secondes peut manquer un événement de ce moment.
Lorsqu'un partenaire logistique détient votre stock
En tant que propriétaire du stock, vous recevez votre propre copie des événements de stock pour vos propres articles, tant que l'accès du partenaire est actif. Les noms de champs sont les mêmes, avec ces différences :
partnerCustomerIdest l'entrepôt partenaire etownerCustomerIdest votre propre compte.fromLocationCode,toLocationCode,documentTypeetdocumentIdsont toujours null. Vous ne recevez jamais d'emplacements.L'
eventIddiffère de celui que reçoit votre partenaire.stock/lowvient uniquement de vos propres alertes de stock faible, jamais des alertes de votre partenaire.
Quand contacter notre équipe support
Contactez le support QrX lorsque les événements de stock n'arrivent pas alors que l'événement est coché, que le webhook est actif et que votre endpoint renvoie 2xx. Indiquez le nom du webhook, le SKU, l'entrepôt et l'heure du changement de stock.
