event de topo é sempre subscription; o nome concreto do evento fica em data.event_type.
Exemplo de payload entregue
attempt_number e failure_reason.
Eventos emitidos hoje
subscription.createdsubscription.startedsubscription.renewedsubscription.updatedsubscription.canceledsubscription.payment_failedsubscription.past_duesubscription.trial_will_endsubscription.chargeback_received
Sequência do Pix Automático
Assinaturas com Pix Automático usam o mesmo envelope e os mesmos nomes de evento. O que muda é quando cada evento chega:- Sem período de teste: nenhum evento na criação.
subscription.started, comprevious_status: "incomplete", chega quando o pagador autorizou e o primeiro débito foi pago. - Com período de teste:
subscription.createdchega quando o pagador aprova a autorização (statustrialing,latest_transaction: null).subscription.trial_will_endchega 3 dias antes detrial_endse a assinatura já estivertrialingnesse momento, esubscription.startedcom o primeiro débito depois dele. - Autorização recusada ou, dependendo da configuração da conta, expirada:
subscription.canceled, comfailure_reason. - Ciclos seguintes:
subscription.reneweda cada débito pago. Depois de um débito com falha,subscription.payment_failed, e tambémsubscription.past_duequando a assinatura passa parapast_due. - Cancelamento:
subscription.canceled, nuncasubscription.updated.
latest_transaction.method é "pix". As cobranças do Pix Automático não enviam webhooks transaction.*, e um débito com falha não cria transação, então nos eventos de falha latest_transaction é a transação mais recente da assinatura. A tabela completa está em Assinaturas com Pix Automático.
Troca de plano
A troca de plano vale só para assinaturas com cartão. Uma troca de plano não cria um tipo de evento novo. Ela chega comosubscription.updated, e update_fields diz o que se moveu: ["product_id", "amount"] quando o novo plano já está sendo cobrado, ["pending_change"] quando uma troca foi agendada ou uma troca agendada foi cancelada.
Quando o plano de fato se move — na hora, ou no momento em que é agendado — o payload traz também um bloco plan_change:
effective_at é o fim do período atual; numa imediata, é o momento em que foi aplicada.
Dois casos chegam sem plan_change de propósito, e é a ausência do bloco que os distingue dos anteriores:
- Uma troca agendada foi cancelada. Você recebe
subscription.updatedcomupdate_fields: ["pending_change"]e sem o blocoplan_change. - Uma troca agendada passou a valer na renovação. Nenhum
subscription.updatedé enviado por isso. Você recebe osubscription.renewedde sempre, já com oamountnovo, ependingChangeficanullna leitura seguinte.
Guia de tratamento
- Faça deduplicação pelo
iddo evento no topo. - Use
data.event_typepara encaminhar cada evento ao handler correto. - Use
data.statuspara o estado atual da assinatura. - Use
latest_transactionpara a transação de cobrança ligada ao evento. Nos eventos de falha do Pix Automático, ela é a transação mais recente da assinatura. - Use o UUID em
data.idcomo identificador da assinatura. - Reconcilie com
GET /v2/subscriptions/{id}se a entrega ou o processamento for interrompido.

