Entenda os eventos da Chargefy, como eles viram entregas de webhook e quais fatos de negócio vale escutar.
A Chargefy emite um evento sempre que algo relevante acontece: uma cobrança foi aprovada, uma assinatura mudou, um cliente foi criado. O evento é o registro do fato de negócio. A entrega de webhook é só uma das formas de receber esse fato.Isso deixa a integração mais previsível: você escuta acontecimentos importantes para o seu produto, não o caminho técnico que gerou cada um deles.
Um fato, um evento
Um pagamento confirmado gera um único payment.intent.succeeded, mesmo que
ele tenha vindo de checkout, link de pagamento ou API.
Zero ou mais entregas
O evento existe mesmo sem endpoint cadastrado. Se houver endpoints inscritos,
cada um recebe sua própria entrega assinada.
Debug mais simples
No dashboard, você acompanha tentativas, status HTTP, resposta do endpoint e
reenvia para um endpoint específico quando precisar.
Algo aconteceu com um recurso (payment.intent.succeeded, subscription.updated).
Para conciliar pedidos, liberar acesso, atualizar status e consultar histórico.
Entrega
Uma tentativa de enviar esse evento para um endpoint de webhook.
Para debugar falha HTTP, ver retries, copiar resposta do endpoint e reenviar.
Um mesmo evento pode ter várias entregas, uma por endpoint. Também pode não ter
nenhuma entrega se você ainda não cadastrou webhooks para aquele ambiente. O
histórico do evento continua existindo para consulta pela API.
Na prática: use type para decidir o que fazer no seu sistema, use id para
idempotência, e use as telas de Webhooks para investigar problemas de entrega.
Na área de webhooks do dashboard, cada endpoint mostra atividade recente e cada
entrega mostra o status da tentativa. Esse recorte ajuda a responder perguntas
operacionais sem abrir logs:
o endpoint recebeu eventos nas últimas horas?
a última tentativa respondeu 2xx, 4xx, 5xx ou timeout?
qual foi o corpo de resposta retornado pelo seu servidor?
para qual endpoint um evento deve ser reenviado?
O evento continua sendo o mesmo. O que muda entre endpoints são as entregas.
O endpoint deve responder 2xx para confirmar recebimento. Respostas fora de
2xx, timeout ou erro de conexão entram como falha de entrega e podem passar
por retry.
O recurso, no singular (customer, subscription, payment.intent).
Ação
O verbo no passado (created, updated, succeeded, canceled).
Subestados
Fluxos assíncronos usam mais segmentos (checkout.session.async.payment.succeeded).
O type é estável: novos eventos podem ser adicionados, mas um type já
publicado não é renomeado. Trate type desconhecido como ignorável — assim
sua integração não quebra quando o catálogo cresce.
Quando um recurso muda, o evento <recurso>.updated traz data.previous_attributes com apenas os campos que mudaram e seus valores anteriores. O data.object continua sendo o estado atual completo.
A resposta direta de um update via API não traz diff — retorna só o objeto
atualizado. Quem precisa saber o que mudou lê previous_attributes no
webhook .updated. Eventos .created e ações de transição (.succeeded,
.canceled) não trazem previous_attributes.
A família payment.intent.* cobre todo mode=payment one-shot — cartão, PIX e boleto. Métodos assíncronos (PIX e boleto) ficam pendentes até o pagamento ser confirmado; aí emitem payment.intent.succeeded. Boletos não pagos até expires_at viram payment.intent.canceled com cancellation_reason: "abandoned" automaticamente.
Invoices representam cobranças de assinatura por padrão. Compras avulsas só geram invoice quando a sessão foi criada com invoice_creation=true — caso contrário, escute payment.intent.succeeded. Trials emitem invoice.paid para a invoice de R$ 0 que registra o período.