subscription_renewed, subscription_late e subscription_canceled avisam o que aconteceu com uma assinatura. Esta página explica quando cada um é enviado e quais campos do payload usar para liberar ou remover o acesso do cliente.
Como ligar uma renovação à compra original
Cada cobrança de uma assinatura (a primeira compra e cada renovação) gera um pedido novo, com umorder_id novo. O subscription_id, na raiz do JSON, é o mesmo em todas as cobranças. Use o subscription_id para identificar a assinatura e o order_id para identificar cada cobrança.
Os eventos de assinatura sempre trazem o pedido mais recente da assinatura. Numa renovação, esse é o pedido da renovação.
O que é enviado em cada renovação
Na renovação, a Kiwify cobra o cliente e envia dois webhooks para o mesmo pedido: um evento de compra e um evento de assinatura. Cada um só chega se o gatilho estiver ativo no seu webhook.subscription_renewedsó é enviado quando o pagamento da renovação é aprovado. Para liberar o novo período, ele basta sozinho. Não é preciso consultar outro evento nem a API.- Num pagamento aprovado,
Subscription.customer_access.access_untilpassa a ser o fim do novo período pago. - Cada nova tentativa de cobrança que falhar envia de novo
compra_recusadaesubscription_late. Quando o limite de tentativas acaba, a assinatura é cancelada e chegasubscription_canceled. - Se a cobrança for recusada antes do fim do período atual, só
compra_recusadaé enviado. O período pago continua válido. - Em renovações por Pix ou boleto, chega primeiro
pix_geradoouboleto_gerado.compra_aprovadaesubscription_renewedsó chegam quando o cliente paga.
Cancelamento
subscription_canceled é enviado quando o cliente, o produtor ou a Kiwify cancela a assinatura. A partir daí ninguém é cobrado de novo. Mesmo assim, o período já pago continua valendo: customer_access.access_until fica na data de fim desse período, e o cliente deve manter o acesso até lá.
- Quando o cancelamento é pedido para o fim do período,
subscription_canceledpode chegar duas vezes: uma no pedido do cancelamento e outra quando o período termina. Trate o evento como idempotente. - Se o cancelamento vier de um reembolso,
order_statusérefunded,customer_access.has_accesséfalseeaccess_untilé a data do reembolso.
Campos do objeto Subscription
Datas como
created_at, updated_at e approved_date, na raiz do JSON, vêm no horário de Brasília (YYYY-MM-DD HH:mm). As datas dentro de Subscription vêm em UTC.
Exemplos de payload
Exemplos resumidos (campos comoCustomer, Commissions e TrackingParameters foram omitidos). Para ver o payload completo de um evento, use Testar Webhook e confira em Ver logs o que foi enviado.
Consultar pela API
A API pública não tem um endpoint de assinaturas.GET /sales/{id} devolve o status do pedido, mas não traz subscription_id nem a data de fim do período pago. Esses dados só chegam pelo webhook.