Ir al contenido principal

Webhooks de stock y almacén

Para desarrolladores: stock/adjusted, stock/low, fulfilment/picked y eventos de documentos del almacén (recepciones, pedidos de compra, recuentos, contenedores, tareas, traslados), duplicados, orden y reglas de entrega.

H
Escrito por Hayko

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

  1. Vaya a Settings > Advanced > Webhooks y abra o cree un webhook.

  2. En la lista de eventos, abra el grupo Stock y marque stock/adjusted y stock/low.

  3. Abra el grupo Preparación y marque fulfilment/picked.

  4. El payload de ejemplo de cada evento muestra un ejemplo completo. Use Customize payload para elegir los campos que se envían.

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

  6. 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 a lastSequence de GET /api/v1/stock/levels justo 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 ejemplo received, 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 en fulfilment/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) y receipt/completed. Los campos incluyen receiptId, receiptNumber, state, warehouseCode, purchaseOrderId, reference, supplierName y totals.

  • Pedidos de compra: purchase_order/created, purchase_order/sent, purchase_order/received (también cuando se liquida un pedido de dropship) y purchase_order/closed (con reason). Los campos incluyen purchaseOrderId, purchaseOrderNumber, state, supplierName, expectedOn y las cantidades en totals.

  • Recuentos: count/completed (el recuento se ha enviado) y count/approved, con countId, kind, state y totals como líneas contadas y líneas con diferencia.

  • Contenedores: container/created, container/moved (con la ubicación anterior) y container/emptied (con la ubicación de destino, las líneas y la cantidad).

  • Tareas de equipo: task/created y task/completed, con taskId, title, status, dueAt y 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) y fulfilment/snoozed (un pedido se pospuso o se quitó su aplazamiento; snoozed indica cuál).

  • Traslados: transfer/sent, transfer/received (un evento por recepción en el destino, con documentId y las lines recibidas), transfer/completed y transfer/cancelled. Los campos incluyen transferId, 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 en totals. No pertenecen a ningún canal de venta.

  • Los eventos de recepciones ahora llevan supplierId cuando la recepción está vinculada a un proveedor. Los eventos de pedidos de compra añaden reference, supplierReference, supplierConfirmedAt y partialDeliveryAllowed, 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 eventId que ya procesó y omita el que ya ha visto.

  • Los eventos pueden llegar desordenados. Para stock/adjusted, guarde la última sequence por 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/levels y compare lastSequence. Tras una interrupción larga, los cambios de stock de más de 6 horas ya no se anuncian como stock/adjusted.

Reglas de entrega

  • Un evento de stock no pertenece a ningún canal de venta. stock/adjusted y stock/low van a cada webhook activo de su cuenta que haya marcado el evento, también a un webhook configurado para un solo canal.

  • fulfilment/picked sigue el canal de venta del pedido, igual que fulfilment/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/snoozed y 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:

  • partnerCustomerId es el almacén del socio y ownerCustomerId es su propia cuenta.

  • fromLocationCode, toLocationCode, documentType y documentId son siempre null. Nunca recibe ubicaciones.

  • El eventId es distinto del que recibe su socio.

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

¿Ha quedado contestada tu pregunta?