Passer au contenu principal

Webhooks de stock et d'entrepôt

Pour les développeurs : stock/adjusted, stock/low, fulfilment/picked et les événements des documents d'entrepôt (réceptions, commandes fournisseur, inventaires, transferts), les doublons, l'ordre et les règles de livraison.

H
Écrit par Hayko

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

  1. Allez dans Settings > Advanced > Webhooks et ouvrez ou créez un webhook.

  2. Dans la liste des événements, ouvrez le groupe Stock et cochez stock/adjusted et stock/low.

  3. Ouvrez le groupe Traitement et cochez fulfilment/picked.

  4. L'exemple de payload de chaque événement montre un exemple complet. Utilisez Customize payload pour choisir les champs envoyés.

  5. 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.

  6. 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 à lastSequence de GET /api/v1/stock/levels juste 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 exemple received, 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 dans fulfilment/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) et receipt/completed. Les champs comprennent receiptId, receiptNumber, state, warehouseCode, purchaseOrderId, reference, supplierName et totals.

  • Commandes fournisseur : purchase_order/created, purchase_order/sent, purchase_order/received (aussi quand une commande en dropship est soldée) et purchase_order/closed (avec reason). Les champs comprennent purchaseOrderId, purchaseOrderNumber, state, supplierName, expectedOn et les quantités dans totals.

  • Inventaires : count/completed (l'inventaire est soumis) et count/approved, avec countId, kind, state et totals comme les lignes comptées et les lignes avec un écart.

  • Conteneurs : container/created, container/moved (avec l'emplacement précédent) et container/emptied (avec l'emplacement cible, les lignes et la quantité).

  • Tâches d'équipe : task/created et task/completed, avec taskId, title, status, dueAt et 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) et fulfilment/snoozed (une commande a été mise en pause ou sa pause a été levée ; snoozed indique lequel).

  • Transferts : transfer/sent, transfer/received (un événement par réception à destination, avec documentId et les lines reçues), transfer/completed et transfer/cancelled. Les champs comprennent transferId, 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 les totals de quantités. Ils n'appartiennent à aucun canal de vente.

  • Les événements de réception contiennent désormais supplierId quand la réception est liée à un fournisseur. Les événements de commande fournisseur ajoutent reference, supplierReference, supplierConfirmedAt et partialDeliveryAllowed, 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 eventId traité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ère sequence par 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/levels et comparez lastSequence. Après une longue interruption, les changements de stock de plus de 6 heures ne sont plus annoncés comme stock/adjusted.

Règles de livraison

  • Un événement de stock n'appartient à aucun canal de vente. stock/adjusted et stock/low vont à chaque webhook actif de votre compte qui a coché l'événement, y compris un webhook réglé sur un seul canal.

  • fulfilment/picked suit le canal de vente de la commande, comme fulfilment/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/snoozed et 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 :

  • partnerCustomerId est l'entrepôt partenaire et ownerCustomerId est votre propre compte.

  • fromLocationCode, toLocationCode, documentType et documentId sont toujours null. Vous ne recevez jamais d'emplacements.

  • L'eventId diffère de celui que reçoit votre partenaire.

  • stock/low vient 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.

Avez-vous trouvé la réponse à votre question ?