How to Set Up Scheduled Cron Jobs in Node.js Without a Server Using Cloudflare Workers and Durable Objects
Running scheduled tasks like database cleanups, email reminders, or periodic data fetching traditionally requires a server or a cron scheduler — which usually costs money or infrastructure. But using Cloudflare Workers and Durable Objects, you can schedule cron-like tasks completely serverlessly. Why Use Cloudflare Workers for Cron? Free-tier available No infrastructure to manage Edge-deployed functions Easy integration with APIs, storage, or databases Step 1: Install Wrangler npm install -g wrangler Initialize your project: wrangler init scheduled-job --type=javascript cd scheduled-job Step 2: Enable Scheduled Events in wrangler.toml [triggers] crons = ["0 */1 * * *"] # every hour on the hour This follows the standard crontab syntax. You can schedule it every minute, hour, day, etc. Step 3: Add the Scheduled Handler export default { async scheduled(controller, env, ctx) { console.log("Cron job triggered!"); // Example: Cleanup logic await fetch("https://your-api.com/cleanup", { method: "POST" }); }, async fetch(request, env, ctx) { return new Response("Worker is live!"); } } This defines a worker that performs a task on schedule and responds normally to HTTP requests. Step 4: Deploy wrangler deploy Your cron jobs are now running without a traditional server. Step 5 (Optional): Use Durable Objects for Stateful Logic If you need to keep state between cron executions (e.g., counters, timestamps), use Durable Objects: export class CronState { constructor(state, env) { this.state = state; } async fetch(request) { let value = await this.state.storage.get("lastRun"); return new Response("Last ran at: " + value); } async scheduled(controller, env, ctx) { const now = new Date().toISOString(); await this.state.storage.put("lastRun", now); } } Configure Durable Object binding in wrangler.toml and attach it in your main Worker file. Pros and Cons ✅ Pros Zero-cost scheduled tasks with high reliability No server or Docker containers to maintain Integrated state via Durable Objects ⚠️ Cons Max 3 scheduled events per Worker on the free tier Limited to 1-minute granularity More complex than traditional crontab for simple tasks
Running scheduled tasks like database cleanups, email reminders, or periodic data fetching traditionally requires a server or a cron scheduler — which usually costs money or infrastructure. But using Cloudflare Workers and Durable Objects, you can schedule cron-like tasks completely serverlessly.
Why Use Cloudflare Workers for Cron?
- Free-tier available
- No infrastructure to manage
- Edge-deployed functions
- Easy integration with APIs, storage, or databases
Step 1: Install Wrangler
npm install -g wrangler
Initialize your project:
wrangler init scheduled-job --type=javascript
cd scheduled-job
Step 2: Enable Scheduled Events in wrangler.toml
[triggers]
crons = ["0 */1 * * *"] # every hour on the hour
This follows the standard crontab syntax. You can schedule it every minute, hour, day, etc.
Step 3: Add the Scheduled Handler
export default {
async scheduled(controller, env, ctx) {
console.log("Cron job triggered!");
// Example: Cleanup logic
await fetch("https://your-api.com/cleanup", { method: "POST" });
},
async fetch(request, env, ctx) {
return new Response("Worker is live!");
}
}
This defines a worker that performs a task on schedule and responds normally to HTTP requests.
Step 4: Deploy
wrangler deploy
Your cron jobs are now running without a traditional server.
Step 5 (Optional): Use Durable Objects for Stateful Logic
If you need to keep state between cron executions (e.g., counters, timestamps), use Durable Objects:
export class CronState {
constructor(state, env) {
this.state = state;
}
async fetch(request) {
let value = await this.state.storage.get("lastRun");
return new Response("Last ran at: " + value);
}
async scheduled(controller, env, ctx) {
const now = new Date().toISOString();
await this.state.storage.put("lastRun", now);
}
}
Configure Durable Object binding in wrangler.toml
and attach it in your main Worker file.
Pros and Cons
✅ Pros
- Zero-cost scheduled tasks with high reliability
- No server or Docker containers to maintain
- Integrated state via Durable Objects
⚠️ Cons
- Max 3 scheduled events per Worker on the free tier
- Limited to 1-minute granularity
- More complex than traditional crontab for simple tasks