Skip to main content

Evento checkout.session.expired

Disparado quando uma checkout session deixa de estar em status: "open" por expiração — ao chegar no prazo, ou quando você chama POST /v1/checkout-sessions/:id/expire. A sessão expirada não pode mais ser confirmada pelo comprador; crie uma nova session quando quiser oferecer outra tentativa de checkout. O prazo é definido por data.object.expires_at, sempre 24h depois de created_at. Sessões que já estão complete ou expired não disparam este evento novamente.
A sessão é dona do ciclo de vida do payment_intent dela. Se ainda havia uma tentativa de pagamento em andamento, ela é encerrada junto e você recebe também payment.intent.canceled com cancellation_reason: "expired". Os dois eventos descrevem a mesma decisão — trate-os de forma idempotente para não encerrar o pedido duas vezes.
Este evento representa abandono da sessão antes do confirm. Ele é diferente de uma falha de pagamento assíncrono: PIX ou boleto já confirmados pelo comprador usam checkout.session.async.payment.failed quando não forem pagos.

Quando acontece

Como processar

  • Registre o id do evento (evt_*) para processar o webhook de forma idempotente.
  • Marque o pedido ou carrinho como abandonado, não como pagamento recusado.
  • Libere reserva de estoque, bloqueio de agenda ou qualquer hold temporário associado à sessão.
  • Ofereça uma nova tentativa com uma nova checkout session ou por um payment link existente.
  • Não tente reutilizar o client_secret ou a url da sessão expirada.

Campos importantes

Status da sessão

Exemplo de payload

data.object é o DTO completo de PublicCheckoutSession.