FaizBlog LogoFaizBlog
Back to all articles
cloudflareworkerscronscheduledtutorial

Membuat Cron Job dengan Cloudflare Workers (Scheduled Triggers)

Panduan lengkap bikin cron job / scheduled task di Cloudflare Workers — jadwalkan task otomatis setiap menit, jam, atau hari tanpa server.

AI Insights

Generate a summary and suggested tags for this post.

Butuh task otomatis yang jalan setiap menit / jam / hari? Cloudflare Workers punya Cron Triggers — tinggal set schedule di wrangler.toml, tulis handler, deploy.

Cron Job dengan Cloudflare Workers

Setup Cron Trigger

Edit wrangler.toml:

name = "my-cron"
main = "src/index.ts"
compatibility_date = "2024-01-01"

[triggers]
crons = ["*/5 * * * *"]  # setiap 5 menit

Handler Cron

export default {
  async scheduled(event, env, ctx) {
    console.log("Cron triggered at", new Date(event.scheduledTime).toISOString());
    console.log("Cron pattern:", event.cron);

    // Task kamu di sini
    await doSomething(env);
  }
};

Format Cron Pattern

┌──────── menit (0-59)
│ ┌────── jam (0-23)
│ │ ┌──── hari bulan (1-31)
│ │ │ ┌── bulan (1-12)
│ │ │ │ ┌ hari minggu (0-6, Minggu=0)
* * * * *

Contoh Schedule

PatternArti
* * * * *Setiap menit
*/5 * * * *Setiap 5 menit
0 * * * *Setiap jam (menit 0)
0 0 * * *Setiap hari jam 00:00 UTC
0 17 * * *Setiap hari jam 17:00 UTC (00:00 WIB)
0 9 * * 1Setiap Senin jam 09:00 UTC
0 0 1 * *Tanggal 1 setiap bulan

Catatan: Cloudflare cron pakai UTC! Jakarta = UTC+7. Kalau mau jam 08:00 WIB, set 0 1 * * *.

Multiple Cron

[triggers]
crons = [
  "*/15 * * * *",  # setiap 15 menit
  "0 0 * * *"      # setiap hari
]

Bedain di handler:

async scheduled(event, env, ctx) {
  if (event.cron === "*/15 * * * *") await syncData(env);
  if (event.cron === "0 0 * * *") await cleanupOldLogs(env);
}

Use Case Populer

1. Kirim Email Harian

async scheduled(event, env) {
  const users = await env.DB.prepare("SELECT * FROM users").all();
  for (const user of users.results) {
    await fetch("https://api.resend.com/emails", {
      method: "POST",
      headers: { Authorization: `Bearer ${env.RESEND_KEY}` },
      body: JSON.stringify({
        to: user.email,
        subject: "Daily digest",
        html: "..."
      })
    });
  }
}

2. Cache Warming

async scheduled(event, env) {
  const urls = ["/api/popular", "/api/trending"];
  for (const url of urls) {
    await fetch(`https://mydomain.com${url}`);
  }
}

3. Cleanup Data Lama

async scheduled(event, env) {
  await env.DB.prepare(
    "DELETE FROM logs WHERE created_at < datetime('now', '-30 days')"
  ).run();
}

4. Sync Data dari API Eksternal

async scheduled(event, env) {
  const rates = await fetch("https://api.exchangerate-api.com/v4/latest/USD");
  const data = await rates.json();
  await env.KV.put("exchange:USD", JSON.stringify(data), { expirationTtl: 3600 });
}

Test Local

npx wrangler dev --test-scheduled

Trigger manual:

curl "http://localhost:8787/__scheduled?cron=*+*+*+*+*"

Limit Cron di Cloudflare

PlanCron JobsTrigger Frequency
Free5 jobsmin 1 menit
Paid ($5/bln)Unlimitedmin 1 menit

Max CPU per invocation: 30 detik (Paid), 10ms (Free — praktis ga cukup buat cron serius, upgrade ke Paid $5).

Kesimpulan

Cron Job di Cloudflare Workers = gratis (paid $5), tanpa server, global. Cocok untuk email scheduling, cleanup, sync data, cache warming. Ingat pakai UTC dan max 30 detik per invocation.