Dirección del saldo
Los saldos llevan un campo
direction que define cómo los débitos y créditos afectan al saldo:
Al crear un saldo, Midaz usa un
direction explícito cuando se proporciona y, si no, el defaultDirection del Tipo de Cuenta. Si ninguno está definido, las Cuentas externas usan debit; todas las demás usan credit.
Defines la dirección en el momento de la creación. Es inmutable. El saldo companion de overdraft (descrito a continuación) siempre usa
direction=debit.Configuraciones del saldo
El objeto
settings en un saldo controla el comportamiento de overdraft:
El objeto
settings también contiene balanceScope. Identifica un saldo transaccional (el predeterminado) o un saldo interno gestionado por el sistema, como el companion de overdraft. Puedes establecer balanceScope: "transactional" cuando creas o actualizas un saldo público. No puedes establecer balanceScope: "internal" a través de la API pública.Modos de configuración
Sin overdraft (por defecto)
El comportamiento estándar. Midaz rechaza cualquier débito que exceda el saldo disponible.Overdraft ilimitado
La posición derivada puede quedar negativa sin tope. El saldo persistidoAvailable se mantiene en 0, mientras Midaz registra el déficit como OverdraftUsed. Usa esto para cuentas de liquidación o pool, donde las posiciones negativas son normales y las concilias externamente.
Overdraft limitado
La posición derivada puede quedar negativa hasta un límite definido. El saldo persistidoAvailable se mantiene en 0, mientras Midaz registra el déficit como OverdraftUsed. Este es el modo más común para productos de crédito al consumidor.
Cómo funciona el overdraft
Split de operación
Cuando una transacción de débito excede los fondos disponibles, Midaz divide automáticamente la operación:- El débito consume todo el Available restante y lo fija en 0.
- Midaz acumula el excedente como OverdraftUsed en el saldo primario.
- Si Midaz encuentra el saldo interno
"overdraft"(descrito a continuación), crea una operación companion. Esta operación registra el pasivo como un débito de partida doble. Si no encuentra ese saldo, Midaz omite la operación companion; el saldo primario sigue acumulando OverdraftUsed.
La transacción se procesa como una única operación atómica. El llamador no necesita manejar el split — Midaz lo hace automáticamente.
Si configuras un límite, Midaz compara el OverdraftUsed resultante con el
overdraftLimit antes de procesar la transacción. Si el resultado excede el límite, Midaz rechaza la transacción con el error 0167 - ErrOverdraftLimitExceeded.Reembolso automático (refund split)
Cuando llega un crédito yOverdraftUsed > 0, Midaz prioriza el reembolso:
- Midaz aplica el crédito primero al OverdraftUsed y reduce la deuda.
- Cualquier monto remanente después de que OverdraftUsed llegue a 0 va al Available.
- Si Midaz encuentra el saldo interno
"overdraft", una operación companion en él registra el reembolso. Si no encuentra ese saldo, Midaz omite la operación companion; el crédito sigue reembolsando el OverdraftUsed del saldo primario.
Cancelación de transacción pendiente con overdraft
Cuando cancelas una transacciónPENDING que consumió overdraft:
- La cancelación revierte el hold original y cualquier overdraft consumido durante la ventana pending.
OverdraftUsedregresa a su valor previo al hold. - Si Midaz encuentra el saldo interno
"overdraft", una operaciónCREDITcompanion en él reduce el pasivo por el monto exacto consumido. Si no encuentra ese saldo, Midaz omite la operación companion; la cancelación primaria sigue restaurando elOverdraftUsed. - Cuando Midaz crea el crédito companion, aplica la cancelación primaria y el crédito companion en el mismo batch atómico, de modo que los dos saldos no se desincronizan.
"overdraft" existe, Midaz lo mantiene sincronizado con el saldo primario en las fases de hold, commit y cancel de cualquier transacción pending que toque el overdraft.
Position
Toda respuesta de saldo incluye un bloque computado
position. Ofrece una vista en tiempo real del estado del saldo:
Saldo companion
Cuando actualizas un saldo para establecer
allowOverdraft en true por primera vez, Midaz auto-aprovisiona un saldo companion bajo la misma cuenta. El saldo companion registra el lado del pasivo en la partida doble. Midaz lo crea una sola vez por cuenta y lo reutiliza en cada draw y reembolso de overdraft.
Este saldo es completamente gestionado por el sistema:
- No puedes crearlo, modificarlo ni eliminarlo a través de la API pública.
- Midaz reserva la clave
"overdraft". Una solicitud que crea un saldo con esta clave devuelve el error0170 - ErrReservedBalanceKey. - Refleja el pasivo como un registro de partida doble, de modo que el ledger se mantiene equilibrado.
El valor
scope: "internal" bloquea las operaciones directas de usuarios, sin importar las flags de permiso anteriores. Midaz rechaza cualquier operación directa sobre este saldo con el error 0168 - ErrDirectOperationOnInternalBalance. El companion solo se mueve a través del enrichment de overdraft conducido por el sistema.Estado de overdraft en las operaciones
Toda operación expone el estado de overdraft en los bloques
balance y balanceAfter. El campo overdraftUsed registra el overdraft consumido antes y después de la operación. Esto ofrece un rastro de auditoría completo sin una consulta separada al saldo.
Para operaciones que no tocan el overdraft, ambos valores son "0".
Las operaciones companion gestionadas por el sistema en el saldo "overdraft" usan type: "OVERDRAFT" (en mayúsculas). El campo direction lleva el ciclo de vida: "debit" para un draw, "credit" para un reembolso.
overdraftUsed antes/después. Ambas reflejan la transición de overdraft del saldo primario, por lo que el ciclo de vida es visible desde cualquiera de las filas. La columna interna snapshot (JSONB) en la tabla operations almacena los mismos valores para indexación y reconstrucción histórica. Esta columna no forma parte del JSON público. En su lugar, los valores aparecen en balance.overdraftUsed y balanceAfter.overdraftUsed. Midaz puede agregar contexto futuro generado por el sistema al snapshot sin romper el contrato público.
Eventos de overdraft
En tiempo de ejecución, Midaz habilita la publicación de eventos de overdraft a menos que
RABBITMQ_OVERDRAFT_EVENTS_ENABLED se establezca explícitamente en false. La configuración de entorno de ejemplo incluida establece la flag en false; un despliegue que parte de ese ejemplo no publica eventos de overdraft hasta que configuras la flag en true.
Tipos de evento
Ejemplo de payload del evento
Casos de uso
Sobregiro de cuenta corriente (cheque especial)
Crédito clásico al consumidor. La posición derivada de la cuenta corriente puede quedar negativa hasta un límite preaprobado; el saldo persistidoAvailable se mantiene en 0 y el monto pendiente se registra como OverdraftUsed.
Buy Now, Pay Later (BNPL)
Un proveedor de BNPL emite un crédito de compra contra el saldo del cliente. Esto crea una posición de overdraft inmediata que el cliente paga en cuotas.Anticipo salarial (Earned Wage Access)
Los empleados retiran contra ingresos futuros. Los créditos de nómina liquidan la posición de overdraft cuando llegan.Anticipo de cuentas por cobrar de marketplace
Los vendedores reciben un anticipo sobre cuentas por cobrar futuras. Midaz paga el overdraft automáticamente conforme llegan las liquidaciones de ventas.Cuentas de liquidación / Pool (modo ilimitado)
Las cuentas de liquidación y pool rutinariamente quedan negativas durante el procesamiento intradía. El overdraft ilimitado evita rechazos artificiales mientras concilias la posición al final del día.Líneas de crédito revolvente (B2B)
Las empresas retiran y pagan de una facilidad de crédito revolvente. El límite de overdraft representa la línea de crédito total.Prefinanciamiento de seguros
Las aseguradoras prefinancian siniestros antes del cierre de los ciclos de cobro de primas. El overdraft cubre la brecha entre el pago y la cobranza.Programas de fidelización (puntos anticipados)
Los clientes canjean puntos antes de acumularlos. El overdraft rastrea el déficit de puntos y se liquida conforme los clientes acumulan nuevos puntos.Reglas de protección
El overdraft introduce varias restricciones de inmutabilidad y acceso para mantener la integridad del ledger:
- La dirección es inmutable. Una vez que defines la
directionde un saldo en la creación, no puedes cambiarla. - Los saldos internos bloquean escrituras. No puedes crear, eliminar ni actualizar el saldo companion
"overdraft"a través de la API pública — un PATCH devuelve el error0175. - Claves reservadas. Midaz reserva la clave
"overdraft"para el saldo companion gestionado por el sistema. - Deshabilitar overdraft preserva la deuda pendiente. Puedes establecer
allowOverdraft: falsemientrasOverdraftUsed > 0para bloquear nuevos retiros, mientras que los créditos entrantes siguen pagando la deuda existente. - El límite no puede bajar del uso. Si
OverdraftUsed = 200, Midaz rechazaoverdraftLimit: "100"con el error0173, así que paga por debajo del nuevo techo primero o establece un límite mayor. - Concurrencia optimista. Las actualizaciones de saldo usan control de concurrencia basado en versión, y Midaz rechaza una escritura obsoleta con el error
0174— reintenta con la versión más reciente.
Próximos pasos
- Conoce los Saldos — la base sobre la que se construye el overdraft.
- Entiende las Operaciones para rastrear cómo los splits de overdraft aparecen en el ledger.
- Configura el Event Publisher para consumir eventos del ciclo de vida del overdraft.
- Explora las Transacciones para la visión completa de la contabilidad de partida doble en Midaz.

