LogoFreestyle

Cron Jobs

Schedule recurring jobs for Serverless Deployments.

Cron jobs let you trigger a deployment on a schedule. This is useful for background syncs, cleanup jobs, reminders, and periodic data processing.

CLI quickstart

# create schedule
npx freestyle cron schedule \
  --deployment-id <deployment-id> \
  --cron '*/5 * * * *' \
  --timezone UTC

# inspect recent executions
npx freestyle cron executions <schedule-id> --limit 20

# disable when done
npx freestyle cron disable <schedule-id>

1) Create a deployment with a scheduled handler

Your deployment should export a scheduled function. Freestyle calls this handler whenever the schedule runs.

import { freestyle } from "freestyle";

const { deploymentId } = await freestyle.serverless.deployments.create({
  code: `
    export default {
      fetch() {
        return new Response("ok", { status: 200 });
      },
      scheduled(cron) {
        console.log("cron trigger", cron);
      },
    };
  `,
});

2) Create a schedule

const { job } = await freestyle.cron.schedule({
  deploymentId,
  cron: "*/2 * * * * *", // every 2 seconds
  timezone: "UTC",
  payload: { source: "docs-example" }, // optional
  // path: "/internal/cron", // optional
});

console.log(job.schedule.id);

3) Inspect executions

const { executions } = await job.executions({
  limit: 20,
});

console.log(executions.map((e) => ({ id: e.id, status: e.status })));

Execution statuses include: queued, running, succeeded, failed, retry.

4) Monitor success rate

const now = new Date();
const oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000);

const metrics = await job.successRate({
  start: oneHourAgo,
  end: now,
});

console.log(metrics.successRate);

5) Pause or resume a schedule

await job.disable();
await job.enable();

List schedules for a deployment

const { jobs } = await freestyle.cron.list({ deploymentId });
console.log(jobs.map((j) => j.schedule.id));

End-to-end example

import "dotenv/config";
import { freestyle } from "freestyle";

const { deploymentId } = await freestyle.serverless.deployments.create({
  code: `export default {
    fetch() {
      return new Response("Hello, World!", { status: 200 });
    },
    scheduled(cron) {
      console.log(cron);
    },
  };`,
});

const { job } = await freestyle.cron.schedule({
  deploymentId,
  cron: "*/2 * * * * *",
  timezone: "UTC",
});

await new Promise((resolve) => setTimeout(resolve, 11_000));

const { executions } = await job.executions({ limit: 5 });
console.log(executions);

await job.disable();

For high-frequency schedules, keep handlers idempotent so retries are safe.

On this page

Freestyle AI

Documentation assistant

Experimental: AI responses may not always be accurate—please verify important details with the official documentation.

How can I help?

Ask me about Freestyle while you browse the docs.