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.

Setup Cron Trigger
Edit wrangler.toml:
name = "my-cron"
main = "src/index.ts"
compatibility_date = "2024-01-01"
[triggers]
crons = ["*/5 * * * *"] # setiap 5 menitHandler 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
| Pattern | Arti |
|---|---|
* * * * * | 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 * * 1 | Setiap 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-scheduledTrigger manual:
curl "http://localhost:8787/__scheduled?cron=*+*+*+*+*"Limit Cron di Cloudflare
| Plan | Cron Jobs | Trigger Frequency |
|---|---|---|
| Free | 5 jobs | min 1 menit |
| Paid ($5/bln) | Unlimited | min 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.
