1. Projete pacotes de tarifas com nomenclatura e segmentação claras
Uma estrutura de pacotes bem organizada facilita manter, depurar e auditar a configuração de tarifas ao longo do tempo.
- Use nomes descritivos que reflitam o contexto de negócio (por exemplo, “pix-transfer-standard”, “wire-premium-segment”).
- Segmente por produto e grupo de clientes usando
segmentId. Isso permite aplicar regras de tarifas diferentes para diferentes níveis de clientes sem criar pacotes conflitantes. - Mantenha os pacotes focados. Um pacote que tenta cobrir cenários demais fica difícil de testar e manter. Prefira vários pacotes focados a um único pacote que faz tudo.
- Documente a estrutura de pacotes internamente. À medida que o número de pacotes cresce, uma referência clara de onde cada pacote se aplica evita configurações incorretas.
2. Defina as prioridades de tarifas com cuidado
Quando um pacote contém várias tarifas, o campo
priority determina a ordem de execução. Um erro aqui pode gerar cálculos incorretos.
- A prioridade 1 deve sempre usar
referenceAmount: originalAmount. O engine aplica essa regra. - Tarifas com
isDeductibleFrom: truetambém devem usarreferenceAmount: originalAmount. Tarifas dedutíveis sempre se aplicam ao valor total da transação. - A prioridade deve ser única dentro de um pacote. O engine rejeita prioridades duplicadas.
- Pense nas dependências entre tarifas. Se uma tarifa ajusta o valor da transação e outra tarifa deve ser calculada sobre o valor ajustado, use
referenceAmount: afterFeesAmountcom um número de prioridade maior. Se a segunda tarifa deve referenciar o valor original, useoriginalAmount.
3. Sempre faça a estimativa antes de aplicar tarifas em produção
O Fees Engine oferece um endpoint estimate que permite pré-visualizar os cálculos de tarifas sem gravar nada no ledger. Use a estimativa para:
- Validar novos pacotes antes de ativá-los. Confirme que os valores calculados correspondem aos resultados esperados em diferentes valores de transação.
- Testar casos extremos: transações com valor zero, valores limite nos limiares de
minimumAmountemaximumAmount, e contas isentas. - Pré-visualizar tarifas para os usuários. Se o seu produto mostra as tarifas antes da confirmação, use o endpoint estimate para fornecer pré-visualizações precisas.
- Depurar resultados inesperados. Se uma tarifa calculada não corresponder ao esperado, faça a estimativa da mesma transação com um
packageIdespecífico para isolar o problema.
O endpoint calculate seleciona automaticamente o pacote mais adequado. O endpoint estimate exige um
packageId específico, dando controle total sobre qual pacote testar.4. Gerencie as isenções explicitamente
O Fees Engine oferece suporte a dois tipos de isenção: por faixa de valor da transação e por conta.
- Faixas de valor (
minimumAmount,maximumAmount): definem a janela de valor da transação na qual as tarifas se aplicam. Transações fora dessa faixa ficam isentas. Use isso para limiares promocionais ou precificação por faixas. - Contas isentas (
waivedAccounts): contas específicas isentas de tarifas dentro de um pacote. Use isso para contas internas, contas de funcionários ou acordos de parceria.
- Mantenha as listas de contas isentas curtas e revisadas. Listas grandes ficam difíceis de auditar. Revise periodicamente quais contas estão isentas e por quê.
- Documente o motivo de negócio de cada isenção nos seus registros internos.
- Teste os limites das isenções. Se a sua faixa é R 300 e R$ 301 se comportem como esperado.
5. Use valores numéricos corretos
Expresse todos os valores financeiros no Fees Engine como strings, usando o tipo
numeric. Isso evita os erros de precisão de ponto flutuante comuns na aritmética decimal.
- Sempre envie os valores como strings, mesmo números inteiros (por exemplo,
"100"e não100). - Nunca use tipos de ponto flutuante para cálculos monetários na camada de integração.
- O engine ajusta automaticamente as divisões de tarifas com dízimas periódicas (por exemplo, R$ 10 divididos entre 3 contas) para manter os totais do ledger exatos.
6. Use exclusão lógica para auditabilidade
Quando você exclui um pacote de tarifas, o Fees Engine o marca com um timestamp
deletedAt em vez de removê-lo do banco de dados. Isso preserva a trilha de auditoria das transações históricas que referenciaram esse pacote.
- Não dependa da exclusão definitiva de pacotes de tarifas em produção. Transações históricas podem referenciar pacotes excluídos para fins de conciliação.
- Revise periodicamente os pacotes excluídos se o banco de dados crescer significativamente. Estratégias de arquivamento ajudam a gerenciar o armazenamento sem perder a capacidade de auditoria.
7. Monitore o processamento de tarifas em produção
As tarifas são processadas dentro do processo do ledger do Midaz. Use a configuração compartilhada de OpenTelemetry do ledger e os endpoints de integridade para observar o processamento de tarifas. Consulte Variáveis de ambiente para a configuração aceita. Em produção:
- Monitore os endpoints de integridade do ledger e seus traces e logs.
- Configure alertas para latência alta sustentada ou erros nos cálculos de tarifas.
- Monitore o deploy configurado do MongoDB: uso do connection pool, espaço em disco e integridade da replicação.
- Revise o uso de recursos dos pods do ledger em relação aos padrões de tráfego e ao comportamento de autoscaling.
8. Mantenha as versões compatíveis
Antes de atualizar o Fees Engine:
- Consulte a tabela de compatibilidade de versões para confirmar a compatibilidade com a sua versão do Midaz Core.
- Sempre atualize o Midaz Core primeiro e depois o Fees Engine.
- Faça backup dos dados do MongoDB e dos valores do Helm antes de qualquer atualização importante.
- Teste a atualização em um ambiente de staging antes de aplicá-la em produção.
9. Revise as recomendações de segurança
O Fees Engine processa dados financeiros e se integra às operações do ledger do Midaz. Confirme que o seu deploy segue as Recomendações de segurança da plataforma, que abrangem:
- Segmentação de rede e arquitetura Zero Trust
- Gestão e rotação de segredos (incluindo
LICENSE_KEYe credenciais de banco de dados) - Aplicação de TLS 1.2 ou superior para todas as comunicações
- Configuração de RBAC via Access Manager
- Gestão de patches e varredura de vulnerabilidades
10. Projete pacotes de cobrança com escopo claro
Cada pacote de cobrança deve representar uma cobrança única e bem definida. Evite agrupar precificações não relacionadas em um único pacote.
- Separe pacotes por rota de transação. Um pacote para cobrança de Pix e um pacote para cobrança de boleto são mais claros do que um único pacote que tenta lidar com os dois.
- Use rótulos descritivos que incluam o tipo de cobrança e o alvo: “Cobrança Mensal de Envio Pix — Nível Padrão” é melhor do que “Pacote de Cobrança 1”.
- Um único tipo de
accountTargetpor pacote de manutenção. Não é possível combinarsegmentId,portfolioIdealiasesno mesmo pacote. Se você precisar de alvos diferentes, crie pacotes separados. Uma única chamada a/billing/calculateavalia todos os pacotes ativos.
11. Escreva os termos comerciais com base no volume por rota
O cálculo de volume conta as transações por rota de transação em todo o ledger. A cota gratuita, as faixas e as faixas de desconto se aplicam a esse total no nível da rota.
- Defina os limiares como volume de rota. “As primeiras 100 transações na rota
pix-sendsão gratuitas” mapeia diretamente para um pacote. Escreva o contrato nos mesmos termos em que o engine cobra. - Divida as rotas para dividir as contagens. Um pacote por rota de transação mantém cada fluxo com sua própria cota, faixas e descontos.
12. Planeje as cotas gratuitas e as faixas de desconto com cuidado
O Fees Engine avalia as cotas gratuitas e os descontos em uma ordem específica:
- O engine subtrai a cota gratuita da contagem total para obter a contagem faturável.
- O engine precifica a contagem faturável. Para pacotes com faixas, ele cobra cada unidade faturável pela taxa da única faixa correspondente (precificação por volume, não progressiva).
- O engine aplica uma faixa de desconto ao valor bruto, escolhida com base na contagem total (antes de a cota gratuita ser subtraída).
- As cotas gratuitas são reiniciadas a cada período de cobrança. Defina o valor com base no seu acordo comercial por período (mensal, semanal ou diário), não vitalício.
- As faixas são intervalos de volume, não fatias. Uma contagem faturável de 1.750 dentro de uma faixa de 501–2.000 precifica todas as 1.750 unidades pela taxa dessa faixa. Cruzar o limite de um intervalo muda a taxa para todo o volume, então os limites das faixas podem alterar a cobrança de forma abrupta.
- Cubra toda contagem faturável positiva. Se a contagem faturável for positiva e nenhuma faixa contiver esse valor, o cálculo falha para esse pacote. Deixe o limite superior da última faixa aberto. Comece a primeira faixa em 1 (uma contagem faturável igual a zero gera um valor zero e um payload vazio, sem consulta a nenhuma faixa).
- As faixas de desconto são limiares cumulativos, não intervalos, e apenas uma se aplica: o maior
minQuantityque a contagem total alcança. Se você definir descontos em 200 e 400 transações, um cliente com 500 transações recebe o desconto de 400+, não os dois. - Preste atenção às duas contagens diferentes. A precificação usa a contagem faturável (depois da cota gratuita); o desconto usa a contagem total (antes dela).
13. Dimensione os alvos de contas de manutenção adequadamente
Pacotes de manutenção oferecem suporte a três tipos de alvo com perfis de escala diferentes:
Escolha o tipo de alvo que corresponda à sua escala operacional. Se você perceber que está listando centenas de aliases, migre para um segmento ou portfólio no Midaz.
14. Trate falhas de cobrança com nova execução
O cálculo de cobrança segue uma política tudo ou nada. Se algum pacote falhar, o engine não retorna nenhum resultado.
- Implemente lógica de nova tentativa no seu orquestrador. O cálculo é stateless. Executar novamente para o mesmo período produz os mesmos resultados.
- Verifique as respostas de erro para o pacote e o recurso específicos que falharam. Causas comuns:
ledgerIdinválido, API do Midaz inacessível ou pacotes de cobrança desabilitados. - Separe os cálculos de volume e de manutenção se um tipo tiver sucesso de forma consistente enquanto o outro falha. Chame
/billing/calculatecom"type": "volume"e"type": "maintenance"de forma independente para isolar falhas.

