Suscripción de Webhook para notificar Eventos

La funcionalidad de Webhook permite notificar a los sistemas externos del cliente (ERP, middleware, integradores) cada vez que ocurre un evento en Janis: un pedido listo para facturar, una entrega despachada, un cambio de stock, entre otros. Los Webhooks se configuran desde Webhooks, creando una suscripción nueva.

1. Resumen

Al crear un Webhook se configura:

  • Nombre.
  • El/los evento/s que se quieren notificar. Ver Eventos disponibles.
  • Filtros.
  • URL asociada al endpoint.
  • Los headers, en caso de que el endpoint así lo requiera.

Cada notificación identifica el evento con tres datos: el servicio que lo emite (service), la entidad afectada (entity) y el nombre del evento (eventName). Por ejemplo, la notificación de un pedido "Listo para facturar" tiene la siguiente estructura:

{
  "service": "oms",
  "entity": "order",
  "eventName": "ready-for-invoice",
  "eventDate": "2024-04-03T12:09:00.000Z",
  "metadata": {
    "id": "<YOUR_ORDER_ID>"
  }
}

Una vez que la suscripción fue configurada, se envía un POST (incluyendo los headers configurados) con el siguiente body:

{
  "setup": true
}

Para mayor información, consultar la documentación técnica de webhooks.

2. Eventos disponibles

A continuación se listan los eventos que se pueden notificar, agrupados por el servicio que los emite. Para cada evento se indica la entidad (entity) y el nombre del evento (eventName) tal como llegan en la notificación.

📘

Detalle técnico de cada evento

La estructura completa de cada notificación (campos de metadata, tipos y ejemplos) se encuentra en la sección Webhooks de la documentación técnica de cada servicio, en docs.janis.in. El listado de eventos puede crecer a medida que se incorporan nuevas funcionalidades.

OMS (Pedidos)

Servicio oms, entidad order. Detalle técnico: Webhooks de OMS.

Evento (eventName)Cuándo se disparaMás información
completeLa información del pedido está completa, pero todavía no terminó su distribución.
readyLa información del pedido está completa, terminó su distribución y el pedido está listo para ser procesado. El pedido puede estar en auditoría en este punto: para iniciar el picking, conviene usar ready-for-picking.
grace-period-startedEl pedido entró en su período de gracia, durante el cual todavía se puede modificar o cancelar.
grace-period-endedTerminó el período de gracia del pedido (de forma manual o al cumplirse el tiempo configurado) y el pedido continúa su flujo.
in-new-order-auditEl pedido está en auditoría de pedido nuevo.
new-order-audit-rejectedSe rechazó la auditoría de pedido nuevo.
ready-for-payment-validationEl pedido está listo para la validación de pagos.
validating-payments-errorOcurrió un error al validar los pagos del pedido.
ready-for-pickingEl pedido está listo para iniciar el picking.
pickingComenzó el picking del pedido.
prepicking-items-changedSe modificaron los ítems de prepicking del pedido.
partially-pickedEl pedido se pickeó de forma parcial.
unpickedSe despickearon uno o más ítems del pedido.
missing-items-finalEl pedido terminó el picking con ítems faltantes sin ningún candidato de sustitución asignado.Webhook de faltantes sin candidatos
pending-candidates-confirmationEl pedido tiene sustitutos candidatos pendientes de confirmación por parte del cliente.Sustitutos candidatos
pending-candidates-validationEl pedido tiene sustitutos candidatos pendientes de validación.Candidatos pendientes
candidates-confirmation-deadline-exceededSe superó el plazo para confirmar los sustitutos candidatos del pedido.Sustitutos candidatos
in-picking-auditEl pedido está en auditoría de picking.
picking-audit-rejectedSe rechazó la auditoría de picking del pedido.
picked-labelEl pedido está pickeado y se generaron sus etiquetas.
package-labelSe generaron las etiquetas de los paquetes del pedido.Plantilla de etiqueta de paquete
shipping-scheduled-labelLa entrega del pedido está programada y se generaron sus etiquetas.
ready-for-invoiceEl pedido ya se puede facturar.Cómo integrar facturación
invoicedEl pedido se facturó por completo.
invoice-canceledSe anularon las facturas del pedido.Ver Anulación de factura
ready-internal-distributionEl pedido está listo para la distribución interna.
ready-for-deliveryEl pedido está listo para iniciar la entrega.
critical-thresholdEl pedido alcanzó el umbral crítico de envío. Solo se dispara si el tipo de envío tiene habilitada la opción correspondiente.Semaforización de pedidos
in-deliveryEl pedido fue despachado.
deliveredEl pedido se entregó con éxito al cliente.
not-deliveredFalló la entrega del pedido. El pedido debe reprogramarse o cancelarse.
needs-reschedulingEl pedido necesita ser reprogramado.
delivery-rescheduledSe reprogramó la entrega del pedido.
rescheduledSe reprogramaron ítems del pedido.
store-changedSe cambió la tienda del pedido.
needs-interventionEl pedido necesita ser intervenido.
request-refundSe creó una solicitud de reembolso del pedido.
liquidatedEl pedido fue liquidado.
canceledEl pedido fue cancelado.

Anulación de factura

Al ejecutar la acción Cancelar factura desde el detalle de un pedido (Pedidos → detalle del pedido → Cancelar factura), Janis emite el evento oms:order:invoice-canceled una única vez por cada anulación. La suscripción se crea de forma manual: mientras no exista una suscripción activa apuntando al endpoint, la anulación no se notifica.

{
  "service": "oms",
  "entity": "order",
  "eventName": "invoice-canceled",
  "eventDate": "2026-08-11T19:52:09.819Z",
  "metadata": {
    "id": "<YOUR_ORDER_ID>",
    "commerceId": "<YOUR_COMMERCE_ID>",
    "commerceSequentialId": "<YOUR_COMMERCE_SEQUENTIAL_ID>",
    "orderGroupId": "<YOUR_ORDER_GROUP_ID>",
    "orderGroupCommerceId": "<YOUR_ORDER_GROUP_COMMERCE_ID>",
    "sellerSalesChannelId": "<YOUR_SALES_CHANNEL_ID>",
    "sellerSalesChannelReferenceId": "<YOUR_SALES_CHANNEL_REFERENCE_ID>",
    "sellerSalesChannelName": "<YOUR_SALES_CHANNEL_NAME>",
    "carrierRefId": "<YOUR_CARRIER_REF_ID>",
    "invoiceIds": ["<YOUR_INVOICE_ID>"],
    "invoices": [
      { "id": "<YOUR_INVOICE_ID>", "number": "<YOUR_INVOICE_NUMBER>", "value": 235.67 }
    ]
  }
}
🚧

El campo invoices puede no llegar

Si el pedido conservaba solo los identificadores de sus facturas, la notificación viaja sin el campo invoices. El campo invoiceIds siempre está presente, así que conviene tomarlo como referencia principal al procesar el evento.

Delivery (Rutas y entregas)

Servicio delivery. Detalle técnico: Webhooks de Delivery. Para un caso de uso con operadores logísticos, ver Janis genera la ruta con un shipping.

Entidad (entity)Evento (eventName)Cuándo se dispara
routecreatedSe creó la ruta.
routescheduledSe programó la ruta.
routestartedSe inició la ruta.
routedispatchedSe despachó la ruta.
routefinishedSe finalizó la ruta.
routecancelledSe canceló la ruta.
routeerrorOcurrió un error en la ruta.
shippingcreatedSe creó la entrega.
shippingscheduledSe programó la entrega.
shippingrescheduledCambió la fecha o franja horaria de una entrega ya existente. Se dispara cada vez que cambia la programación.
shippingreadyForPickupLos paquetes de la entrega están listos para ser retirados en el origen. Se dispara una vez por entrega.
shippingpickupAnnouncementLa entrega recibió un aviso de retiro.
shippingstartedSe inició la entrega.
shippingdispatchedSe despachó la entrega.
shippingdeliveredSe completó la entrega.
shippingpartiallyDeliveredLa entrega se completó de forma parcial.
shippingnotDeliveredLa entrega no se pudo completar.
shippingcancelledSe canceló la entrega.

TMS (Rutas)

Servicio tms, entidad route. Detalle técnico: Webhooks de TMS.

Evento (eventName)Cuándo se dispara
scheduledSe programó la ruta.
startedSe inició la ruta.
finishedSe finalizó la ruta.
cancelledSe canceló la ruta.

WMS (Inventario y movimientos)

Servicio wms. Detalle técnico: Webhooks de WMS.

Entidad (entity)Evento (eventName)Cuándo se dispara
stockupdatedSe actualizó el stock de un SKU en un warehouse.
stockoutOfStockEl stock disponible de un SKU en un warehouse llegó a cero o menos.
ordermovementCreatedSe creó un movimiento de un pedido entre warehouses.
ordermovedSe movió un pedido.
ordermovementCanceledSe canceló un movimiento de un pedido.
orderpickedSe pickeó un pedido.
skuMovementcreatedSe creó un movimiento de SKU.
skuMovementstartedSe inició un movimiento de SKU.
skuMovementpickedSe pickeó un movimiento de SKU.
skuMovementendedFinalizó un movimiento de SKU.
skuMovementrejectedSe rechazó un movimiento de SKU.
skuMovementcanceledSe canceló un movimiento de SKU.
inboundMovementcreatedSe creó un movimiento de ingreso de mercadería.
inboundMovementstartedSe inició un movimiento de ingreso de mercadería.
inboundMovementcompletedSe completó un movimiento de ingreso de mercadería.
inboundToSlottingMovementcreatedSe creó un movimiento de ingreso a una posición de slotting.
inboundToSlottingMovementstartedSe inició un movimiento de ingreso a una posición de slotting.
inboundToSlottingMovementcompletedSe completó un movimiento de ingreso a una posición de slotting.
slottingPositionminUnitsReachedUna posición de slotting alcanzó su mínimo de unidades.
shrinkageprocessedSe procesó una merma y se descontó la mercadería almacenada.

Picking

Servicio picking, entidad session. Detalle técnico: Webhooks de Picking.

Evento (eventName)Cuándo se dispara
ready-for-pickLa sesión de picking está lista para pickear.
pickedFinalizó el picking de la sesión.

Control

Servicio control, entidad control. Detalle técnico: Webhooks de Control.

Evento (eventName)Cuándo se dispara
startedSe inició un control.

Catalog

Servicio catalog. Detalle técnico: Webhooks de Catalog.

Entidad (entity)Evento (eventName)Cuándo se dispara
productsavedSe creó o actualizó un producto. El campo metadata.eventType indica cuál de los dos casos ocurrió.
skusavedSe creó o actualizó un SKU. El campo metadata.eventType indica cuál de los dos casos ocurrió.

Pricing

Servicio pricing, entidad skuPrice. Detalle técnico: Webhooks de Pricing.

Evento (eventName)Cuándo se dispara
updatedCambió el precio efectivo de un SKU en un canal de venta.

Integración con VTEX

Servicio (service)Entidad (entity)Evento (eventName)Cuándo se disparaMás información
vtex-catalogproductproduct-import-errorNo se pudo importar un producto desde VTEX porque tiene campos duplicados.Webhooks de VTEX Catalog
vtex-catalogskusku-import-errorNo se pudo importar un SKU desde VTEX porque tiene campos duplicados.Webhooks de VTEX Catalog
vtex-wmsstockstockPublishErrorUna publicación de stock de Janis hacia VTEX no se completó con éxito.Webhook de errores de publicación de stock en VTEX

CSX (Atención al cliente)

Servicio csx, entidad claim. Detalle técnico: Webhooks de CSX.

Evento (eventName)Cuándo se disparaMás información
transitionUn reclamo pasó de un estado a otro.CSX

3. Configuración de filtros

Janis también permite configurar filtros para realizar o no las notificaciones en base al contenido que tenga el webhook.

Para configurar un filtro se debe ingresar el contenido por el que se requiere filtrar dentro del campo Filtro.

El filtro se aplica sobre los datos de la notificación, por lo que conviene revisar primero la estructura del evento en la documentación técnica de su servicio (ver Eventos disponibles). El siguiente ejemplo muestra la notificación de una entrega del servicio de Delivery:

{
  "service": "delivery",
  "entity": "shipping",
  "eventName": "scheduled",
  "eventDate": "2024-04-03T12:09:00.000Z",
  "metadata": {
    "id": "<YOUR_SHIPPING_ID>",
    "status": "scheduled",
    "displayId": "<YOUR_SHIPPING_DISPLAY_ID>",
    "refId": "<YOUR_SHIPPING_REF_ID>",
    "trackingId": "<YOUR_TRACKING_ID>",
    "realTimeId": "<YOUR_REAL_TIME_ID>",
    "integ": "uber",
    "type": "express_delivery",
    "shippingTypeId": "<YOUR_SHIPPING_TYPE_ID>",
    "shippingTypeTitle": "Standard delivery",
    "carrierId": "<YOUR_CARRIER_ID>",
    "carrierName": "Standard delivery Uber",
    "companyId": "<YOUR_COMPANY_ID>",
    "companyName": "Uber Express",
    "price": 10
  }
}

En función de la notificación anterior, si se necesitara notificar vía webhook solo las entregas de una integración de Delivery puntual, los datos cargados en el filtro deberían ser los siguientes:

{
  "type": "object",
  "properties": {
    "integ": {
      "const": "uber"
    }
  },
  "required": ["integ"]
}

4. Reintentos

Janis realiza hasta 7 reintentos frente a respuestas no exitosas del endpoint. Para conocer mayor detalle de la política de reintentos, se sugiere revisar la siguiente documentación.

Para recomendaciones sobre cómo implementar el endpoint que recibe las notificaciones, ver Webhooks: Buenas prácticas.


Did this page help you?