Entrega y reintentos
Qué cuenta como webhook entregado, cómo reintenta Tonder uno fallido y cómo reenviar eventos tú mismo.
Tonder da un evento por entregado cuando tu servidor responde cualquier 2xx en menos de
10 segundos. Si no, lo reintenta automáticamente —hasta 6 intentos en unas 8,5 horas— y tú
puedes reenviar cualquier evento desde el registro de eventos.
Webhooks 2.0 se habilita por cuenta. Si en Desarrolladores de tu dashboard no aparece la pestaña Eventos, tu cuenta está en la versión anterior: pide a tu contacto de Tonder que la habilite.
Sin Webhooks 2.0, cada evento se entrega una sola vez.
Calendario de reintentos
| Intento | Espera desde el intento anterior |
|---|---|
| 1 | Inmediato |
| 2 | 1 minuto |
| 3 | 5 minutos |
| 4 | 30 minutos |
| 5 | 2 horas |
| 6 | 6 horas |
Cada espera varía ±10% para no saturar tu servidor. Si el sexto intento falla, el evento queda Fallido.

Cómo lee Tonder tu respuesta
| Tu servidor responde | Qué pasa |
|---|---|
Cualquier 2xx en menos de 10 segundos | Entregado. No hay más intentos. |
429 o 503 con header Retry-After | El siguiente intento espera lo que pidas, hasta 6 horas. |
410 Gone | El endpoint ya no existe: el evento queda Fallido, sin más intentos. |
| Cualquier otro código, un timeout o un error de conexión | Se reintenta según la tabla de arriba. |
Un endpoint desactivado o eliminado no recibe reintentos: sus eventos pendientes quedan Fallidos como "Endpoint no disponible".
Reenvía eventos tú mismo
Un evento. En el registro de eventos, abre el evento y haz clic en Reenviar evento.
- Si el evento aún se estaba reintentando y el reenvío falla, conserva los intentos automáticos que le quedaban.
- Si ya estaba Fallido o Entregado, el reenvío es un solo intento.
- No se puede reenviar mientras un intento automático está a punto de enviarse (±1 minuto), ni dos veces en 30 segundos.
Todos los fallidos. Reintentar todos vuelve a enviar los eventos Fallidos del filtro actual —hasta 5,000, a un ritmo de 10 por segundo.
Los reenvíos manuales se suman al total de intentos, pero no a los 6 automáticos, así que un
contador puede marcar 7/6.
Qué significa para tu integración
- Responde
2xxde inmediato y procesa después en tu propia cola —tienes 10 segundos. - Deduplica con el header
webhook-id. Un reintento o un reenvío trae el mismowebhook-id. - No dependas del orden de llegada. Un
payment_Pendingreintentado puede llegar después de unpayment_Success; usa elstatusy la fechacreateddel payload. - Después de una caída, revisa el registro de eventos cuando tu servidor vuelva: lo que haya quedado Fallido se puede reenviar.
- Con Webhooks 2.0, deduplica con el header
webhook-id— un reintento o un reenvío trae el mismo. Sin Webhooks 2.0, deduplica conid+event_type. Correlaciona conmetadata.external_id, que se repite en cada evento de una transacción y funciona en los formatos Short + Long. - Guarda los
webhook-idprocesados durante al menos 60 días —un evento se puede reenviar mientras se conserva. - Mantén un índice
idempotency_keyen tu base de datos. - En modo Híbrido, trata el par Pending + Success como intencional.
- Verifica siempre el estado final con
GET /api/v1/transactions/{id}/. - Maneja los cinco estados terminales de retiros —
Success,Declined,Cancelled,FailedyReturned;Returnedllega después deSuccess.
Sin Webhooks 2.0
Las cuentas en la versión anterior reciben cada evento una sola vez. La respuesta se registra, pero no dispara una nueva entrega:
| Respuesta | Qué hacemos |
|---|---|
| 2xx en menos de 30 segundos | La entrega se registra como exitosa. |
| 4xx (400, 401, 404, etc.) | La entrega se registra como fallida. Se genera una alerta interna. El evento no se reenvía. |
| 5xx (500, 502, 503, etc.) | La entrega se registra como fallida. Se genera una alerta interna. El evento no se reenvía. |
| Timeout (sin respuesta después de 30 segundos) | La entrega se registra como fallida. Se genera una alerta interna. El evento no se reenvía. |
Concilia consultando GET /api/v1/transactions/{id}/ para cualquier periodo en el que tu endpoint
no estuvo disponible o devolvió errores, y si detectas eventos perdidos, contacta a
soporte con el rango de fechas. Deduplica con id + event_type:
metadata.external_id se repite en cada evento de la misma transacción, así que correlaciona pero
no distingue Pending de Success.
No trates el webhook como tu única fuente de verdad. Un pago o retiro cuya notificación nunca recibiste de todos modos llegó a su estado final — el endpoint de transacciones siempre lo tiene.
Siguientes pasos
Verifica la firma
Comprueba que cada webhook viene de Tonder: los headers de Standard Webhooks, cómo se calcula la firma y cómo rotar el secreto.
Registro de eventos
Cada webhook que Tonder envió a tus endpoints, con cada intento y la respuesta de tu servidor — busca, filtra y reenvía desde Desarrolladores › Eventos.
