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 eventoLa 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 dispara | Más información |
|---|---|---|
complete | La información del pedido está completa, pero todavía no terminó su distribución. | |
ready | La 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-started | El pedido entró en su período de gracia, durante el cual todavía se puede modificar o cancelar. | |
grace-period-ended | Terminó 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-audit | El pedido está en auditoría de pedido nuevo. | |
new-order-audit-rejected | Se rechazó la auditoría de pedido nuevo. | |
ready-for-payment-validation | El pedido está listo para la validación de pagos. | |
validating-payments-error | Ocurrió un error al validar los pagos del pedido. | |
ready-for-picking | El pedido está listo para iniciar el picking. | |
picking | Comenzó el picking del pedido. | |
prepicking-items-changed | Se modificaron los ítems de prepicking del pedido. | |
partially-picked | El pedido se pickeó de forma parcial. | |
unpicked | Se despickearon uno o más ítems del pedido. | |
missing-items-final | El pedido terminó el picking con ítems faltantes sin ningún candidato de sustitución asignado. | Webhook de faltantes sin candidatos |
pending-candidates-confirmation | El pedido tiene sustitutos candidatos pendientes de confirmación por parte del cliente. | Sustitutos candidatos |
pending-candidates-validation | El pedido tiene sustitutos candidatos pendientes de validación. | Candidatos pendientes |
candidates-confirmation-deadline-exceeded | Se superó el plazo para confirmar los sustitutos candidatos del pedido. | Sustitutos candidatos |
in-picking-audit | El pedido está en auditoría de picking. | |
picking-audit-rejected | Se rechazó la auditoría de picking del pedido. | |
picked-label | El pedido está pickeado y se generaron sus etiquetas. | |
package-label | Se generaron las etiquetas de los paquetes del pedido. | Plantilla de etiqueta de paquete |
shipping-scheduled-label | La entrega del pedido está programada y se generaron sus etiquetas. | |
ready-for-invoice | El pedido ya se puede facturar. | Cómo integrar facturación |
invoiced | El pedido se facturó por completo. | |
invoice-canceled | Se anularon las facturas del pedido. | Ver Anulación de factura |
ready-internal-distribution | El pedido está listo para la distribución interna. | |
ready-for-delivery | El pedido está listo para iniciar la entrega. | |
critical-threshold | El 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-delivery | El pedido fue despachado. | |
delivered | El pedido se entregó con éxito al cliente. | |
not-delivered | Falló la entrega del pedido. El pedido debe reprogramarse o cancelarse. | |
needs-rescheduling | El pedido necesita ser reprogramado. | |
delivery-rescheduled | Se reprogramó la entrega del pedido. | |
rescheduled | Se reprogramaron ítems del pedido. | |
store-changed | Se cambió la tienda del pedido. | |
needs-intervention | El pedido necesita ser intervenido. | |
request-refund | Se creó una solicitud de reembolso del pedido. | |
liquidated | El pedido fue liquidado. | |
canceled | El 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 campoinvoicespuede no llegarSi el pedido conservaba solo los identificadores de sus facturas, la notificación viaja sin el campo
invoices. El campoinvoiceIdssiempre 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 |
|---|---|---|
route | created | Se creó la ruta. |
route | scheduled | Se programó la ruta. |
route | started | Se inició la ruta. |
route | dispatched | Se despachó la ruta. |
route | finished | Se finalizó la ruta. |
route | cancelled | Se canceló la ruta. |
route | error | Ocurrió un error en la ruta. |
shipping | created | Se creó la entrega. |
shipping | scheduled | Se programó la entrega. |
shipping | rescheduled | Cambió la fecha o franja horaria de una entrega ya existente. Se dispara cada vez que cambia la programación. |
shipping | readyForPickup | Los paquetes de la entrega están listos para ser retirados en el origen. Se dispara una vez por entrega. |
shipping | pickupAnnouncement | La entrega recibió un aviso de retiro. |
shipping | started | Se inició la entrega. |
shipping | dispatched | Se despachó la entrega. |
shipping | delivered | Se completó la entrega. |
shipping | partiallyDelivered | La entrega se completó de forma parcial. |
shipping | notDelivered | La entrega no se pudo completar. |
shipping | cancelled | Se canceló la entrega. |
TMS (Rutas)
Servicio tms, entidad route. Detalle técnico: Webhooks de TMS.
Evento (eventName) | Cuándo se dispara |
|---|---|
scheduled | Se programó la ruta. |
started | Se inició la ruta. |
finished | Se finalizó la ruta. |
cancelled | Se canceló la ruta. |
WMS (Inventario y movimientos)
Servicio wms. Detalle técnico: Webhooks de WMS.
Entidad (entity) | Evento (eventName) | Cuándo se dispara |
|---|---|---|
stock | updated | Se actualizó el stock de un SKU en un warehouse. |
stock | outOfStock | El stock disponible de un SKU en un warehouse llegó a cero o menos. |
order | movementCreated | Se creó un movimiento de un pedido entre warehouses. |
order | moved | Se movió un pedido. |
order | movementCanceled | Se canceló un movimiento de un pedido. |
order | picked | Se pickeó un pedido. |
skuMovement | created | Se creó un movimiento de SKU. |
skuMovement | started | Se inició un movimiento de SKU. |
skuMovement | picked | Se pickeó un movimiento de SKU. |
skuMovement | ended | Finalizó un movimiento de SKU. |
skuMovement | rejected | Se rechazó un movimiento de SKU. |
skuMovement | canceled | Se canceló un movimiento de SKU. |
inboundMovement | created | Se creó un movimiento de ingreso de mercadería. |
inboundMovement | started | Se inició un movimiento de ingreso de mercadería. |
inboundMovement | completed | Se completó un movimiento de ingreso de mercadería. |
inboundToSlottingMovement | created | Se creó un movimiento de ingreso a una posición de slotting. |
inboundToSlottingMovement | started | Se inició un movimiento de ingreso a una posición de slotting. |
inboundToSlottingMovement | completed | Se completó un movimiento de ingreso a una posición de slotting. |
slottingPosition | minUnitsReached | Una posición de slotting alcanzó su mínimo de unidades. |
shrinkage | processed | Se 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-pick | La sesión de picking está lista para pickear. |
picked | Finalizó el picking de la sesión. |
Control
Servicio control, entidad control. Detalle técnico: Webhooks de Control.
Evento (eventName) | Cuándo se dispara |
|---|---|
started | Se inició un control. |
Catalog
Servicio catalog. Detalle técnico: Webhooks de Catalog.
Entidad (entity) | Evento (eventName) | Cuándo se dispara |
|---|---|---|
product | saved | Se creó o actualizó un producto. El campo metadata.eventType indica cuál de los dos casos ocurrió. |
sku | saved | Se 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 |
|---|---|
updated | Cambió el precio efectivo de un SKU en un canal de venta. |
Integración con VTEX
Servicio (service) | Entidad (entity) | Evento (eventName) | Cuándo se dispara | Más información |
|---|---|---|---|---|
vtex-catalog | product | product-import-error | No se pudo importar un producto desde VTEX porque tiene campos duplicados. | Webhooks de VTEX Catalog |
vtex-catalog | sku | sku-import-error | No se pudo importar un SKU desde VTEX porque tiene campos duplicados. | Webhooks de VTEX Catalog |
vtex-wms | stock | stockPublishError | Una 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 dispara | Más información |
|---|---|---|
transition | Un 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.
Updated 8 days ago