YOM Docs

Untitled

Precio de despacho

YOM puede delegar en el sistema del cliente el cálculo del costo de despacho de un pedido. Cuando un comercio o un vendedor cotiza o confirma un pedido, YOM envía una solicitud HTTP POST al endpoint del cliente con el detalle del Order. El cliente responde con el costo neto del despacho, o indica que no puede cotizarlo.

<aside> 📝

El cliente solo debe exponer el endpoint e informar a YOM su URL. No se requiere ninguna otra configuración.

</aside>

Cuándo lo llama YOM


La consulta ocurre en cuatro momentos, siempre de forma sincrónica:

Un mismo pedido genera por lo tanto más de una llamada: al menos una al cotizar en pantalla y otra al confirmarlo.

<aside> ⚠️

La consulta se omite por completo cuando el comercio no tiene código en el sistema del cliente. Sin order.externalId no hay cotización y el pedido se crea con despacho en 0.

</aside>

Endpoint


POST <tu_dominio>/webhooks/yom/order/delivery-price

Cuerpo de la solicitud

{
  "order": { ... }
}

Campos


Order

La entidad order, dentro de la clave order del cuerpo.

Campo Tipo Carácter Descripción Ejemplos
externalId 📝 Texto 🟢 Requerido Código del Comercio en el sistema del cliente. Es el único campo cuya ausencia impide la consulta. "10023456"
domain 📝 Texto 🟢 Requerido Dominio del cliente al que pertenece el pedido. "cliente.youorder.me"
shippingAddress 📝 Objeto → ShippingAddress 🟢 Requerido Dirección de entrega del pedido. Ver detalle abajo.
products 🔡 Lista de Objetos 🟢 Requerido Líneas del pedido, con sku, quantity y pricing. Útiles para cotizar por peso o volumen.
pricing 📝 Objeto 🟢 Requerido Totales del pedido. En la ida, pricing.shipping viaja con sus valores por defecto en 0. {"totalPrice": 35880}
estimatedDeliverAt 📅 Fecha ⚪ Opcional Fecha de entrega planificada, en formato ISO 8601. "2026-09-18T00:00:00.000Z"
distributionCenterId 🆔 ObjectId ⚪ Opcional Centro de distribución asociado al pedido. "650a1b2c3d4e5f6a7b8c9d99"
commerceId
commerceName 📝 Texto ⚪ Opcional Identificador y nombre del Comercio en YOM. "Minimarket Los Aromos"
sellerId 🔡 Lista de Textos ⚪ Opcional Identificadores del o los Vendedores asociados al pedido. ["186"]
type 📝 Texto ⚪ Opcional Tipo de pedido.
"order" → pedido
"quote" → cotización "order"
observation 📝 Texto ⚪ Opcional Observación del pedido. "Entregar por la mañana"

ShippingAddress

El objeto order.shippingAddress, con el destino del despacho.

Campo Tipo Carácter Descripción Ejemplos
address 📝 Texto 🟢 Requerido Calle y número de la dirección de entrega. "Av. Siempre Viva 742"
commune 📝 Texto 🟢 Requerido Comuna de destino. Es el campo que la mayoría de las tarifas usa para determinar la cobertura. "Maipú"
city 📝 Texto ⚪ Opcional Ciudad de destino. "Santiago"
name
phone 📝 Texto ⚪ Opcional Nombre y teléfono de quien recibe el despacho. "Bodega central"
metadata.coordinates 📝 Objeto ⚪ Opcional Coordenadas del destino, con latitude y longitude. {"latitude": -33.5110, "longitude": -70.7580}
metadata.administrativeAreaLevel1 📝 Objeto ⚪ Opcional Región o provincia del destino; el nombre viaja en longName. {"longName": "Región Metropolitana"}
metadata.country 📝 Objeto ⚪ Opcional País del destino; el nombre viaja en longName. {"longName": "Chile"}

<aside> ℹ️

En las cotizaciones previas el pedido todavía no existe: es un borrador armado con lo que hay en pantalla. Solo los campos marcados como requeridos están garantizados; el resto puede llegar vacío o ausente.

</aside>

Respuesta esperada


El endpoint debe responder 200 con Content-Type: application/json.

Campo Tipo Carácter Descripción Ejemplos
transportationCost 🔢 Número 🟢 Requerido Costo del despacho sin impuesto. Es el campo que YOM valida para decidir si hubo cotización.
El valor 0 es válido y significa despacho gratis. 1500
netValue 🔢 Número 🟢 Requerido Costo del despacho sin impuesto. Es el valor que se guarda en el pedido y el que viaja al sistema del cliente. Debe coincidir con transportationCost. 1500
netTaxedValue 🔢 Número 🟢 Requerido Costo del despacho con impuesto incluido. Es el valor que se muestra al comprador. 1785
taxesApplied.code 🔢 Número ⚪ Opcional Código del impuesto aplicado al despacho. 14
taxesApplied.value 🔢 Número ⚪ Opcional Tasa del impuesto expresada como fracción, no como porcentaje.
0.19 equivale a 19%. 0.19

<aside> 🚨

El campo netValue debe venir siempre. YOM valida transportationCost, pero guarda netValue: una respuesta que trae el primero y omite el segundo se acepta como cotización válida y deja el pedido con despacho en 0, sin ningún error visible. Es la falla más frecuente al conectar una integración nueva.

</aside>

Despacho cotizado

{
  "transportationCost": 1500,
  "netValue": 1500,
  "netTaxedValue": 1785,
  "taxesApplied": {"code": 14, "value": 0.19}
}

Despacho gratis

{
  "transportationCost": 0,
  "netValue": 0,
  "netTaxedValue": 0,
  "taxesApplied": {"code": 14, "value": 0.19}
}

Sin cotización

Una respuesta 200 que no incluya transportationCost se interpreta como que no hubo cotización. El pedido se crea igual, con despacho en 0, salvo que el cliente tenga activada la exigencia de cotización.

{}

Rechazo con motivo


Cuando el despacho no se puede cotizar por una razón de negocio — comuna fuera de cobertura, peso máximo excedido, ventana de entrega no disponible —, el endpoint debe responder un status 4xx con la explicación en el cuerpo. YOM la toma y la muestra al usuario tal cual.

El texto se busca, en este orden, en errors.message, detail o message; si el cuerpo es texto plano, se usa completo.

HTTP/1.1 422
Content-Type: application/json

{
  "message": "No existen parámetros de despacho hacia la comuna de destino."
}

El usuario ve ese mismo texto en pantalla y el pedido no avanza.

<aside> 🛑

Un 5xx nunca se interpreta como rechazo. Un error de servidor es una falla de infraestructura, no una decisión de negocio: se traduce a un error genérico que el comprador no puede resolver. Para comunicar un motivo hay que responder 4xx.

</aside>

Ejemplo


POST <https://api.cliente.com/webhooks/yom/order/delivery-price>
Content-Type: application/json
Accept: application/json
x-auth-token: 6a5a8ee27726337b51c72405
origin: legacy.youorder.me

{
  "order": {
    "externalId": "10023456",
    "domain": "cliente.youorder.me",
    "commerceId": "6412f0a1b2c3d4e5f6a7b8c9",
    "commerceName": "Minimarket Los Aromos",
    "distributionCenterId": "64aa11bb22cc33dd44ee55ff",
    "estimatedDeliverAt": "2026-09-18T00:00:00.000Z",
    "type": "order",
    "status": "pending",
    "shippingAddress": {
      "name": "Bodega central",
      "address": "Av. Siempre Viva 742",
      "commune": "Maipú",
      "city": "Santiago",
      "metadata": {
        "coordinates": {"latitude": -33.5110, "longitude": -70.7580},
        "administrativeAreaLevel1": {"longName": "Región Metropolitana"},
        "country": {"longName": "Chile"}
      }
    },
    "products": [
      {"sku": "SKU-001", "quantity": 12, "pricing": {"totalPrice": 35880}}
    ],
    "pricing": {
      "totalPrice": 35880,
      "netTotalPrice": 30151,
      "finalTotalPrice": 35880,
      "shipping": {"netValue": 0, "netTaxedValue": 0}
    }
  }
}
curl -X POST \
  '<https://api.cliente.com/webhooks/yom/order/delivery-price>' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'x-auth-token: 6a5a8ee27726337b51c72405' \
  -d '{"order": { ... }}'

Consideraciones


<aside> ⏱️

El endpoint debe responder en menos de 30 segundos. Pasados los 60 segundos la conexión se corta y la cotización se pierde.

</aside>