Webhooks de stock y almacén
QrX puede avisar a su propio sistema cuando cambia el stock, cuando un artículo baja y cuando se ha preparado un pedido.
También puede avisar a su sistema sobre documentos del almacén: recepciones, pedidos de compra, recuentos, contenedores, tareas de equipo y más eventos de listas de preparación y pedidos. Vea "Eventos de documentos del almacén" más abajo.
Este artículo es para desarrolladores. Trata los eventos stock/adjusted, stock/low y fulfilment/picked. Para firmas, reintentos y registros de entrega consulte "Webhooks y claves de API en PortalX" y "Guía rápida para desarrolladores: API pública y webhooks de QrX".
Suscribirse a los eventos
Vaya a Settings > Advanced > Webhooks y abra o cree un webhook.
En la lista de eventos, abra el grupo Stock y marque
stock/adjustedystock/low.Abra el grupo Preparación y marque
fulfilment/picked.El payload de ejemplo de cada evento muestra un ejemplo completo. Use Customize payload para elegir los campos que se envían.
Para los documentos del almacén, abra los grupos Recepciones, Pedidos de compra, Recuentos, Contenedores, Tareas de equipo y Traslados y marque los eventos que necesite. Los eventos adicionales de listas de preparación y pedidos están en el grupo Preparación.
Guarde el webhook.
Mediante la API se añaden los mismos nombres de evento a eventTypes en POST /api/v1/webhooks. Los eventos de stock necesitan el stock de almacén de QrX en su cuenta, o stock que un socio de fulfillment guarda para usted.
stock/adjusted
Se envía cuando cambia el stock de un artículo en un almacén: una recepción, una preparación, un envío, una devolución, un recuento, un movimiento o una corrección. Recibe un evento por artículo de stock, almacén y operación, nunca uno por escaneo. Un cambio se anuncia aproximadamente un minuto después de registrarse.
{
"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 clave para detectar duplicados. Trátela como un texto opaco; no la analice.sequence: un número que siempre aumenta por artículo y almacén. Es igual alastSequencedeGET /api/v1/stock/levelsjusto después del movimiento.movementId,occurredAt: el movimiento de stock más reciente del evento y su hora (UTC).ownerCustomerId: el comercio para el que se guarda el stock; null para su propio stock.partnerCustomerId: null, salvo en la copia del propietario que se describe más abajo.fromLocationCode,toLocationCode: la ubicación de la que salieron las unidades y a la que entraron. Null significa fuera del stock (proveedor, cliente, corrección) o varias ubicaciones en un mismo evento.reason: por ejemploreceived,putaway,moved,adjusted,shipped,returned,scrapped,blocked,unblocked. Trate un valor que no conozca como un movimiento genérico.documentType,documentId,movementCount: el documento de stock detrás del cambio y cuántos movimientos suma el evento.quantity: unidades movidas.delta: cambio del stock físico en este almacén; 0 en un movimiento, una preparación o una ubicación dentro del almacén.onHand,sellable,available: el nivel del artículo en este almacén justo después del movimiento.
stock/low
Se envía una vez cada vez que un artículo baja hasta su nivel de alerta de stock bajo o por debajo, en el mismo momento que la notificación de la campana. No se repite mientras el artículo siga bajo. Consulte "Alertas de stock bajo" para configurar una alerta.
{
"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: la alerta.crossing: cuenta las alertas de esta regla (1, 2, 3, etcétera).warehouseId,warehouseCode: null cuando la alerta cuenta todos los almacenes juntos.threshold: el nivel de alerta.available: las unidades disponibles cuando saltó la alerta.
fulfilment/picked
Se envía una vez por pedido cuando termina la preparación en el móvil: en cuanto el preparador completa la lista de preparación en la app de QrX, cada pedido de esa lista recibe un evento. Una lista de preparación en papel, o una que solo se trabaja en pantalla, no lo envía: para esos pedidos, el primer evento es 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: el pedido, como enfulfilment/packed.picklistId: la lista de preparación. Null cuando un socio de fulfillment preparó el pedido por usted.pickedAt: cuándo se completó la lista de preparación.hasShorts: true cuando al menos una línea de este pedido se preparó con faltante.pickedByUserId: el preparador. Este campo está desactivado por defecto; actívelo con Customize payload. Null cuando preparó un socio de fulfillment.sessionId: siempre null en este evento.
Eventos de documentos del almacén
Cada evento de abajo tiene un eventId (opaco, elimine duplicados con él) y occurredAt. El payload de ejemplo del editor muestra todos los campos. Ningún evento contiene precios ni costes.
Recepciones:
receipt/created,receipt/line_received(un evento por recepción registrada, con las líneas recibidas) yreceipt/completed. Los campos incluyenreceiptId,receiptNumber,state,warehouseCode,purchaseOrderId,reference,supplierNameytotals.Pedidos de compra:
purchase_order/created,purchase_order/sent,purchase_order/received(también cuando se liquida un pedido de dropship) ypurchase_order/closed(conreason). Los campos incluyenpurchaseOrderId,purchaseOrderNumber,state,supplierName,expectedOny las cantidades entotals.Recuentos:
count/completed(el recuento se ha enviado) ycount/approved, concountId,kind,stateytotalscomo líneas contadas y líneas con diferencia.Contenedores:
container/created,container/moved(con la ubicación anterior) ycontainer/emptied(con la ubicación de destino, las líneas y la cantidad).Tareas de equipo:
task/createdytask/completed, contaskId,title,status,dueAty el objeto al que se refiere la tarea.Preparación:
picklist/assigned(una lista de preparación se asignó a un preparador),picklist/cancelled,picklist/batch_created(un lote creó varias listas de preparación; incluye sus ids) yfulfilment/snoozed(un pedido se pospuso o se quitó su aplazamiento;snoozedindica cuál).Traslados:
transfer/sent,transfer/received(un evento por recepción en el destino, condocumentIdy laslinesrecibidas),transfer/completedytransfer/cancelled. Los campos incluyentransferId,transferNumber,state, el almacén de origen y de destino,reference,expectedOn,sentAt,completedAt,shipping(transportista, número y enlace de seguimiento, bultos, peso) y las cantidades entotals. No pertenecen a ningún canal de venta.Los eventos de recepciones ahora llevan
supplierIdcuando la recepción está vinculada a un proveedor. Los eventos de pedidos de compra añadenreference,supplierReference,supplierConfirmedAtypartialDeliveryAllowed, todavía sin precios.
Detectar duplicados y mantener el orden
Cada evento se entrega al menos una vez, así que el mismo evento puede llegar dos veces. Guarde los valores de
eventIdque ya procesó y omita el que ya ha visto.Los eventos pueden llegar desordenados. Para
stock/adjusted, guarde la últimasequencepor artículo de stock y almacén e ignore un evento con un número menor.Para empezar, o para recuperarse después de una caída de su endpoint, lea los niveles con
GET /api/v1/stock/levelsy comparelastSequence. Tras una interrupción larga, los cambios de stock de más de 6 horas ya no se anuncian comostock/adjusted.
Reglas de entrega
Un evento de stock no pertenece a ningún canal de venta.
stock/adjustedystock/lowvan a cada webhook activo de su cuenta que haya marcado el evento, también a un webhook configurado para un solo canal.fulfilment/pickedsigue el canal de venta del pedido, igual quefulfilment/packed, y necesita la estación de embalaje en su cuenta.Una gran oleada de eventos de stock, por ejemplo tras una importación o un inventario completo, se reparte en los minutos siguientes. Nunca retrasa sus eventos de pedidos y de fulfilment.
Un webhook en pausa omite los eventos; no se ponen en cola.
Los eventos de recepciones, pedidos de compra, recuentos, contenedores, tareas de equipo,
fulfilment/snoozedy los eventos de entradas tampoco pertenecen a ningún canal de venta. Cada webhook activo de su cuenta que los haya marcado los recibe, también un webhook configurado para un solo canal, y también cuando la estación de embalaje está desactivada. El destinatario es la cuenta a la que pertenece el documento del almacén.Los eventos de listas de preparación siguen el canal de venta de la lista, como
picklist/created.Un webhook guardado hace menos de 15 segundos puede perder un evento de ese momento.
Cuando un socio de fulfillment guarda su stock
Como propietario del stock recibe su propia copia de los eventos de stock de sus propios artículos, mientras el acceso del socio esté activo. Los nombres de los campos son los mismos, con estas diferencias:
partnerCustomerIdes el almacén del socio yownerCustomerIdes su propia cuenta.fromLocationCode,toLocationCode,documentTypeydocumentIdson siempre null. Nunca recibe ubicaciones.El
eventIdes distinto del que recibe su socio.stock/lowsolo procede de sus propias alertas de stock bajo, nunca de las alertas de su socio.
Cuándo contactar con nuestro equipo de soporte
Contacte con el soporte de QrX cuando los eventos de stock no lleguen aunque el evento esté marcado, el webhook esté activo y su endpoint devuelva 2xx. Indique el nombre del webhook, el SKU, el almacén y la hora del cambio de stock.
