Skip to main content
Una ejecución diferida es una invocación que agendas para que ocurra una sola vez en el futuro: un recordatorio a las 24 horas, un seguimiento de carrito abandonado, una encuesta 2 días después de la compra.
¿Cron o diferida?
  • Cron — se repite en un horario fijo (todos los días a las 9:00). Se define en el código.
  • Diferida — ocurre una vez, en un momento calculado en tiempo de ejecución (24 horas después de este pedido). Se agenda desde el handler o desde la petición HTTP.

Agendar desde el handler

ctx.jelou.schedule() agenda una ejecución relativa a “ahora”:
index.ts

Parámetros

La duración acepta unidades compuestas de mayor a menor: "1h30m" es válido, "30m1h" no.
Para seguimientos muy cortos usa 5 segundos o más. Con duraciones menores la latencia de red puede dejar el momento agendado en el pasado y la plataforma lo rechaza.

Momento absoluto

ctx.jelou.scheduleAt() recibe una fecha en vez de una duración:
Lanza un error si la fecha ya pasó o no se puede interpretar. El resto de campos funciona igual que en schedule().

Evitar duplicados

Si el servicio que llama a tu función reintenta, idempotencyKey garantiza una sola reserva:
Reusar la misma idempotencyKey con un payload distinto devuelve un error 409.

Agendar desde una petición HTTP

Cualquier cliente puede diferir una llamada agregando una cabecera al POST normal. Sin cabeceras de agenda, la función se ejecuta de inmediato como siempre.
La respuesta es 202 Accepted cuando se crea la reserva y 200 OK cuando un reintento reutiliza una reserva existente. El cuerpo no puede superar 64 KB.

Recibir el disparo

Cuando llega el momento, tu función recibe el payload original en la ruta que indicaste. Usa ctx.isScheduledFire para distinguir el disparo de una petición normal:

Verificar antes de actuar

Entre el momento en que agendas y el momento en que se dispara, la realidad pudo cambiar: el cliente ya pagó, la plantilla se pausó, el usuario se dio de baja. ctx.guard encadena esas verificaciones y evita el envío si alguna falla:
Si todas las verificaciones pasan, se ejecuta .run() y su resultado es la respuesta. Si alguna falla, la cadena se corta y devuelve { skipped: "<nombre>" } sin ejecutar el envío.
La cadena termina con .run(handler), no con .then(). ctx.guard es una cadena nueva en cada petición.
Si el bot no viaja en el payload, en un disparo diferido ctx.bot no está resuelto y ctx.templateRegistry queda sin canal asociado. Incluye el botId en el payload al agendar y enlázalo con ctx.templateRegistry.for(botId). Ver plantillas de WhatsApp.

Consultar lo agendado

ctx.jelou.findDeferred() lista las ejecuciones pendientes de tu función:

Cancelar

ctx.jelou.cancelDefer() cancela en bloque por audiencia o etiqueta. Requiere exactamente uno de subject, key o keyPrefix:
raced contiene las ejecuciones que ya se estaban disparando cuando llegó la cancelación — para esas, la verificación con ctx.guard en el handler es la última defensa. Escribe tus handlers para que sean idempotentes. Antes de una cancelación amplia, previsualiza el alcance con dryRun:
No existe “reprogramar”: una reserva es inmutable. Para cambiar la hora, cancela y agenda de nuevo.

Prueba local

schedule, scheduleAt, findDeferred y cancelDefer funcionan solo en una función desplegada. En local lanzan un error porque no hay credenciales de plataforma. Para probar el flujo con jelou functions dev, activa la simulación:
En ese modo se validan los argumentos, se registra la reserva en los logs y se devuelve un resultado sintético — tu handler sigue ejecutándose, pero no se agenda nada real. Para tests unitarios usa createMockContext, cuyo ctx.jelou registra las llamadas sin red ni configuración.

Inspeccionar desde el CLI

Ver la referencia del CLI.

Límites

Las reservas ya disparadas, canceladas o fallidas no cuentan contra el límite de activas.

Problemas comunes

Consulta el estado y el último error de la reserva:
Si el estado es failed, el campo de error indica por qué falló la entrega. Si es cancelled, algo la canceló antes — revisa tus llamadas a cancelDefer.

Cron

Tareas recurrentes en horario fijo.

Mensajería

Enviar WhatsApp y validar plantillas.

Webhooks

Verificar firmas de servicios externos.

CLI

Comandos defer list y defer get.