TiempoEsperaEnvio: el control de flujo
Hacienda te dice cuántos segundos esperar antes del siguiente envío. Ignorarlo no da un error claro: te deja sin servicio en hora punta, que es justo cuando no puedes permitírtelo.
¿Qué es TiempoEsperaEnvio y qué pasa si no se respeta?
Es el campo de la respuesta de la AEAT que indica cuántos segundos esperar antes del siguiente envío, como parte del control de flujo del artículo 16. Ignorarlo provoca cortes de servicio en los momentos de más volumen.
El valor hay que persistirlo, no guardarlo en memoria —el siguiente envío puede hacerlo otro proceso—, y aplicarlo por canal de envío, no por factura.
Fuente: Real Decreto 1007/2023, de 5 de diciembre · Orden HAC/1177/2024, de 17 de octubre
Cada respuesta de la AEAT trae un campo TiempoEsperaEnvio: los segundos que
debes esperar antes del siguiente envío. Es el control de flujo con el que Hacienda
protege su servicio, y no es opcional.
<RespuestaRegFactuSistemaFacturacion> <EstadoEnvio>Correcto</EstadoEnvio> <!-- Segundos que hay que esperar antes del --> <!-- SIGUIENTE envío. No es una sugerencia. --> <TiempoEsperaEnvio>60</TiempoEsperaEnvio> </RespuestaRegFactuSistemaFacturacion>
Guardarlo en memoria
El siguiente envío puede hacerlo otro worker, otro proceso o la petición de otro usuario. Si el valor vive en memoria, ese otro no se entera y envía igual. Hay que persistirlo.
Aplicarlo por factura en vez de por cuenta
El control de flujo es del canal, no de la factura. Diez procesos esperando cada uno «su» tiempo por separado siguen mandando diez veces más de lo permitido.
Asumir un valor fijo
El valor lo decide la AEAT y puede cambiar según su carga. Cablear 60 s funciona hasta el día que pide más.
// El valor hay que PERSISTIRLO, no guardarlo en memoria: // si el siguiente envío lo hace otro proceso, otro worker // u otra petición, en memoria no se entera. public static function esperaFlujo(?string $tiempoEsperaEnvio, int $porDefecto = 60): int { $v = (int) trim((string) $tiempoEsperaEnvio); return $v > 0 ? $v : $porDefecto; } // Sin dato utilizable se espera 60 s. Esperar de más // retrasa; esperar de menos te deja sin servicio.
El control de flujo dice cuándo puedes enviar. La política de reintentos dice si merece la pena volver a intentarlo. Son cosas distintas y se confunden a menudo.
| Respuesta de la AEAT | Clasificación | ¿Se reintenta? |
|---|---|---|
Correcto | aceptado | No hace falta |
AceptadoConErrores | aceptado con errores | No: se aceptó. Pero hay que mirarlo — por qué |
Incorrecto | rechazado | No. Es de contenido: dará el mismo error siempre |
| Sin respuesta útil, red, timeout | transitorio | Sí, con espera creciente |
// Espera creciente: 5 · 3^(n-1) minutos, con tope de un día. return (int) min(5 * (3 ** max(0, $intentos - 1)), 1440); // La secuencia real, ejecutada: // 1er fallo → 5 min // 2º → 15 min // 3º → 45 min // 4º → 135 min (2,3 h) // 5º → 405 min (6,8 h) // 6º → se abandona y se marca «error» // // Ventana total: 605 min ≈ 10 horas de reintentos // antes de pedir que alguien lo mire.
¿Qué es TiempoEsperaEnvio en VeriFactu?
Es el campo de la respuesta de la AEAT que indica cuántos segundos hay que esperar antes del siguiente envío. Forma parte del control de flujo del artículo 16 y es obligatorio respetarlo.
¿Qué pasa si ignoro el control de flujo?
Que en hora punta te quedas sin servicio. No da un error que explique la causa: se traduce en rechazos y cortes justo cuando más volumen de facturación tienes, y en desarrollo con poco volumen nunca se reproduce.
¿El tiempo de espera es por factura o por cuenta?
Por canal de envío, no por factura. Si diez procesos esperan cada uno «su» tiempo por separado, entre todos siguen enviando muy por encima de lo permitido.
¿Qué errores de la AEAT hay que reintentar?
Solo los transitorios: fallos de red, timeouts o ausencia de respuesta útil. Un rechazo de contenido (estado Incorrecto) dará el mismo error las veces que se mande, así que reintentarlo solo esconde el problema.
¿Cuánto tiempo se reintenta antes de rendirse?
En verifactu.co, cinco reintentos con espera creciente de 5, 15, 45, 135 y 405 minutos: unas diez horas en total. Superado eso, el registro se marca como error para que alguien lo revise, en lugar de seguir girando en vacío.
Última revisión normativa: Especificaciones de huella AEAT v0.1.2 Revisado por el equipo técnico de verifactu.co