platform-fee) permite que intermediadores — marketplaces, SaaS de pagamentos e plataformas B2B — configurem uma comissão persistente sobre as transações dos seus sellers. Em vez de incluir a própria conta nas splitRules de cada cobrança, a plataforma define a taxa uma vez na subconta e a Malga aplica automaticamente antes de distribuir o valor restante entre os recebedores.
O
platform-fee é uma camada sobre o split de provedor. Na cobrança com splitRules, a taxa sai da parte dos sellers do split. Na cobrança sem splitRules, com a taxa ligada, a Malga cobra a taxa do único seller ativo da subconta, como descrito em Venda sem split.Como funciona
A taxa da plataforma é simples de configurar e opera em três níveis:- Ativação: Uma flag no merchant habilita ou desabilita a aplicação das taxas. Enquanto desativada, nenhuma regra é aplicada nas transações, dando total controle sobre quando começar a cobrar.
- Regras por método de pagamento: Cada regra define a taxa para um método específico (
credit,pix,boleto). Não existe regra genérica: cada método que você vende precisa de regra própria. Para cartão de crédito, a taxa é definida por parcela: cada número de parcelas, de 1x a 24x, pode ter um valor diferente. A venda Apple Pay não paga a taxa da plataforma, com ou sem split. - Regras por seller: Um seller da subconta pode ter taxa própria em um ou mais métodos. Onde ele não tem regra própria, vale a regra da subconta. Veja Taxa por seller.
splitRules e a subconta tem a taxa ligada, a Malga executa o seguinte antes de enviar ao provedor:
- Calcula o valor da taxa sobre o montante bruto da transação
- Subtrai esse valor para obter o valor líquido
- Distribui o valor líquido entre os sellers declarados nas
splitRules - O valor não declarado nos
splitRulesvai para a conta da plataforma
splitRules — a fatia da plataforma é retida automaticamente.
Quando algum seller da cobrança tem regra própria para o método e a parcela, a conta é feita seller a seller, como descrito em Conta por seller.
Sem splitRules, a cobrança paga a taxa pelo único seller ativo da subconta, como descrito em Venda sem split.
Configurando as regras
As regras são configuradas no nível da subconta via API. Cada regra define o método de pagamento e o valor da taxa: percentual, valor fixo ou os dois combinados.
O corpo da requisição aceita um array de regras ou um objeto com a lista em
rules, com até 50 objetos de regra. Uma tabela ou fórmula de crédito conta como um objeto. Um corpo com mais de 50 é recusado com 400. Os dois exemplos abaixo têm o mesmo efeito:
Cadastre regra para cada método que você vende e, no crédito, para cada parcela. Com a taxa ligada, a venda, com ou sem split, num método ou numa parcela que não tem regra na subconta nem no seller é recusada com
422 e platform_fee_rule_not_configured, como descrito em Parcela sem regra própria.Regra default descontinuada
A regra genéricapaymentMethod: default não existe mais. Antes de ela sair, a Malga converteu cada regra default em regras por método, com o mesmo valor, nos métodos que a subconta oferece. No crédito, a conversão gravou uma regra sem installment, que vale para toda parcela sem regra própria da subconta. Essa regra aparece em rules sem o campo installment, e não é criada pela API: a regra avulsa de crédito exige installment.
POST e PUT com paymentMethod: default, na subconta ou no seller, respondem 400 com PLATFORM_FEE_DEFAULT_RULE_DISCONTINUED, e nada é gravado. Cadastre regra para todo método e parcela que você vende, na subconta ou no seller, e use coverage para conferir o que falta.
Taxa de crédito por parcela
No cartão de crédito, cada número de parcelas tem a própria taxa, de 1x a 24x. Uma regra cominstallment: 3 vale só para vendas em 3x, e a taxa de 3x pode ser diferente da taxa de 2x e da de 4x.
A taxa incide sobre o valor total da venda, e não sobre o valor de cada parcela:
Cadastrando a tabela parcela a parcela
A mesma tabela pode ser escrita de três formas. Use uma forma por objeto de regra.- Tabela curta
- Tabela longa
- Regra avulsa
Use A requisição grava 12 regras de crédito, de 1x a 12x. As parcelas gravadas por
installmentRates quando a tabela só tem percentual. A posição na lista é o número de parcelas: o primeiro item vale para 1x, o segundo para 2x, e assim por diante, até 24 itens.installmentRates ficam sem valor fixo.A regra de tabela curta aceita só paymentMethod e installmentRates. Qualquer outra chave no mesmo objeto recusa a requisição com 400, em vez de ser ignorada.POST retorna 409: para alterar uma tabela existente, use o PUT, descrito em Atualizando a tabela de crédito.
Cadastrando a tabela por fórmula
Quando a taxa segue uma regra de crescimento, envie a fórmula e a Malga gera a tabela. A fórmula é calculada no cadastro: o que fica gravado é uma regra por parcela, de 1x atémaxInstallments, e a fórmula em si não é armazenada.
Os modos de crescimento em
growth.mode:
Para cada parcela, a conta segue esta ordem:
- Parte da
base. - Aplica o crescimento, se a parcela for igual ou maior que
growth.from. - Soma as sobretaxas cujo
fromInstallmentjá foi alcançado. - Limita ao
cap. - Substitui pelo
overridesda parcela, se houver. - Arredonda o percentual para 2 casas decimais, com meio para cima.
Em 7x entra a sobretaxa de 0,50 ponto. Em 8x a conta daria 4,69%, e o teto limita o valor a 4,60%.
A configuração inteira é recusada com
400 quando:
growth.modeéexponentiale faltacap.percentage;- um item de
overridesfica acima docap; - alguma parcela calculada passa de 100%;
maxInstallmentsestá ausente ou fora de 1 a 24;- uma sobretaxa não tem
percentagenemfixedAmount, ousurchargeseoverridesrepetem a mesma parcela; - a regra ou algum objeto da fórmula traz uma chave desconhecida, como
cappno lugar decap. A regra de fórmula aceita sópaymentMethod,maxInstallments,base,growth,surcharges,overridesecap; - a fórmula vem fora de
creditou junto cominstallmentRates,installments,installment,percentageoufixedAmount.
Parcela sem regra própria
Com a taxa ligada, a venda no crédito, com ou sem split, precisa de regra para a parcela vendida, na subconta ou no seller. Quando nenhuma das duas cobre a parcela, a cobrança é recusada com422 e platform_fee_rule_not_configured, e error.context diz o seller, o método e a parcela. Vale o mesmo para Pix e boleto sem regra. Cadastre a tabela de crédito de 1x a 24x, ou ao menos até o maior número de parcelas que você vende.
Por exemplo, com regras de crédito só em 1x, 2x e 7x:
Resposta da cobrança com split em 18x, sem regra para 18x na subconta nem no seller:
Atualizando a tabela de crédito
OPUT /v1/merchants/{merchantId}/platform-fee aceita o mesmo corpo do POST, e o efeito depende da forma:
- Com
installmentRates,installmentsou fórmula, oPUTsubstitui a tabela de crédito inteira: atualiza as parcelas que já existem, cria as que faltam e remove as que ficaram de fora. As regras depixeboletonão mudam, nem a regra de crédito seminstallment, quando a subconta tem uma, como descrito em Regra default descontinuada. - Com regra avulsa, o
PUTatualiza só a regra da mesma parcela e só os campos enviados. Se a parcela não tiver regra, a resposta é404.
PUT é aplicado por inteiro ou não é aplicado. Se qualquer regra avulsa do corpo não existir, a resposta é 404 e nada muda, nem a tabela enviada na mesma requisição. A resposta de sucesso traz as regras como ficaram gravadas.
Consultando a taxa calculada
OGET /v1/merchants/{merchantId}/platform-fee devolve as regras gravadas em rules e, junto, a conta feita: quanto a plataforma retém e quanto sobra para os recebedores em cada método e em cada parcela. Informe em simulationAmount o valor da venda simulada, em centavos.
simulation e methods só vêm quando simulationAmount é enviado. platformFeeEnabled, rules, sellerRules e coverage vêm sempre. sellerRules e o estado por seller estão descritos em Consultando as regras dos sellers.
Resposta para a tabela curta de 1x a 12x cadastrada acima, numa venda de R$ 10.000,00. A lista installments traz sempre as 24 parcelas. A subconta não tem regra de 13x a 24x, e essas parcelas vêm com accepted: false, reason: no_rule_configured e sem os campos de taxa. O trecho abaixo omite rules, sellerRules e coverage.merchant.methods e mostra 1x, 2x, 12x e 13x:
installments:
Em
pix e boleto, os campos de taxa vêm no próprio item do método, com source: rule. Sem regra, o item vem só com { "paymentMethod": "boleto", "accepted": false, "reason": "no_rule_configured" }, e o método entra em coverage.merchant.missing. No crédito, a origem de cada parcela está em installments[].source.
Em coverage.merchant, missing lista os métodos sem nenhuma regra aplicável, warnings traz avisos em texto, como a flag de ativação desligada ou as parcelas de crédito sem regra, e methods traz o estado de cada método e faixa de parcelas. Os avisos são para leitura humana: para tratar esses casos no código, use source, accepted, reason e coverage.merchant.methods.
Consulte todos os campos da resposta em Listar regras de platform fee.
Taxa por seller
Um seller da subconta pode ter taxa própria, diferente da taxa da subconta. A regra do seller substitui a regra da subconta para ele, método a método e só nas parcelas que ela cobre. O que a regra do seller não cobre continua seguindo a regra da subconta. Por exemplo, um seller com regra própria só no Pix paga a própria taxa no Pix e a taxa da subconta no boleto e no crédito. Um seller com tabela de crédito própria de 1x a 4x, numa subconta com tabela de 1x a 12x, paga a própria taxa de 1x a 4x e a da subconta de 5x a 12x. Antes de começar:- O seller precisa estar cadastrado na subconta em que você vai criar a regra. Seller de outra subconta, sem subconta ou de outro cliente responde
404comPLATFORM_FEE_SELLER_NOT_FOUND. - A flag de ativação continua sendo da subconta e vale para todos os sellers dela. Não existe flag por seller.
- Para ligar a taxa, a subconta precisa ter ao menos uma regra própria. Regras de seller não contam. Com a taxa ligada, a última regra da subconta não pode ser apagada: o
DELETEresponde400comPLATFORM_FEE_RULES_REQUIRED_WHILE_ENABLED.
Criando as regras de um seller
As regras do seller usam as mesmas formas de corpo das regras da subconta: regra avulsa,installmentRates, installments e fórmula, em array ou em objeto com a lista em rules, com o mesmo limite de 50 objetos. Como na subconta, paymentMethod: default é recusado com 400 e PLATFORM_FEE_DEFAULT_RULE_DISCONTINUED.
A diferença está no crédito: a regra do seller é só percentual por parcela. Qualquer fixedAmount diferente de 0 no crédito do seller recusa a requisição com 400. No Pix e no boleto, o seller aceita percentual, valor fixo ou os dois.
201, com as regras gravadas e um aviso fixo sobre assinaturas:
GET na mesma rota lista as regras próprias do seller, e o PUT altera as regras dele com as mesmas regras do PUT da subconta: a regra avulsa altera só os campos enviados, e a tabela de crédito substitui a tabela do seller inteira, sem mexer na da subconta. Consulte o contrato completo em Criar regras de platform fee do seller.
Isentando um seller ou devolvendo à regra da subconta
- Isentar num método: regra do seller com
percentage: 0efixedAmount: 0, os dois na mesma requisição. UmPUTsó compercentage: 0numa regra que tinha valor fixo continua cobrando o valor fixo. - Voltar à regra da subconta: apague a regra do seller pelo
id, comDELETE /v1/merchants/{merchantId}/platform-fee/{platformFeeId}. A mesma rota apaga regras da subconta e de seller.
Como a cobrança escolhe a regra de cada seller
Para cada seller do split, na ordem:- A regra do seller para o método e a parcela da cobrança.
- A regra da subconta para o método e a parcela. No crédito, sem regra para a parcela, vale a regra de crédito sem
installmentda subconta, quando ela existe. - Nenhuma: a cobrança é recusada com
422eplatform_fee_rule_not_configured, dizendo o seller, o método e a parcela.
Conta por seller
Quando algum seller da cobrança tem regra própria para o método e a parcela, a conta é feita seller a seller:- O percentual da regra incide sobre a parte bruta de cada seller, e a taxa de cada seller arredonda para baixo. O centavo do arredondamento fica com o seller.
- O valor fixo da regra do seller é cobrado inteiro dele.
- O valor fixo da regra da subconta é cobrado uma vez por cobrança e rateado, proporcional à parte bruta, só entre os sellers que usam a regra da subconta. O centavo que sobra do rateio fica com os sellers.
- Cada seller precisa receber ao menos R$ 0,01. Senão, a cobrança é recusada com
platform_fee_exceeds_amount.
Sem a regra do seller A, a mesma cobrança seguiria a conta de sempre, com a taxa da subconta sobre o valor total: R$ 1,39.
No boleto, com a subconta e o seller A cobrando R$ 1,09 fixos cada, A paga R$ 1,09 e os R$ 1,09 da subconta são rateados entre B e C: R$ 0,65 e R$ 0,43. O centavo que sobra do rateio não é cobrado, e a plataforma fica com R$ 2,17.
Split por percentual
Quando algum seller da cobrança tem regra própria para o método e a parcela, o split precisa ser por percentual. Split por valor nessa cobrança é recusado complatform_fee_requires_percentage_split. Sem regra de seller na cobrança, o split por valor continua como hoje.
Validações com a taxa ligada
Com a flag de ativação da subconta ligada, a cobrança com split também é recusada nestes casos:- Seller repetido (
platform_fee_duplicate_seller): o mesmo seller aparece em mais de uma linha do split. Some as partes numa linha só. - Seller fora da subconta (
platform_fee_seller_not_in_merchanteplatform_fee_seller_without_merchant): um seller do split está cadastrado em outra subconta ou não tem subconta. Cadastre-o na subconta da cobrança. - Split diferente entre provedores (
platform_fee_split_differs_by_provider): a cobrança manda a listaprovidere os provedores não têm o mesmo split. Conta como diferente ter outros sellers, os mesmos sellers com percentuais ou valores diferentes, ou um provedor sem split ao lado de outro com split. Mande o mesmo split para todos os provedores ou use só osplitRulesdo topo. - Seller que receberia menos de R$ 0,01 (
platform_fee_exceeds_amount): no split por percentual, depois da taxa, algum seller ficaria com menos de R$ 0,01. Aumente a parte dele ou o valor da cobrança, ou revise a regra.
A taxa na resposta da cobrança
O objetoplatformFee da cobrança mantém os campos de sempre e, quando algum seller tem regra própria, ganha lines, um item por seller, com a regra usada, a parte bruta, a taxa e o que ele recebe. Nesse caso, amount é a soma de lines[].feeAmount, e os campos do topo trazem a regra da subconta quando alguma linha a usa. Se nenhuma linha usa a regra da subconta, eles trazem a regra da primeira linha que tem regra. Cobranças sem regra de seller e cobranças antigas não têm lines. O platformFee do webhook 1.1 da cobrança traz os mesmos campos, com lines.
Trecho da resposta da cobrança Pix do exemplo acima:
Consultando as regras dos sellers
OGET /v1/merchants/{merchantId}/platform-fee traz, além das regras da subconta em rules:
sellerRules: um item por seller com ao menos uma regra própria, com as regras dele no mesmo formato derules.coverage.merchant.methodsecoverage.sellers[].methods: o estado depix,boletoe de cada faixa de parcelas decredit, para a subconta e para cada seller.
Um seller sem regra própria num método ou parcela em que a subconta está em
missing também aparece como missing, e não como inherits.
Trecho de coverage de uma subconta com Pix, boleto e crédito de 1x a 2x próprios, sem regra de 3x a 24x, e um seller com Pix e crédito 1x próprios:
simulationAmount, cada item de sellerRules ganha methods, com a taxa calculada como se o seller recebesse o valor simulado inteiro. Em cada método e parcela, scope diz se vale a regra do seller ou a da subconta.
Venda sem split
Com a taxa ligada, a cobrança semsplitRules, no topo e na lista provider, também paga a taxa da plataforma. A Malga usa como recebedor o único seller ativo da subconta, calcula a taxa como se ele recebesse o valor inteiro da cobrança e envia ao provedor o split com esse seller e o valor já líquido da taxa. A plataforma fica com a taxa.
- Seller ativo é o seller da subconta com status
activeoupartiale ao menos um provedor ativo. Ele também precisa estar ativo em cada provedor da cobrança. - A regra é escolhida como na cobrança com split: a regra do seller para o método e a parcela e, sem ela, a da subconta. Sem regra em nenhum nível, a cobrança é recusada com
platform_fee_rule_not_configured. Taxa maior ou igual ao valor da cobrança é recusada complatform_fee_exceeds_amount. - Na resposta,
splitRulestraz o seller comamountigual ao que ele recebe, eplatformFeetraz a taxa. Quando vale a regra própria do seller,platformFeetemlines, com uma linha. - A venda Apple Pay continua sem taxa.
- Com a taxa desligada, nada muda: a cobrança sem split segue sem taxa e sem split.
422 e platform_fee_seller_not_active, antes de ir ao provedor. error.context.reason diz o motivo, e error.context traz também paymentMethod e, no crédito, installment:
Para escolher quem recebe numa subconta com mais de um seller ativo, envie
splitRules na cobrança.
Exemplo de recusa numa subconta com dois sellers ativos:
Estornos
Em estornos totais ou parciais, oplatform-fee é revertido proporcionalmente ao valor estornado. A devolução de cada seller é proporcional ao que ele recebeu na cobrança, e a plataforma devolve o restante.
Exemplo:
- transação de R$ 1.000,00 com platformFee de 2% (plataforma reteve R$ 20,00, seller recebeu R$ 980,00).
- Estorno parcial de R$ 500,00:
- Plataforma devolve: R$ 10,00
- Seller devolve: R$ 490,00
Erros
Na configuração
Na cobrança
A recusa vem emerror.declined_code. Nas recusas de seller, error.details traz um texto em inglês com os valores, e error.context traz os mesmos valores em campos, para você montar a sua mensagem.
Exemplo de recusa por seller: