Pagamento recorrente no HeroPay é um link de pagamento com periodicidade: você envia period no POST /payment_links e o link vira uma assinatura mensal, trimestral, semestral ou anual, cobrada no cartão, no boleto ou por Pix Automático, com renovação ilimitada ou por número de ciclos. A cobrança recorrente de cada ciclo, a retentativa de falhas, a troca de cartão pelo próprio assinante e os avisos por evento já vêm prontos; você libera e suspende acesso pelos webhooks e cancela por API. Serve para SaaS, micro-SaaS, clubes, comunidades e mentorias. Não há preço à parte para assinatura: cada cobrança paga a tarifa normal, Pix R$ 0, boleto R$ 0 e cartão 3,49% por transação aprovada (ver preços).
Criar conta sandbox Ler a documentação
O essencial em 60 segundos
- No HeroPay, uma assinatura é um link de pagamento com o campo
period(monthly,quarterly,semiannualouannual); semperiod, o link é de pagamento único. - A renovação pode ser ilimitada ou ter fim:
frequency_type: "unlimited"cobra até o cancelamento;"limited"comfrequency_limit: 12encerra a assinatura sozinha depois de 12 cobranças. - A recorrência do HeroPay aceita cartão de crédito, boleto e Pix Automático, em que o assinante autoriza uma vez no app do banco e o Pix de cada ciclo cai sem ele precisar pagar de novo.
- Churn involuntário é o assinante que queria continuar e caiu por falha de pagamento; o HeroPay ataca isso com retentativa automática da cobrança, troca de cartão self-service, três métodos na mesma assinatura e avisos por evento (recusa, vencimento, chargeback, estorno).
- Assinatura não tem mensalidade nem taxa extra: cada cobrança paga Pix R$ 0, boleto R$ 0 ou cartão 3,49%, e cobrança recusada não paga tarifa.
- Todo o ciclo chega por webhook assinado com HMAC:
subscription_activate,subscription_update,subscription_cancel,spark_payment_confirmedepayment_credit_cart_refused. - Para o seu BI,
GET /sales/recurringlista as assinaturas com status, periodicidade e cada tentativa de cobrança, ePOST /recurring_payment/cancelcancela uma assinatura por API.
O que é pagamento recorrente e como funciona no HeroPay?
Pagamento recorrente é a cobrança automática de um valor fixo em intervalos definidos, enquanto o contrato estiver ativo: o cliente autoriza uma vez e não precisa pagar manualmente a cada mês. No HeroPay, o fluxo do dinheiro tem cinco passos:
- Você cria o plano. Um
POST /payment_linkscomprice_cents,periode a regra de renovação devolve a URL do checkout da assinatura. - O assinante paga o primeiro ciclo no checkout. No cartão, o número é tokenizado no checkout hospedado (você não toca no cartão); no Pix Automático, ele autoriza a recorrência no app do banco; no boleto, recebe o documento do ciclo. O primeiro pagamento confirmado ativa a assinatura e dispara
subscription_activate. - O HeroPay cobra cada ciclo sozinho. Na data da renovação, o cartão tokenizado é cobrado, o Pix Automático é debitado ou o boleto do ciclo é emitido. Cada pagamento confirmado dispara
spark_payment_confirmedesubscription_update, e o valor entra no seu saldo. - Se a cobrança falha, a recuperação começa. O HeroPay reprocessa a cobrança automaticamente, avisa você por
payment_credit_cart_refused(com o motivo da operadora) e o assinante pode trocar o cartão sem falar com o seu suporte. - A assinatura termina por uma de quatro portas: cancelamento por você (API ou painel), pelo assinante, por estorno ou chargeback, ou ao atingir o limite de atrasos configurado. Em qualquer caso chega
subscription_cancele o histórico de cobranças fica preservado.
Cada tentativa de cobrança de uma assinatura fica registrada e aparece na listagem GET /sales/recurring, para você acompanhar a recuperação sem depender de planilha.
Quais ciclos e regras de renovação posso configurar?
Campo no POST /payment_links | Valores | O que faz |
|---|---|---|
period | monthly, quarterly, semiannual, annual | Periodicidade da cobrança. Ausente = pagamento único (unitary) |
frequency_type | unlimited (padrão), limited | Renova até o cancelamento ou por um número fechado de ciclos |
frequency_limit | inteiro a partir de 1 | Número de cobranças até o encerramento automático. Obrigatório com limited |
payment_methods | credit_card, bank_slip, pix | Métodos aceitos na assinatura (Pix = Pix Automático) |
price_cents | a partir de 500 | Valor de cada ciclo, em centavos (mínimo R$ 5,00) |
src | texto até 255 caracteres | Origem da venda; volta em cart.src em todo webhook do assinante |
Fonte: referência OpenAPI v1 do HeroPay, Criar link de pagamento. Verificado em setembro de 2026.
Exemplos de configuração: plano mensal de SaaS = monthly + unlimited; mentoria de 12 meses = monthly + limited + frequency_limit: 12; anuidade de comunidade = annual + unlimited.
Trocar de plano no meio do ciclo, com pró-rata, não faz parte da API v1: para mudar de plano, cancele a assinatura atual e o cliente assina o plano novo pelo link correspondente. Os detalhes estão em limites.
Na prática, por código
1. Crie o plano
curl -X POST "$HEROPAY_API_URL/payment_links" \
-H "Authorization: Bearer $HEROPAY_JWT_TOKEN" \
-H "Accept: application/vnd.herospark.com; version=1" \
-H "Content-Type: application/json" \
-d '{
"payment_link": {
"name": "Plano Pro mensal",
"description": "Acesso ao Plano Pro, cobrado todo mês",
"price_cents": 9700,
"absorbs_fees": true,
"period": "monthly",
"frequency_type": "unlimited",
"payment_methods": ["credit_card", "pix", "bank_slip"],
"src": "pricing-page"
}
}'Resposta 201 Created:
{
"message": "Payment link created successfully",
"data": {
"id": 137,
"name": "Plano Pro mensal",
"description": "Acesso ao Plano Pro, cobrado todo mês",
"price_cents": 9700,
"absorbs_fees": true,
"max_installments": 1,
"period": "monthly",
"frequency_type": "unlimited",
"frequency_limit": null,
"overdue_type": "none",
"overdue_limit": null,
"public_id": "fc280e25-7cbd-446f-b34f-5b8824bb5124",
"offer": {
"id": 6095,
"kind": "payment_link",
"url": "https://pay.beta.herospark.com/fc280e25-7cbd-446f-b34f-5b8824bb5124-6095?src=pricing-page",
"accepted_payment_methods": ["credit_card", "pix", "bank_slip"]
},
"created_at": "2026-09-23T10:07:01.929-03:00",
"updated_at": "2026-09-23T10:07:01.929-03:00"
}
}data.offer.url é o checkout da assinatura, hospedado em domínio de pagamento da HeroSpark (no exemplo, o do sandbox): coloque no botão "Assinar" da sua página de preços. Para uma mentoria de 12 meses, troque por "frequency_type": "limited" e "frequency_limit": 12.
2. Escute o ciclo de vida por webhook
Cadastre um webhook por gatilho com POST /webhook. Para assinatura, os cinco que importam:
| Gatilho | Quando dispara | O que o seu sistema faz |
|---|---|---|
subscription_activate | Primeiro pagamento confirmado | Cria a conta e libera o acesso |
spark_payment_confirmed | Cada cobrança paga (inclusive renovações) | Registra o pagamento, estende o acesso |
payment_credit_cart_refused | Cartão recusado na renovação | Mostra aviso no app, lê o motivo em payment_methods.credit_card.refused_message |
subscription_update | Mudança de status ou novo pagamento | Sincroniza o status da assinatura no seu banco |
subscription_cancel | Cancelada por você, pelo assinante, estorno, chargeback ou limite de atrasos | Suspende o acesso |
curl -X POST "$HEROPAY_API_URL/webhook" \
-H "Authorization: Bearer $HEROPAY_JWT_TOKEN" \
-H "Accept: application/vnd.herospark.com; version=1" \
-H "Content-Type: application/json" \
-d '{
"webhook": {
"trigger": "subscription_cancel",
"webhook_url": "https://seuapp.com/webhooks/heropay",
"request_method": "post"
}
}'O payload segue o template padrão, com os blocos buyer, payment, offer, product, cart (com cart.src), subscription (ID, status e datas), installments e payment_methods. Valide o header X-HeroPay-Signature (HMAC SHA-256 do corpo bruto) antes de agir e deduplique por pagamento + gatilho, porque a retentativa do webhook pode entregar o mesmo evento duas vezes. Confie no evento, não no polling. Detalhes em /webhooks.
Antes de ir para produção, dispare um ciclo completo no sandbox (ativação, renovação e cancelamento) e use os payloads recebidos como referência exata dos campos de subscription.
3. Cancele por API
curl -X POST "$HEROPAY_API_URL/recurring_payment/cancel" \
-H "Authorization: Bearer $HEROPAY_JWT_TOKEN" \
-H "Accept: application/vnd.herospark.com; version=1" \
-H "Content-Type: application/json" \
-d '{ "recurring_payment": { "recurring_payment_id": 3020 } }'Resposta 200 OK (trecho):
{
"message": "Recurring payment cancelled successfully",
"data": {
"id": 3020,
"status": "cancelled",
"period": "monthly",
"payment_method": "credit_card",
"credit_card_masked_number": "**** **** **** 4644",
"amount": 30000,
"total_collected": 30000,
"next_invoice_at": "2025-09-18",
"canceled_by": "buyer",
"subscription_type": "recurrency"
}
}O cancelamento é imediato e irreversível: não há cobrança futura, o histórico é mantido e só assinaturas com status active podem ser canceladas (a segunda chamada responde 400). Para reativar, o cliente assina de novo pelo link.
4. Puxe as assinaturas para o seu BI
curl -G "$HEROPAY_API_URL/sales/recurring" \
-H "Authorization: Bearer $HEROPAY_JWT_TOKEN" \
-H "Accept: application/vnd.herospark.com; version=1" \
--data-urlencode "paymentStatus[]=paid" \
--data-urlencode "paymentMethod[]=credit_card" \
--data-urlencode "limit=1000" \
--data-urlencode "skip=0"{
"data": {
"sales": [
{
"buyer": { "fullName": "Maria Silva", "email": "maria@example.com" },
"cart": { "cartId": 54321, "subscriptionId": "sub-123", "subscriptionStatus": "active" },
"coupon": { "couponCode": "RECORRENTE20", "couponValue": 30.0 },
"periodicity": "monthly",
"purchases": [
{ "purchaseId": "uuid-456", "unifiedStatus": "paid", "paymentMethod": "credit_card" }
]
}
],
"totalCount": 1
},
"message": "Vendas encontradas com sucesso"
}Cada item traz o status da assinatura (cart.subscriptionStatus), a periodicidade e a lista purchases, com cada tentativa de cobrança daquela assinatura. Pagine de 10 a 1.000 itens por chamada com skip e limit; filtre por status do pagamento, método, data de criação ou nome e e-mail do comprador. Para calcular MRR, some as assinaturas ativas normalizando pela periodicidade (anual dividido por 12, semestral por 6, trimestral por 3). Para números prontos, os relatórios /reports/purchase/subscriptions/* devolvem receita bruta, líquida e após taxas, contagem por status, vendas mensais e mais vendidos, e /reports/purchase/refused/reasons_count mostra por que os cartões estão sendo recusados.
O MRR não vem pronto como métrica da API: você calcula no seu BI com esses dados.
Por prompt: a assinatura criada com a sua ferramenta de IA
Cole https://heropay.tech/llms.txt na conversa com Claude, ChatGPT, Cursor, Lovable e outros, e o plano sai de uma frase em português:
Com base em https://heropay.tech/llms.txt, escreva o código que cria no
HeroPay um plano "Pro mensal" de R$ 97 com renovação ilimitada, aceitando
cartão, Pix Automático e boleto, com src "pricing-page". Depois cadastra
webhooks de subscription_activate e subscription_cancel apontando para
https://seuapp.com/webhooks/heropay e imprime a URL do checkout.O código gerado chama POST /payment_links com period: "monthly" e frequency_type: "unlimited", cadastra os dois webhooks e devolve o link, com a sua chave lida do ambiente, nunca colada no chat. Um MCP server oficial está em desenvolvimento; hoje o caminho é llms.txt, docs abertas e API REST. Veja /ai.
O que é churn involuntário e quanto ele custa em reais?
Churn involuntário é o cancelamento que ninguém pediu: o assinante queria continuar, mas o cartão expirou, estourou o limite, foi bloqueado ou o boleto passou do vencimento. Diferente do churn voluntário (o cliente decidiu sair), ele é quase todo recuperável, porque o problema é o meio de pagamento, não o produto.
A conta, com números redondos:
| Cenário (12 meses) | Sem recuperação nenhuma | Se metade das falhas for recuperada (hipótese) |
|---|---|---|
| Base inicial | 100 assinantes × R$ 97 = R$ 9.700 de MRR | 100 assinantes × R$ 97 = R$ 9.700 de MRR |
| Falha de pagamento que vira cancelamento | 5% ao mês | 2,5% ao mês |
| Perda só no primeiro mês | R$ 485 | R$ 242,50 |
| Assinantes ativos no mês 12 | 54 | 74 |
| MRR no mês 12 | R$ 5.241,49 | R$ 7.158,58 |
| Receita que deixou de entrar no ano | R$ 27.229,86 | R$ 14.743,36 |
Premissas: sem novas vendas, sem churn voluntário, toda falha não recuperada vira cancelamento no mesmo mês, perda composta mês a mês. A coluna da direita é uma hipótese para mostrar a sensibilidade, não uma taxa de recuperação prometida pelo HeroPay.
Leitura: 5 recusas por mês parecem pouco (R$ 485), mas em um ano elas levam quase metade da base e R$ 27 mil de receita, sem nenhum cliente ter decidido sair. Recuperar metade das falhas devolve R$ 12.486,50 no ano para a mesma base. É por isso que retentativa e troca de cartão pesam mais no MRR do que meio ponto de taxa.
Como o HeroPay reduz o churn involuntário?
Reprocessamento automático da cobrança. Quando a renovação falha, o HeroPay tenta de novo sozinho, sem você escrever job de retentativa. As tentativas que falham não pagam tarifa: a taxa do cartão incide só sobre transação aprovada. As bandeiras limitam quantas vezes o mesmo cartão pode ser retentado (a Vindi documenta, por exemplo, até 15 retentativas em 30 dias na Visa e intervalo mínimo de 24 horas na Mastercard para recorrência), e recusas irreversíveis, como cartão cancelado, não devem ser retentadas. Por isso a retentativa sozinha não basta.
Plano anual sem estourar o limite. Em ticket alto, o problema costuma ser limite, não cartão inválido. Para o plano anual, dá para oferecer também uma venda avulsa parcelada no checkout, onde o Parcelamento Inteligente recupera a recusa por limite com até 3 retentativas por parcela.
Troca de cartão self-service. Para cartão expirado, bloqueado ou substituído, retentar não resolve: é preciso um cartão novo. O assinante troca o cartão sozinho, pela recuperação de vendas do checkout, sem abrir ticket e sem você construir tela de "atualizar forma de pagamento".
Três métodos na mesma assinatura. Quem não quer (ou não pode) deixar cartão assina por Pix Automático, que não expira, não tem limite de cartão e custa R$ 0 por cobrança; ou por boleto, também R$ 0.
Motivo da recusa em mãos. O webhook payment_credit_cart_refused traz o motivo da operadora e o relatório de recusadas agrupa os motivos, para você saber se o problema é limite, cartão vencido ou antifraude.
Como montar uma régua de cobrança com o HeroPay?
Régua de cobrança é a sequência programada de avisos e ações antes e depois do vencimento: lembrar antes, avisar no dia, recuperar depois. No HeroPay, a régua é montada por gatilhos por evento: recusa, vencimento, chargeback e estorno disparam automações de e-mail ou webhook, e você decide o que acontece em cada degrau.
| Momento | Gatilho no HeroPay | Ação sugerida |
|---|---|---|
| Antes do vencimento | Gatilho de vencimento nas automações do HeroPay | "Sua assinatura renova em breve" com o link do boleto ou o aviso do Pix Automático |
| Boleto emitido | spark_payment_boleto_created | Envie o boleto pelo seu canal (WhatsApp, e-mail, app) |
| Cartão recusado | payment_credit_cart_refused | Aviso no app e e-mail pedindo para o assinante atualizar o cartão; o HeroPay já está retentando |
| Pagou depois da recusa | spark_payment_confirmed + subscription_update | Remova o aviso, mantenha o acesso |
| Limite de atrasos atingido | subscription_cancel | Suspenda o acesso e dispare a oferta de volta |
| Chargeback | chargeback_request | Bloqueie o acesso e acione o time |
Quem já tem CRM ou ferramenta de e-mail pluga a régua pelos webhooks; quem não tem usa as automações do próprio HeroPay. O guia de cobrança recorrente para SaaS aprofunda o passo a passo.
Casos de uso
Micro-SaaS com plano mensal e anual. Dois links: monthly a R$ 97 e annual a R$ 970. Com 200 assinantes mensais no cartão, cada cobrança paga R$ 3,39 de tarifa (3,49% de R$ 97), R$ 678 por mês no total. Se metade migrar para o Pix Automático, essa metade passa a pagar R$ 0 e a conta cai para R$ 339 por mês, ou R$ 4.068 por ano a mais no seu caixa, com os mesmos clientes.
Mentoria de 12 meses. Um link monthly + limited + frequency_limit: 12 a R$ 497. A assinatura encerra sozinha na 12ª cobrança, sem você lembrar de cancelar ninguém. Pagando por Pix Automático, os R$ 5.964 do contrato entram inteiros, sem tarifa por cobrança; no cartão, a tarifa é de R$ 17,35 por mês.
Clube ou comunidade com base que paga por boleto. Parte do público não tem cartão com limite sobrando. Com boleto a R$ 0 e spark_payment_boleto_created alimentando o WhatsApp do clube, o boleto chega onde o assinante lê, e o lembrete de vencimento reduz o atraso antes de ele virar cancelamento.
Como o HeroPay se compara em recorrência?
| Recurso | HeroPay | Stripe Billing | iugu | Vindi | AbacatePay |
|---|---|---|---|---|---|
| Métodos na recorrência | Cartão, boleto e Pix Automático | Cartão e métodos locais conforme o país | Cartão, boleto e Pix | Cartão, boleto, Pix e outros | Pix Automático mediante habilitação, cartão |
| Retentativa automática | Sim, retentativa automática da cobrança | Smart Retries com IA, padrão recomendado de 8 tentativas em 2 semanas | Sim | Retentativa Simples, padrão a cada 3 dias por 5 vezes; retentativa em outro cartão do cliente | Não verificado |
| Troca de plano com pró-rata | Não na v1 | Sim | Sim (upgrade e downgrade com pró-rata, ou skip_charge) | Não verificado | Sim (troca de plano) |
| Período de teste (trial) | Não na v1 | Sim | Não verificado | Não verificado | Sim |
| Taxa extra pela recorrência | Não | Sim (Billing é cobrado à parte) | Sob consulta | Sob consulta | Não verificado |
Verificado em setembro de 2026. Fontes: Stripe Smart Retries · iugu, alterar assinatura · iugu, cobranças recorrentes · Vindi, plataforma de recorrência · Vindi, Retentativa Simples · Vindi, retentativa com troca de perfil · AbacatePay docs. "Não verificado" = não conferimos na fonte oficial nesta data.
Onde os outros são melhores, sem rodeio: o Stripe Billing e a iugu têm troca de plano com pró-rata documentada, e o Stripe e a AbacatePay têm período de teste e cobrança por uso. Se o seu modelo depende de upgrade no meio do ciclo ou de cobrança por consumo, confira isso antes de migrar. Veja também Stripe vs HeroPay e AbacatePay vs HeroPay.
Limites e regras honestas
- Valor mínimo de R$ 5,00 por ciclo (
price_centsa partir de500). - Pagamento internacional não vale para link recorrente:
enable_international_salessó funciona em link avulso. - Sem troca de plano pela API na v1: para mudar de plano, cancele e crie uma nova assinatura no plano novo. Pró-rata não existe hoje.
- Sem período de teste (trial) e sem cobrança por uso na v1: o valor é fixo por ciclo.
- Cancelamento é imediato e irreversível. Não existe "cancelar no fim do período" pela API; se quiser manter o acesso até o fim do ciclo pago, controle isso do seu lado com a data do último pagamento.
- Sem header
Idempotency-Key: duas chamadas iguais dePOST /payment_linkscriam dois planos. Grave oidantes de repetir. - Sem troca de cartão pela API: a troca é feita pelo assinante no fluxo self-service, não por endpoint seu.
Perguntas frequentes sobre assinaturas e pagamento recorrente
Como criar uma assinatura recorrente pela API do HeroPay?
Envie period no POST /payment_links, com monthly, quarterly, semiannual ou annual, junto com price_cents em centavos e absorbs_fees. Sem period, o link é de pagamento único. A resposta traz em data.offer.url o checkout da assinatura, que você coloca no botão "Assinar". O primeiro pagamento confirmado ativa a assinatura e dispara o webhook subscription_activate; daí em diante o HeroPay cobra cada ciclo sozinho. Teste tudo no sandbox gratuito, em api.beta.heropay.tech, e vá para produção trocando a chave. O passo a passo com curl está nesta página e na documentação de modelos de pagamento.
Qual a diferença entre pagamento recorrente e cobrança recorrente?
Na prática, são o mesmo processo visto de lados diferentes. Cobrança recorrente é o que a empresa faz: emitir a cobrança de um valor fixo em intervalos definidos, enquanto o contrato estiver ativo. Pagamento recorrente é o que o cliente vive: autorizar uma vez e pagar automaticamente a cada ciclo, sem repetir o processo. Os dois dependem de um sistema de assinaturas que guarde a autorização (cartão tokenizado, Pix Automático ou emissão de boleto), dispare a cobrança na data certa e trate as falhas. No HeroPay, isso é um link de pagamento com periodicidade, cobrado no cartão, no boleto ou por Pix Automático.
Assinatura no HeroPay aceita Pix e boleto ou só cartão?
Aceita os três. A recorrência do HeroPay funciona no cartão de crédito, no boleto e no Pix, e a assinatura via Pix usa o Pix Automático: o assinante autoriza a recorrência uma vez no app do banco e as cobranças seguintes são debitadas sem ele precisar pagar de novo. O Pix Automático é regulado pelo Banco Central, está disponível desde junho de 2025 e, por regra do BC, exige recebedor com CNPJ; cartão e boleto funcionam também para conta com CPF ou MEI. Pix e boleto custam R$ 0 por cobrança; o cartão custa 3,49% por transação aprovada. Oferecer os três na mesma assinatura também reduz churn involuntário, porque quem não tem limite no cartão tem para onde ir.
O que é churn involuntário e como evitar?
Churn involuntário é quando o assinante sai sem querer sair: o cartão expirou, estourou o limite, foi bloqueado ou o boleto venceu. Ele se evita com quatro frentes: retentar a cobrança automaticamente nos casos recuperáveis, facilitar a troca de cartão quando retentar não resolve, oferecer métodos que não dependem de cartão (como Pix Automático) e avisar o cliente antes e depois do vencimento com uma régua de cobrança. Numa base de 100 assinantes de R$ 97 com 5% de falha por mês, deixar isso sem tratamento custa cerca de R$ 27 mil em um ano. O HeroPay entrega as quatro frentes prontas, sem código de retentativa do seu lado.
O que é régua de cobrança?
Régua de cobrança é a sequência programada de comunicações e ações em torno do vencimento de uma cobrança: um lembrete antes, um aviso no dia e uma recuperação escalonada depois, até a suspensão. Serve para reduzir inadimplência em negócios recorrentes sem depender de alguém cobrar manualmente. No HeroPay, a régua é montada por gatilhos por evento, como lembrete de vencimento, boleto emitido, cartão recusado, chargeback e assinatura cancelada, que disparam e-mail ou webhook. Você pode usar as automações do HeroPay ou plugar os webhooks no seu CRM, WhatsApp ou ferramenta de e-mail.
O que acontece quando o cartão do assinante é recusado na renovação?
O HeroPay reprocessa a cobrança automaticamente e você recebe o webhook payment_credit_cart_refused, com o motivo informado pela operadora em payment_methods.credit_card.refused_message. As tentativas recusadas não pagam tarifa. Se o problema for cartão vencido ou bloqueado, o assinante pode trocar o cartão sozinho no fluxo self-service, sem abrir chamado. Quando a cobrança é paga, chegam spark_payment_confirmed e subscription_update e a assinatura segue. Se o limite de atrasos configurado for atingido sem pagamento, a assinatura é cancelada e chega subscription_cancel, para você suspender o acesso.
Como cancelar uma assinatura pela API?
Chame POST /recurring_payment/cancel com { "recurring_payment": { "recurring_payment_id": <id> } }. O cancelamento é imediato: não haverá novas cobranças, o histórico de pagamentos é preservado e o status passa a cancelled. A resposta informa quem cancelou (canceled_by), o total já cobrado (total_collected) e a data da próxima cobrança que deixou de existir. Só assinaturas ativas podem ser canceladas; chamar de novo numa já cancelada responde 400. O cancelamento não pode ser desfeito: para voltar, o cliente assina de novo pelo link. O webhook subscription_cancel avisa o seu sistema em qualquer cancelamento.
Consigo calcular MRR e churn com os dados do HeroPay?
Sim, pela API. GET /sales/recurring lista as assinaturas com status, periodicidade, cupom e cada tentativa de cobrança, paginando até 1.000 itens por chamada e filtrando por status de pagamento, método e data. Para o MRR, some as assinaturas ativas normalizando pela periodicidade (anual dividido por 12, semestral por 6, trimestral por 3). Os relatórios /reports/purchase/subscriptions/* devolvem receita bruta e líquida de recorrência, contagem por status e vendas mensais, e /reports/purchase/refused/reasons_count mostra os motivos de recusa. O MRR não vem pronto como métrica: você calcula no seu BI com esses dados.
Dá para fazer upgrade ou downgrade de plano com pró-rata?
Não na v1 da API. Hoje não existe endpoint para trocar o plano de uma assinatura ativa nem cálculo de pró-rata. O caminho é cancelar a assinatura atual com POST /recurring_payment/cancel e o cliente assinar o novo plano pelo link correspondente; se quiser compensar dias não usados, faça isso com cupom ou desconto no plano novo. Se upgrade no meio do ciclo é central para o seu produto, gateways como Stripe Billing e iugu documentam troca de plano com pró-rata, e vale comparar.
Quanto custa cobrar assinatura no HeroPay?
Não há mensalidade, taxa de ativação nem cobrança extra por usar recorrência. Cada ciclo paga a tarifa normal da transação aprovada: Pix Automático R$ 0, boleto R$ 0 e cartão 3,49%. Numa assinatura de R$ 97 no cartão, a tarifa de cada cobrança é de R$ 3,39; no Pix ou no boleto, R$ 0, e os R$ 97 entram inteiros. Cobranças recusadas não pagam tarifa, então a retentativa não gera custo nas tentativas que falham. A tabela completa e a comparação com outros gateways estão em /precos.
Posso criar uma assinatura com número fixo de parcelas, como 12 meses?
Pode. Use frequency_type: "limited" com frequency_limit: 12 e period: "monthly": o HeroPay cobra 12 vezes e encerra a assinatura sozinho, sem você precisar cancelar. É o formato de mentoria, curso com duração fechada e contrato de serviço anual pago mês a mês. Se mandar limited sem frequency_limit, a API responde erro de validação. Para renovação até o cancelamento, use frequency_type: "unlimited", que é o padrão. Nos dois casos, o assinante pode pagar no cartão, no boleto ou por Pix Automático.
O assinante consegue trocar o cartão sozinho?
Sim. A troca de cartão é self-service: quando o cartão expira, é bloqueado ou substituído, o próprio assinante cadastra o novo cartão, sem abrir chamado com o seu suporte e sem você construir tela de "atualizar forma de pagamento". O cartão novo é tokenizado no ambiente do HeroPay, então seu sistema continua sem tocar em número de cartão. A troca pela API, iniciada pelo seu backend, não existe na v1. Combine com o webhook payment_credit_cart_refused para mostrar um aviso no seu app assim que a renovação falhar.
Comece agora
Crie o primeiro plano no sandbox em 5 minutos, pague com o checkout de teste e veja subscription_activate chegar no seu endpoint.