Ciclo de vida de contracargos
Un contracargo se abre cuando el tarjetahabiente o el banco emisor disputa una transacción de tarjeta pagada. Recurrente vincula el contracargo a la factura original, descuenta el monto disputado del balance de Recurrente, solicita documentación de soporte y registra la resolución del banco.
Los webhooks de contracargos no son eventos unificados intent.*. Usan sus propios eventos: dispute.create y dispute.update.
Ciclo típico
- El emisor reporta el contracargo. Recurrente recibe la alerta del emisor o la crea desde un correo del emisor cuando logra encontrar la transacción.
- Se abre el contracargo. El estado normalmente es
needs_response. Recurrente debita el monto disputado del balance, envía un correo al propietario de la cuenta y envía un webhookdispute.create. - Envías documentación. Recurrente revisa los documentos de soporte y puede mover el contracargo a
under_review. Esto envía un webhookdispute.update. - El emisor revisa el caso. El contracargo sigue en progreso mientras el emisor decide. Si no llega documentación a tiempo, Recurrente puede marcar el contracargo como
closed. - El contracargo se resuelve. Recurrente actualiza el estado a
won,lostu otro estado operativo final. Un contracargowonacredita el monto disputado de vuelta al balance. Un contracargolostocloseddeja el débito original en firme.
No todos los contracargos pasan por todos los pasos. Por ejemplo, un contracargo puede cerrarse por falta de respuesta, resolverse directamente por el emisor o registrarse como charge_refunded cuando el cargo fue reembolsado durante el manejo del caso.
Estados
Webhooks
dispute.update también puede enviarse por cambios guardados que no son cambios de estado, así que lee siempre el campo status en vez de asumir que cada update avanzó el ciclo.
Payload
Razones
El campo reason puede ser uno de:
bank_cannot_process, check_returned, credit_not_processed, customer_initiated, debit_not_authorized, duplicate, fraudulent, general, incorrect_account_details, incorrect_amount, insufficient_funds, product_not_received, product_unacceptable, subscription_canceled, unrecognized.
Cuentas conectadas
Si el contracargo pertenece a una cuenta hija conectada y tu cuenta plataforma tiene webhooks activos, tu plataforma puede recibir los mismos eventos con estos campos adicionales:
connected: trueindica que el evento fue generado por una cuenta conectada.account_ides la cuenta que generó el evento.
Patrón para tu handler
Usa el header svix-id para idempotencia de entrega, y trata event.id como el ID del objeto de contracargo.

