Por qué esto importa
Para equipos de producto y operaciones, modelar cada saldo como su propia cuenta significa que cada regla de segregación — una salida bloqueada, un gasto exclusivo de beneficio, un saldo promocional con vencimiento — es aplicada por el Ledger, y no enterrada en la lógica de la aplicación. Cada cuenta lleva su propio extracto y su propia traza de conciliación. Para equipos de ingeniería, las direcciones externas del cliente (números de core banking, identificadores de riel de pago) resuelven a una cuenta específica antes de que se registre la transacción. No hay que adivinar a qué saldo pertenece un evento entrante, ni hay un repositorio de saldos separado que mantener sincronizado con el Ledger.
La arquitectura de referencia
El modelo es un dueño, N cuentas, N identificadores externos:
- Un dueño — el cliente, identificado por un documento (CPF, CNPJ, tax ID). El dueño representa quién tiene la relación. No carga saldo y no decide el enrutamiento transaccional.
- N cuentas — cada cuenta es una posición contable autosuficiente, con su propio saldo, ledger, extracto y reglas.
- N identificadores externos — las direcciones que otros sistemas (una plataforma de core banking, un riel de pago) usan para alcanzar una cuenta específica. Cada identificador resuelve a exactamente una cuenta.
Arquitectura de referencia: un cliente, muchas cuentas.
Cada identificador externo no es solo un apodo de un saldo compartido. Cuando el saldo, el ledger, el extracto o la regla operativa difiere según el destino, cada identificador debe apuntar a una cuenta distinta.
Cómo Midaz mapea el modelo
Cada parte de esta arquitectura mapea a una entidad nativa de Midaz — no necesitas construir un repositorio de saldos separado ni inventar una capa contable.
Requisitos previos
Este ejemplo asume un entorno Midaz en ejecución con lo siguiente ya configurado:
Los valores en Midaz se representan en la unidad más pequeña de la moneda. Para BRL,
15000 significa R$ 150,00 (centavos).Creando tres cuentas para un cliente
El cliente con documento
12345678900 necesita tres cuentas: una cuenta principal para movimiento ordinario, una cuenta de beneficio gobernada por reglas de producto, y una cuenta bloqueada que acepta entradas pero restringe salidas.
1
Habilita la validación de Tipo de Cuenta
Activa la validación para que toda cuenta deba declarar un tipo registrado. Esto es lo que le permite al Ledger aplicar la naturaleza de cada cuenta.Las configuraciones surten efecto de inmediato — sin necesidad de redeploy.
2
Registra los Tipos de Cuenta
Crea un Tipo de Cuenta por naturaleza de saldo. El Repite para
keyValue es el valor con el que debe coincidir el campo type de cada cuenta.benefit_account (“Movimiento gobernado por reglas de producto”) y restricted_account — la cuenta bloqueada, donde las entradas son permitidas pero las salidas están condicionadas o bloqueadas.3
Crea las tres cuentas
Cada cuenta está vinculada al asset Crea la cuenta de beneficio con
BRL, declara su type y lleva un alias (su dirección dentro del Ledger) y un entityId (su identificador en tu sistema externo).alias @cust_12345678900_benefit, entityId 0001/88888-2, type benefit_account; y la cuenta bloqueada con alias @cust_12345678900_blocked, entityId 0002/77777-0, type restricted_account.4
Registra al cliente como un Holder
Crea un Holder para el cliente. El mismo Holder será dueño de las tres cuentas, manteniendo la identidad centralizada.Guarda el
El CRM corre como un servicio separado, y toda solicitud requiere el header
X-Organization-Id. Consulta Primeros pasos con el CRM para la configuración del servicio y el schema completo.holderId retornado — lo usarás en el próximo paso.5
Vincula cada cuenta al Holder
Crea una Alias Account por cuenta del ledger para adjuntar contexto bancario y regulatorio. Esto es lo que habilita las funcionalidades basadas en CRM y mantiene los detalles orientados al cliente separados del Ledger.Observa cómo el
entityId de la cuenta principal (0001/12345-1) se descompone en la branch (0001) y la account (12345) que registras aquí — es la dirección externa resolviendo a una cuenta específica. Repite para las cuentas de beneficio y bloqueada, apuntando el accountId a cada una.La frontera transaccional
Cuando llega un evento externo, la resolución ocurre antes de que se llame a Midaz. Mantener cada capa en su rol es lo que preserva la claridad contable.
1
Evento externo
Una transacción, consulta o liquidación llega cargando un identificador externo.
2
El middleware resuelve el identificador
El middleware busca el identificador externo y lo resuelve al alias de cuenta Midaz correcto, aplicando validación de estado (activo, bloqueado, cerrado).
3
Midaz registra en la cuenta correcta
Midaz registra el asiento en la cuenta resuelta, preservando saldo y ledger. El extracto y la conciliación permanecen separados por cuenta.
Qué desbloquea esto
- Segregación real — cada saldo tiene su propio ledger y extracto, por lo que un saldo bloqueado nunca puede ser gastado a través de la cuenta principal por accidente.
- Enrutamiento inequívoco — todo evento externo tiene una única cuenta de destino bien definida.
- Identidad centralizada — un único Holder es dueño de muchas cuentas; la identidad y los datos de contacto viven en un solo lugar, mientras los saldos permanecen separados.
- Nativo, no improvisado — cuentas, tipos, aliases y
entityIdson primitivos de la plataforma, por lo que no hay un repositorio de saldos paralelo que conciliar contra el Ledger.
Qué necesitas para empezar
Próximos pasos
Cuentas
La unidad financiera central — aliases,
entityId y cuentas externas.Tipos de Cuenta
Clasifica cuentas y aplica su naturaleza con la validación de ruta.
Portfolios
Agrupa las cuentas de un cliente para ver la relación total.
CRM: Holders y Alias Accounts
Centraliza la identidad y adjunta contexto bancario y regulatorio.

