Vendas, comissões, participantes e assinaturas da plataforma
Parcela, tipo de compra, status e canal por referência
Nova x renovação, reembolso, canal e previsão de renovação
Painel de receitas, agente de IA e previsão do mês
O que resolve
- Venda nova, renovação e parcela seguinte separadas, sem contar a mesma compra várias vezes.
- Reembolso, afiliado e vendedor de cada venda decididos por uma regra única, que o time inteiro usa.
- Uma previsão de renovação do mês que não soma cancelados nem confunde atraso reagendado com inadimplência.
Perguntas de negócio que responde
Faça estas perguntas ao seu agente quando o caso estiver pronto.
O que você precisa
- Hotmart ou Eduzz conectado na Nekt, incluindo comissões, participantes e assinaturas de todas as contas
- Tabela de referência de produtos (curso e tipo de compra) e de vendedores e afiliados (código, conta e canal)
- Definição de qual valor vale como receita: bruto com imposto ou líquido do produtor
O que você recebe
- Uma tabela de compras com classificação, fase, canal, vendedor e valores em real
- A previsão de renovação por assinatura, com flag de considerar e moeda da assinatura
- Painel de receitas por curso, com reembolso na data da venda
- Um agente de IA que responde vendas e renovação com as regras aplicadas
Onde ativar
Vendas, faturamento, reembolso, nova x renovação e canal, com o mês fechado batendo ao centavo.
O responsável pela renovação pergunta pela previsão e pelo churn agendado do mês.
Realizado até ontem mais o projetado restante pela taxa de conversão, contra a meta.
As fontes são padrão, mas cada conta da plataforma é uma fonte e as tabelas de referência precisam de dono. O detalhado traz as regras de negócio, as armadilhas e o teste de aceitação. Ou mande tudo direto para o seu agente com o MCP da Nekt.
A plataforma devolve uma linha por parcela ou cobrança, com status em várias grafias e sem data do reembolso. Quem soma as linhas conta a mesma compra várias vezes, mistura renovação com venda nova e leva para a receita até venda cancelada. A previsão de renovação, vinda de um export manual, soma assinaturas canceladas e trata como real a moeda de quem paga em euro.
Como costuma ser feito, e a regra
Cada linha é um erro que já aconteceu na prática.
O grão é a parcela ou cobrança. Venda = código de transação distinto com a primeira parcela aprovada (`purchase.recurrency_number` vazio ou 1). As parcelas seguintes são continuação: entram no recebido do mês, nunca como venda nova. Vendas, clientes e reembolsos são contagens distintas e não se somam entre meses, cursos ou canais: recalcule no recorte pedido.
Venda válida = `purchase.status` APPROVED ou COMPLETE: a plataforma passa de APPROVED para COMPLETE ao fim da garantia. Reembolso = REFUNDED e CHARGEBACK. Quando os status chegam em grafias mistas (português e inglês), use flags calculadas uma vez e nunca filtre por literal. A consulta de histórico sem filtro de status devolve só aprovadas e completas: peça os demais status explicitamente para enxergar reembolso e cancelamento. Nunca some valor sem filtro de status.
A classificação vem da tabela de referência de produtos (tipo de compra de cada id de produto) e do número da parcela: parcela seguinte = continuação; primeira parcela de produto de renovação = renovação; produto de taxa inicial = taxa inicial; o resto = compra nova. Primeira compra é a primeira vez daquela pessoa naquele produto, não cliente novo na escola. Um curso pode ter vários ids de produto (à vista, assinatura, 6 e 12 meses): não deduplique por nome.
A plataforma não grava a data do reembolso: o estorno vira status na linha da venda original. Reembolso é contado no mês da venda, e o número de um mês continua crescendo por semanas depois que ele acaba. Compare meses com a mesma idade e diga isso. Para acompanhar a maturação, use fases: aprovada, garantia da plataforma cumprida (`warranty_expire_date`), consolidada pela regra da casa (por exemplo, 30 dias da aprovação) e reembolsada.
Ordem de decisão: 1) afiliado da venda (o cookie, em `hotmart_sales_participants` com papel AFFILIATE) se a conta estiver na referência como comercial, ex-vendedor ou afiliado externo; 2) código de vendedor encontrado no `tracking.source_sck`; 3) senão, marketing, inclusive venda sem sck. Grave o motivo (afiliado, sck, os dois, cookie contra sck) e o vendedor que decidiu. A lista de códigos e contas mora na tabela de referência, nunca no código da transformação. Afiliado fora da lista conta como marketing.
O comercial também vende lançamento e renovação. A oferta de origem (perpétuo, lançamento, webinário, live, renovação, orgânico) é outra coluna, derivada do padrão do sck. No funil, resuma em direta (oferta do próprio funil), indireta (lançamento e eventos), renovação e não identificada. Quando a venda indireta aparece num funil, o custo do lançamento não está na conta desse funil: diga isso.
Bruto = preço da transação convertido para real: BRL direto, EUR pela PTAX do dia, outras moedas pela taxa da plataforma para dólar vezes a PTAX do dólar. Líquido = comissão do produtor (`hotmart_sales_commission`, fonte PRODUCER), o que fica para a escola. Escolha uma régua para faturamento e ROAS e declare. Contratado (preço x parcelas na primeira parcela do parcelamento) é diferente de recebido no mês, e parcelas futuras não estão na base.
Grão: uma linha por assinatura, de todas as contas. Considerar = status ACTIVE, DELAYED ou OVERDUE e produto marcado para considerar. Projetado = soma de `price.value` das assinaturas consideradas por mês de `date_next_charge`, na moeda da assinatura (`price.currency_code`), nunca na moeda da última transação. Churn agendado = não considerar. Declare o denominador: só ativas ou ativas mais atraso. Atraso não é fila de cobrança: DELAYED já tem a próxima cobrança reagendada; a fila real é a próxima cobrança até hoje.
A tabela de previsão é sobrescrita a cada execução: grave a data da foto em coluna. Para série histórica, grave em modo append com a data da foto, e nunca some fotos diferentes. Forecast do mês = realizado até ontem + projetado restante x taxa de conversão (realizado / projetado até ontem). No começo do mês, a taxa de 3 ou 4 dias é instável: use a taxa fechada do mês anterior até por volta do dia 10. Repasse contratado que entra como assinatura fica fora da taxa.
Cancelamento = status CANCELLED_BY_CUSTOMER, CANCELLED_BY_SELLER ou CANCELLED_BY_ADMIN, com a data em `end_accession_date`. Filtre pelo status, nunca por ter data: assinaturas reativadas também trazem a data. Segmente por quem cancelou: um lote cancelado pelo admin é evento operacional, não churn. Contas lidas por duas fontes geram a mesma assinatura e a mesma transação duas vezes: deduplique por código.
Status da assinatura e previsão de renovação
Status da plataforma e onde cada um entra.
Definições
Armadilhas que já aconteceram
Uma medida de faturamento do painel não filtrava status e somava uma transação cancelada com valor na casa dos trilhões, além de vendas estornadas.
Todo valor passa pelo filtro de status válido, inclusive em medidas derivadas.
A moeda vinha da última transação da assinatura. O cruzamento falhava em mais da metade das linhas e o padrão BRL transformava assinaturas em euro e dólar em real.
Use a moeda da própria assinatura (price.currency_code), sempre preenchida.
Duas fontes apontavam para a mesma conta da plataforma e cerca de 15% das linhas da previsão eram duplicata exata.
Deduplique por código da transação e da assinatura depois de unir as contas.
O relatório de previsão exportado à mão ficava 33% a 56% acima do que a API mostrava, e era tratado como a verdade.
Automatize pela API e, onde divergir, investigue o export antes de ajustar o número.
Contar todo atraso como fila de cobrança superestimou a fila em 3,7 vezes: a maior parte já tinha a próxima cobrança reagendada para o futuro.
Fila = OVERDUE ou próxima cobrança até hoje; DELAYED reagendado fica separado.
Numa conta, várias assinaturas vinham com valor de R$ 1,00 e a previsão daquele curso por valor não fazia sentido.
Liste cursos com valor de assinatura fora da faixa do preço e use contagem até corrigir na origem.
Teste de aceitação
O caso está pronto quando todos os itens passam.
- Para um mês fechado, vendas, faturamento, clientes compradores e reembolsos batem ao centavo com o relatório oficial da plataforma ou do painel validado.
- Compra nova + renovação + continuação + taxa inicial = total de transações válidas do período.
- Nenhuma assinatura cancelada entra no projetado, e a previsão tem uma linha por assinatura depois da deduplicação.
- Toda venda tem canal e motivo de canal; nenhuma venda cujo afiliado está na referência como vendedor cai em marketing.
- Recalculado 30 dias depois, o reembolso de um mês é igual ou maior que antes, nunca menor.
Pacote para o agente
Cole no Claude, ChatGPT ou outro cliente com o MCP da Nekt conectado.
Infoprodutos e renovação - Grão: transação (parcela). Venda = transação distinta da primeira parcela (recurrency_number vazio ou 1) com status APPROVED ou COMPLETE. Parcelas seguintes = continuação. - Reembolso = REFUNDED ou CHARGEBACK, contado no mês da venda. A data do reembolso não existe. O reembolso de meses recentes ainda vai crescer: comparar meses na mesma idade. - Classificação pela referência de produtos <tabela>: continuação, renovação, taxa inicial ou compra nova. Primeira compra = primeira vez naquele produto, não cliente novo. - Canal: 1) afiliado da venda na referência de vendedores; 2) código de vendedor no sck; 3) marketing. Usar a coluna canal_venda; não recalcular pelo sck. Canal não é oferta de origem. - Valor: <régua oficial: bruto com imposto ou líquido do produtor>, em real. EUR pela PTAX do dia; outras moedas pela taxa da plataforma para USD x PTAX USD. - Não somar valor sem filtro de status. Vendas, clientes e reembolsos não se somam entre linhas. - Previsão de renovação: só considerar = true (ACTIVE, DELAYED, OVERDUE e produto marcado). Valor = price.value; moeda = price.currency_code da assinatura; eixo = date_next_charge. Churn agendado = considerar = false. - Declarar o denominador do forecast (só ativas ou ativas + atraso). Fila de cobrança = próxima cobrança até hoje. - A previsão é uma foto diária: usar uma foto por consulta e declarar a data dela. - Cancelamento = status CANCELLED_*, data em end_accession_date, separado por quem cancelou. - Responder com totais. Dados de comprador só dentro da consulta. Exceções por cliente: - <cliente>: a previsão de renovação é liberada só para <responsável>. - <cliente>: o curso <curso> tem valor de assinatura quebrado na origem; usar contagem, não valor. - <cliente>: pagamentos por <meio fora da plataforma> não estão na base.
Construa no meu workspace Nekt o caso "Infoprodutos e renovação" seguindo as regras em https://academy.nekt.com/industrias/educacao/infoprodutos-renovacao.md. 1) Encontre as tabelas de origem e confirme as colunas usadas pelas regras. 2) Crie uma transformação no grão indicado aplicando todas as regras. 3) Rode o teste de aceitação e me mostre o resultado de cada item. 4) Crie o context document do caso no workspace, com as exceções dos meus clientes em aberto para eu preencher.
Variações
Produtos do tipo ticket; evento pelo nome antes do separador, com de-para de grafias; cortesia x pago pelo tipo de pagamento; fora de receita recorrente.
Sequência de programas comprados por quem entrou nos funis, da isca até o programa principal.
Quantos compram depois da sessão estratégica, em quanto tempo e com que ticket, casando agenda e comprador por e-mail.