#cron#email#schedules

“I want to send a summary email every morning at 8am without running a cron server”

Send a daily report email on a cron schedule

Create one schedule with a 5-part cron expression. Fliq calls your report endpoint every day at the time you set — no server, no node-cron, no missed runs after a deploy.

You have an endpoint that builds and sends a digest — /api/reports/daily. You don’t want to keep a box alive just to call it, and an in-process node-cron stops the moment your dyno restarts. A Fliq schedule is a cron expression stored in Postgres: Fliq fires the HTTP call on time, every time.

The request

POST to /schedules with a 5-part cron expression (UTC). 0 8 * * * is every day at 08:00 UTC.

curl -X POST https://api.fliq.sh/schedules \
  -H "Authorization: Bearer fliq_sk_your_token" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://yourapp.com/api/reports/daily",
    "http_method": "POST",
    "cron": "0 8 * * *",
    "headers": { "Content-Type": "application/json" },
    "body": "{\"report\":\"daily-summary\"}",
    "max_retries": 3
  }'
const res = await fetch("https://api.fliq.sh/schedules", {
  method: "POST",
  headers: {
    "Authorization": "Bearer fliq_sk_your_token",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    url: "https://yourapp.com/api/reports/daily",
    http_method: "POST",
    cron: "0 8 * * *", // every day, 08:00 UTC
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ report: "daily-summary" }),
    max_retries: 3,
  }),
});

const schedule = await res.json();
console.log(schedule.next_run_at); // 2026-06-13T08:00:00Z

The response includes next_run_at so you can confirm the first fire time immediately.

What Fliq handles for you

  • Cron without a server. The schedule lives in Postgres; Fliq’s scheduler claims and fires it. Nothing in your app needs to stay running.
  • Retries on the report call. If /api/reports/daily is briefly down at 08:00, each spawned run still honours max_retries with backoff — a flaky deploy window won’t silently skip a day.
  • History per run. Every daily fire is a separate execution with its own status code and timing, so you can see exactly which mornings the report actually went out.
  • Dynamic by API. Change the time or delete the schedule with one call — no redeploy, unlike a cron baked into wrangler.toml or a crontab.
Run cron without a server — free during beta