# Tareas programadas dentro de tu servidor — schedules, webhooks y jobs sin otro servicio

> cron_every toma un intervalo o una expresión cron de cinco campos y corre una tarea en su propio hilo, al lado de tus rutas. Sin crontab, sin flota de workers, sin broker de mensajes — y con una compuerta humana cuando un job la necesita.

Published 2026-09-02 · https://synsema.org/es/blog/cron-jobs-inside-your-server


Un producto chico suele necesitar tres procesos antes de necesitar tres funcionalidades: la API, un
worker para los jobs y algo que los programe. En Synsema el planificador es un builtin y los jobs son
tareas, así que los tres viven en el archivo que ya estás sirviendo.

## Una programación es una línea

```synsema
require serve(8080)
require net("api.warehouse.com")

task sync_inventory()
    let r be http_get("https://api.warehouse.com/stock")
    share json_decode(body of r) as "inventory"

task daily_report()
    log "report sent"

cron_every(300, sync_inventory)                                  -- every 5 minutes
cron_every("30 8 * * mon-fri", daily_report, {"tz": "-03:00"})   -- weekdays 08:30, fixed offset
cron_every("@hourly", sync_inventory)

serve on 8080
    route "GET /inventory"
        observe "inventory" as stock
        give stock
```

Un número es un intervalo medido desde el final de una corrida hasta el comienzo de la siguiente; un
texto es una expresión cron (`*`, rangos, `*/n`, `jan..dec`, `mon..fri`, `@daily` y compañía),
alineada al minuto. Cada job corre en su propio hilo, estacionado entre tick y tick; las corridas
nunca se superponen; `cron_list()` y `cron_cancel(name)` los administran en tiempo de ejecución.

## Un job que necesita a una persona

Algunos jobs no deberían terminar solos: la limpieza nocturna que borraría mucho, la corrida de pagos
por encima de cierto monto. Bajo `serve`, `approve` encola la compuerta y el pedido espera a un
humano:

```synsema
task nightly_cleanup()
    let n be count_stale()
    when n > 1000 and not (approve "Delete " + text(n) + " stale rows?" within 30m)
        give nothing
    delete_stale()
```

La consola imprime la aprobación pendiente con un token de un solo uso; con `SYNSEMA_HUMAN_WEBHOOK`
configurado, cada compuerta además avisa en tu canal con enlaces de sí/no listos para tocar. Si
nadie responde a tiempo, deniega. Un agente no puede falsificar la respuesta.

## Qué reemplaza esto

Un demonio de cron, una cola, un proceso worker y el pegamento entre ellos, para el caso común de
"corré esto cada N y avisame". Y cuando de verdad necesitás una cola, el mismo archivo habla Redis y
Postgres de forma nativa.

**Empezá acá:** [instalá Synsema](/es/install), pegá el primer fragmento y corré
`synsema serve app.syn`. La referencia del planificador está en la
[documentación](https://synsema.dev/es/0.6.x/34-cron); Lampson usa exactamente esto para sus tareas
programadas — mirá [lampson.org](https://lampson.org).

