Deduplicación
Por qué importa
Como hay reintentos in-process y persistentes, es esperable que recibás el mismo evento más de una vez. Si no deduplicás, vas a marcar dos veces como “aceptado” la misma factura, mandar correos repetidos o disparar dos veces tu lógica de negocio.
Mecanismo
Cada envío incluye dos campos pensados para detectar la repetición:
nonce— identificador único por intento de envío (32 caracteres hexadecimales, 16 bytes).intento— número del intento (1 a 5).
💡 Usá
noncecomo clave de deduplicación, nuncaclaveninumero_consecutivo: esos sí se repiten entre intentos porque pertenecen al comprobante, no al envío.
Patrón
Aprovechá un índice único en tu BD para hacer la deduplicación atómica: si el INSERT falla por colisión, sabés que ya procesaste ese evento y podés salir sin tocar el resto del flujo.
async function procesarWebhook(evento) {
try {
await db.eventosLxs.create({
data: { nonce: evento.nonce, payload: evento, procesadoEn: new Date() }
});
} catch (err) {
if (err.code === 'P2002') { // unique constraint violation
// Ya procesado, descartar
return;
}
throw err;
}
await aplicarLogicaDeNegocio(evento);
}