Problema

QuickBooks limita a 500 llamadas/minuto. Durante sincronizaciones masivas, el sistema recibia errores 429 Too Many Requests que causaban:

SintomaImpacto
Error buscando clientesFallback a cliente generico (#27)
Error creando clientesFactura asignada incorrectamente
Sincronizaciones incompletasFacturas pendientes sin procesar
Backoff exponencial

El sistema reintenta automaticamente con delays crecientes: 1s → 2s → 4s → 8s

1s
Retry 1
2s
Retry 2
4s
Retry 3
8s
Retry 4
const resultado = await this.ejecutarConRetry(requestFn, maxRetries, baseDelay);

// Internamente:
// intento 1: espera 1000ms
// intento 2: espera 2000ms
// intento 3: espera 4000ms
// intento 4: espera 8000ms
Funciones de retry
FuncionProposito
ejecutarConRetry(fn, retries, delay)Wrapper generico con backoff exponencial para cualquier peticion QB
buscarClienteConRetry(query)Busqueda de clientes resistente a 429, con delays inteligentes
crearClienteConRetry(data)Creacion de clientes con proteccion automatica contra rate limiting
Sincronizacion inteligente

El metodo sincronizarConEndpoint() implementa pausas dinamicas que se adaptan a la carga.

MecanismoDetalle
Pausa base1000ms entre cada factura
Pausa por error+500ms por cada error previo acumulado
Pausa extra 429+3000ms adicional cuando se detecta rate limit
Maximo5000ms entre facturas
ProgresoContador en tiempo real: factura X de Y
Configuracion
ParametroDefaultDescripcion
maxRetries3Numero maximo de reintentos por peticion
baseDelay1000msDelay base para calculo de backoff
timeout15000msTimeout de peticiones HTTP individuales
pausaDinamica1000ms + errors*500msPausa adaptativa entre facturas
// Personalizar reintentos para casos especificos
await this.ejecutarConRetry(requestFn, 5, 2000); // 5 reintentos, 2s base
Diagnostico

Los logs muestran mensajes claros del estado del rate limiting:

// Reintento con backoff
Reintentando en 2000ms (intento 2/4)...
Peticion exitosa despues de 1 reintentos

// Rate limit detectado
Rate limiting detectado (429) - Intento 2/4
Pausa adicional de 3s debido a rate limiting

// Pausa entre facturas
Pausa de 1500ms antes de la siguiente factura...

Mejores practicas

PracticaDetalle
Lotes pequenosSincronizar en lotes durante horas pico
Monitorear logsIdentificar patrones de rate limiting recurrentes
Probar antesEjecutar test antes de sincronizaciones masivas
HorariosPreferir horarios de baja carga (temprano en la manana)
Limite de QuickBooks: 500 llamadas por minuto. Las sincronizaciones grandes (100+ facturas) pueden acercarse al limite — el backoff exponencial maneja esto automaticamente.