Saltar al contenido principal
Fees Engine aplica comisiones por transacción y calcula los cargos de facturación periódicos. Esta guía cubre ambos workflows: paquetes de comisiones (por transacción) y paquetes de facturación (por período).
Los paquetes de comisiones aplican cargos en el momento de la transacción. Los paquetes de facturación calculan cargos durante un período (diario, semanal o mensual) para que tu orquestador los ejecute. Puedes usar ambos al mismo tiempo.

Paquetes de comisiones: workflow por transacción


Los paquetes de comisiones aplican cargos de forma síncrona cuando creas una transacción v2. Esta sección muestra el proceso, desde la configuración de la comisión hasta los resultados.

Paso 1 - Crea tus paquetes de comisiones

Primero, configura los paquetes de comisiones que definen cómo el motor aplica las comisiones. Usa el endpoint Crear un paquete. Cada paquete contiene un conjunto de reglas de comisión y criterios de coincidencia. Puedes adaptar los paquetes a distintos ledgers, segmentos y rutas de transacción mediante estos campos:
  • transactionRoute - El ID de una ruta de transacción, cuando necesitas coincidencia en el nivel de ruta.
  • segmentId - El ID del segmento al que pertenecen las cuentas de origen, cuando necesitas coincidencia en el nivel de segmento.
  • metadataSelector - Pares de metadatos que la transacción debe incluir, cuando necesitas coincidencia en el nivel de metadatos.
  • Alcance del ledger - La URL de la solicitud identifica qué ledger registra la transacción; no envíes ledgerId en el cuerpo del paquete.
  • Monto mínimo y máximo - Umbrales para la aplicación de la comisión.
  • routeFrom / routeTo - Definen cómo se mueve cada comisión a través de los flujos contables.
Estos campos permiten aplicar comisiones distintas por escenario, desde configuraciones basadas en cuentas hasta configuraciones basadas en valor. Gestión de paquetes Los siguientes endpoints también están disponibles para gestionar los paquetes:

(opcional) Paso 2 - Ejecuta una estimación

Para previsualizar cómo se comporta un paquete de comisiones antes de confirmar una transacción real, usa el endpoint Estimar comisiones de transacción. Esta estimación ayuda a validar:
  • Qué reglas de comisión se aplican.
  • Cómo se comportará el paquete con los valores indicados.
  • Si aplica alguna exención.

Paso 3 - Crea una transacción

Una vez que configures los paquetes, crea la transacción mediante la API de transacciones v2, por ejemplo con el endpoint crear una transacción con el modelo directo v2. Solo las transacciones v2 aplican comisiones, incluidos los elementos directos y de hold de un lote v2. Para coincidir con un paquete limitado a una ruta, envía el ID de la ruta de transacción en routeId. Midaz lee el segmento de las cuentas de origen.

Paso 4 - Fees Engine evalúa los paquetes

Fees Engine se ejecuta en el mismo proceso cuando Midaz crea la transacción. Evalúa si se aplica un paquete, según:
  • transactionRoute, cuando está configurado
  • segmentId, cuando está configurado
  • metadataSelector, cuando está configurado
  • El alcance del ledger de la URL de la solicitud
  • Monto mínimo y máximo
  • waivedAccounts, cuando está configurado para exenciones de comisiones
Fees Engine selecciona como máximo un paquete por transacción: la coincidencia más específica. Cada par de metadataSelector hace que un paquete sea más específico. Cuando dos paquetes coinciden por igual, Midaz rechaza la transacción con el error 0198.
Una cuenta de origen con un plan de tarifas activo paga las comisiones de su plan, y el paquete no le cobra.

Paso 5 - Verifica las exenciones

El sistema verifica:
  • Si ningún paquete correspondiente cubre el monto de la transacción.
  • Si todas las cuentas de origen están exentas.
Si alguna de las condiciones se cumple, Fees Engine no aplica comisiones y la transacción continúa con normalidad. Una comisión cuyo cálculo suma cero no agrega asiento de comisión, por ejemplo una comisión definida como 0 en un paquete para un rango de montos. Cuando una comisión definida como 0 deja la transacción sin asiento de comisión, los metadatos de la transacción registran feeExemption con el motivo zero_fee_amount, y packageAppliedID indica el paquete. La cuenta externa (@external/<asset>) que Midaz agrega a una transacción entre ledgers nunca paga comisiones.

Paso 6 - Cálculo y aplicación de la comisión

Si se aplica un paquete, Fees Engine:
  • Calcula los valores de la comisión según el applicationRule seleccionado.
  • Aplica las comisiones de forma proporcional entre cuentas cuando es necesario.
  • Usa isDeductibleFrom para definir si suma o deduce la comisión.
  • Enruta las comisiones a la creditAccount correcta mediante los valores configurados de routeFrom y routeTo.
  • Devuelve el resultado completo de la transacción junto con el packageAppliedID en los metadatos.

Paso 7 - Actualizaciones del ledger

Una vez que Fees Engine calcula las comisiones, el componente Transactions se hace cargo. Procesa:
  • Débitos de las cuentas de origen
  • Créditos a los destinos de la comisión
  • Desglose de la comisión por ruta y cuenta
El ledger almacena cada movimiento para una trazabilidad y auditabilidad completas.

Paso 8 - Revisa y confirma

Después de la ejecución, puedes:
  • Inspeccionar la transacción final y los montos por cuenta.
  • Confirmar qué paquete de comisiones se aplicó.
  • Verificar todos los movimientos de comisión mediante los metadatos y los registros del ledger.

Fija el precio de un TED o Pix con un contexto de comisión


Un contexto de comisión es una etiqueta que eliges para una transferencia saliente, por ejemplo ted_salario. Un paquete de comisiones que selecciona por la etiqueta fija el precio de la transferencia. Requiere Midaz 4.2.0 o posterior, con Bank Transfer 3.4.0 o posterior para TED y Pix JD 1.5.0 o posterior para Pix. Las versiones anteriores de los dos plugins rechazan el campo con 400. Envía la etiqueta en feeContext, en el nivel superior del cuerpo de la solicitud de POST /v1/transfers/initiate para TED y P2P, o de POST /v1/transactions para Pix. La etiqueta es una letra minúscula, seguida de hasta 49 letras minúsculas, dígitos o guiones bajos. Nunca pongas datos personales en ella. Una lectura de la transferencia devuelve feeContext.

Crea el paquete de la etiqueta

Crea el paquete en el ledger del pagador, con metadataSelector igual a {"feeContext": "<label>"}. La clave es exactamente feeContext. Midaz aplica el paquete que cumple el mayor número de condiciones. Da al paquete de la etiqueta cada condición del paquete que fija el precio de la misma transferencia sin etiqueta: su transactionRoute, su segmentId y sus pares de metadataSelector. Después agrega el par feeContext. Con menos condiciones, el paquete de la etiqueta puede perder frente a ese paquete o empatar con él, y Midaz rechaza un empate con el error 0198. En la iniciación, Bank Transfer responde 422 BTF-2005.

Cuando el plugin rechaza la etiqueta

Bank Transfer y Pix JD verifican la etiqueta una vez, cuando aceptan la transferencia. Cuando la rechazan, no se retiene nada. Pix JD también rechaza una etiqueta en una orden que lleva indirectId, con 400 PIX-0061.

Después de que el plugin acepta la etiqueta

El plugin guarda la etiqueta con la transferencia, y cada intento de registrar la transferencia la lleva. Si deshabilitas o eliminas el paquete después, el plugin no rechaza una transferencia que ya aceptó. Un registro hecho después de eso toma el precio de los paquetes que siguen habilitados. La etiqueta se aplica solo a lo que el pagador envía: el TED OUT, la transferencia P2P y el Pix saliente. Nunca se aplica a un TED o Pix recibido, una devolución o reembolso, MED o Pix Automático. En Bank Transfer, una transferencia P2P entre dos ledgers lleva la etiqueta a los dos ledgers. Cada ledger fija el precio de su propia parte con sus propios paquetes, y en el ledger del destinatario solo se aplica una comisión descontada del monto.

¿Por qué estimar una transacción?


Las estimaciones permiten previsualizar cómo se comporta un paquete de comisiones específico, sin ejecutar una transacción real ni escribir en el ledger. Usa las estimaciones cuando:
  • Quieres probar un paquete específico.
  • Depuras reglas de comisión o umbrales.
  • Quieres validar exenciones, rangos de valor o divisiones proporcionales.
  • Necesitas una previsualización antes de crear una transacción real.
  • Construyes una interfaz y quieres mostrar las comisiones estimadas.
Fees Engine ofrece el endpoint Estimar comisiones de transacción para este fin. Envías un packageId, y el endpoint devuelve lo que ocurriría si se aplicara ese paquete exacto. Una estimación no lee las asignaciones de planes de tarifas.

¿Qué obtienes con una estimación?

  • Una estimación completa de las reglas de comisión.
  • Qué cuentas cobraría el motor.
  • Cómo dividiría el motor la comisión.
  • Ningún impacto en el ledger.
Usa las estimaciones cuando no estés listo para confirmar la transacción, o quieras dar a tus usuarios una previsualización clara de la comisión.

Errores comunes


Fees Engine valida cada solicitud para verificar la consistencia y la lógica correcta de las comisiones. A continuación, se muestran los problemas más frecuentes que puedes encontrar al crear paquetes o procesar transacciones.

Paquetes de facturación: workflow por período


Los paquetes de facturación calculan los cargos según el volumen acumulado de transacciones o el mantenimiento por cuenta durante un período de facturación. A diferencia de los paquetes de comisiones, tu orquestador activa la facturación. Decide cuándo calcular y ejecuta los cargos resultantes.

Paso 1: crea los paquetes de facturación

Configura los paquetes de facturación que definen tus reglas de cargo periódicas. Cada paquete es de tipo volumen o mantenimiento. Ejemplo de paquete de volumen, un cargo por cada Pix enviado con precios escalonados:
Ejemplo de paquete de mantenimiento, una comisión mensual por cuenta PF activa:

Paso 2: activa el cálculo de facturación

Llama a POST /v2/organizations/{organization_id}/ledgers/{ledger_id}/billing/calculate con el período de facturación. La URL identifica el ledger. El motor evalúa cada paquete de facturación habilitado en el ledger, limitado al type que envías.
El campo period admite tres formatos: YYYY-MM (mensual), YYYY-Www (semanal, por ejemplo, 2026-W13) y YYYY-MM-DD (diario). El campo type es opcional. Usa "volume" o "maintenance" para restringir el cálculo a un solo tipo. Omítelo para calcular ambos tipos en una sola llamada.

Paso 3: recibe los resultados del cálculo

Cada resultado incluye:
  • El paquete de facturación que lo generó.
  • Los montos calculados.

Paso 4: ejecuta los cargos

Envía cada transactionPayload no vacío a Midaz con Crea una transacción con JSON (POST /v1/organizations/{organization_id}/ledgers/{ledger_id}/transactions/json) para crear las transacciones de facturación. Un objeto vacío significa que no hay cargo que ejecutar.
El motor de facturación calcula y devuelve resultados. No crea transacciones en Midaz. Tu orquestador controla cuándo y cómo ejecuta los cargos.

Paso 5: revisa y concilia

Después de ejecutar los cargos:
  • Verifica que las transacciones creadas en Midaz coincidan con los resultados del cálculo de facturación.
  • Usa los metadatos de auditoría de los payloads de transacción no vacíos para la conciliación.
  • El cálculo de facturación no tiene estado. Una nueva ejecución para el mismo período refleja el ledger en el momento de esa ejecución.

Gestión de paquetes de facturación

Usa estos endpoints para gestionar los paquetes de facturación existentes:
  • GET /v2/organizations/{organization_id}/ledgers/{ledger_id}/billing-packages: enumera todos los paquetes de facturación.
  • GET /v2/organizations/{organization_id}/ledgers/{ledger_id}/billing-packages/{billing_package_id}: obtiene un paquete de facturación específico.
  • PATCH /v2/organizations/{organization_id}/ledgers/{ledger_id}/billing-packages/{billing_package_id}: actualiza un paquete de facturación (solo label, description, enable).
  • DELETE /v2/organizations/{organization_id}/ledgers/{ledger_id}/billing-packages/{billing_package_id}: elimina lógicamente un paquete de facturación.
Si algún paquete falla durante el cálculo, toda la operación falla y no devuelve resultados parciales. El cálculo de facturación sigue una política de todo o nada. Corrige el paquete con errores y vuelve a ejecutar.