Por que isso importa
Para times de produto e operações, modelar cada saldo como sua própria conta significa que cada regra de segregação — uma saída bloqueada, um gasto exclusivo de benefício, um saldo promocional com validade — é aplicada pelo Ledger, e não enterrada na lógica da aplicação. Cada conta carrega seu próprio extrato e sua própria trilha de conciliação. Para times de engenharia, os endereços externos do cliente (números de core banking, identificadores de trilho de pagamento) resolvem para uma conta específica antes de a transação ser lançada. Não há adivinhação sobre a qual saldo um evento de entrada pertence, e não há um repositório de saldos separado para manter sincronizado com o Ledger.
A arquitetura de referência
O modelo é um dono, N contas, N identificadores externos:
- Um dono — o cliente, identificado por um documento (CPF, CNPJ, tax ID). O dono representa quem detém o relacionamento. Ele não carrega saldo e não decide o roteamento transacional.
- N contas — cada conta é uma posição contábil autossuficiente, com seu próprio saldo, ledger, extrato e regras.
- N identificadores externos — os endereços que outros sistemas (uma plataforma de core banking, um trilho de pagamento) usam para alcançar uma conta específica. Cada identificador resolve para exatamente uma conta.
Arquitetura de referência: um cliente, várias contas.
Cada identificador externo não é apenas um apelido de um saldo compartilhado. Quando saldo, ledger, extrato ou regra operacional difere por destino, cada identificador precisa apontar para uma conta distinta.
Como o Midaz mapeia o modelo
Cada parte dessa arquitetura mapeia para uma entidade nativa do Midaz — você não precisa construir um repositório de saldos separado nem inventar uma camada contábil.
Pré-requisitos
Este exemplo assume um ambiente Midaz em execução com o seguinte já configurado:
Valores no Midaz são representados na menor unidade da moeda. Para BRL,
15000 significa R$ 150,00 (centavos).Criando três contas para um cliente
O cliente com documento
12345678900 precisa de três contas: uma conta principal para movimentação ordinária, uma conta benefício governada por regras de produto, e uma conta bloqueada que aceita entradas mas restringe saídas.
1
Habilite a validação de Tipo de Conta
Ative a validação para que toda conta precise declarar um tipo registrado. É isso que permite ao Ledger aplicar a natureza de cada conta.As configurações entram em vigor imediatamente — sem necessidade de redeploy.
2
Registre os Tipos de Conta
Crie um Tipo de Conta por natureza de saldo. O Repita para
keyValue é o valor com o qual o campo type de cada conta precisa corresponder.benefit_account (“Movimentação governada por regras de produto”) e restricted_account — a conta bloqueada, onde entradas são permitidas mas saídas são condicionadas ou bloqueadas.3
Crie as três contas
Cada conta é vinculada ao asset Crie a conta benefício com
BRL, declara seu type e carrega um alias (seu endereço dentro do Ledger) e um entityId (seu identificador no seu sistema externo).alias @cust_12345678900_benefit, entityId 0001/88888-2, type benefit_account; e a conta bloqueada com alias @cust_12345678900_blocked, entityId 0002/77777-0, type restricted_account.4
Registre o cliente como um Holder
Crie um Holder para o cliente. O mesmo Holder será dono das três contas, mantendo a identidade centralizada.Salve o
O CRM roda como um serviço separado, e toda requisição exige o header
X-Organization-Id. Veja Primeiros passos com o CRM para a configuração do serviço e o schema completo.holderId retornado — você vai usá-lo no próximo passo.5
Vincule cada conta ao Holder
Crie uma Alias Account por conta do ledger para anexar contexto bancário e regulatório. É isso que viabiliza as funcionalidades baseadas em CRM e mantém os detalhes voltados ao cliente separados do Ledger.Note como o
entityId da conta principal (0001/12345-1) se decompõe na branch (0001) e na account (12345) que você registra aqui — é o endereço externo resolvendo para uma conta específica. Repita para as contas benefício e bloqueada, apontando o accountId para cada uma.A fronteira transacional
Quando um evento externo chega, a resolução acontece antes de o Midaz ser chamado. Manter cada camada no seu papel é o que preserva a clareza contábil.
1
Evento externo
Uma transação, consulta ou liquidação chega carregando um identificador externo.
2
O middleware resolve o identificador
O middleware busca o identificador externo e o resolve para o alias de conta Midaz correto, aplicando validação de status (ativo, bloqueado, encerrado).
3
O Midaz lança na conta certa
O Midaz registra o lançamento na conta resolvida, preservando saldo e ledger. Extrato e conciliação permanecem separados por conta.
O que isso destrava
- Segregação real — cada saldo tem seu próprio ledger e extrato, então um saldo bloqueado nunca pode ser gasto pela conta principal por acidente.
- Roteamento inequívoco — todo evento externo tem uma única conta de destino bem definida.
- Identidade centralizada — um único Holder é dono de várias contas; identidade e dados de contato vivem em um só lugar, enquanto os saldos permanecem separados.
- Nativo, não improvisado — contas, tipos, aliases e
entityIdsão primitivos da plataforma, então não há um repositório de saldos paralelo para conciliar contra o Ledger.
O que você precisa para começar
Próximos passos
Contas
A unidade financeira central — aliases,
entityId e contas externas.Tipos de Conta
Classifique contas e aplique sua natureza com a validação de rota.
Portfolios
Agrupe as contas de um cliente para ver o relacionamento total.
CRM: Holders e Alias Accounts
Centralize a identidade e anexe contexto bancário e regulatório.

