[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"tools-page-cloudflare-cron-generator":3},{"page":4,"related":548,"variants":567},{"path":5,"name":6,"title":7,"description":8,"checkedAt":9,"sources":10,"faq":41,"related":60,"nuxter":64,"body":67,"tool":546,"preset":547},"\u002Ftools\u002Fcloudflare-cron-generator","Cloudflare cron trigger generator","Cloudflare Cron Triggers Generator and Tester","Build and test Cloudflare Cron Triggers: plain-English meaning, the next runs in UTC and your time zone, and the Wrangler and Nitro scheduledTasks config.","2026-10-06",[11,14,17,20,23,26,29,32,35,38],{"label":12,"url":13},"Cloudflare Workers docs, Cron Triggers","https:\u002F\u002Fdevelopers.cloudflare.com\u002Fworkers\u002Fconfiguration\u002Fcron-triggers\u002F",{"label":15,"url":16},"Cloudflare Workers docs, Limits","https:\u002F\u002Fdevelopers.cloudflare.com\u002Fworkers\u002Fplatform\u002Flimits\u002F",{"label":18,"url":19},"Cloudflare Workers docs, Pricing","https:\u002F\u002Fdevelopers.cloudflare.com\u002Fworkers\u002Fplatform\u002Fpricing\u002F",{"label":21,"url":22},"saffron, the cron parser behind Cron Triggers","https:\u002F\u002Fgithub.com\u002Fcloudflare\u002Fsaffron",{"label":24,"url":25},"Nitro 2 docs, Tasks","https:\u002F\u002Fv2.nitro.build\u002Fguide\u002Ftasks",{"label":27,"url":28},"Nitro docs, Tasks","https:\u002F\u002Fnitro.build\u002Fdocs\u002Ftasks",{"label":30,"url":31},"croner on GitHub","https:\u002F\u002Fgithub.com\u002FHexagon\u002Fcroner",{"label":33,"url":34},"crontab(5), Linux manual page","https:\u002F\u002Fman7.org\u002Flinux\u002Fman-pages\u002Fman5\u002Fcrontab.5.html",{"label":36,"url":37},"Nuxt docs, Roadmap","https:\u002F\u002Fnuxt.com\u002Fdocs\u002F4.x\u002Fcommunity\u002Froadmap",{"label":39,"url":40},"Nuxt docs, nuxt dev","https:\u002F\u002Fnuxt.com\u002Fdocs\u002F4.x\u002Fapi\u002Fcommands\u002Fdev",[42,45,48,51,54,57],{"question":43,"answer":44},"What does 0 9 * * 1 mean on Cloudflare?","It runs at 09:00 UTC every Sunday. Cloudflare numbers weekdays from 1 for Sunday to 7 for Saturday, while Unix cron and croner read the same line as Monday. Write 0 9 * * SUN or 0 9 * * MON and every scheduler agrees on the day.",{"question":46,"answer":47},"Can Cloudflare Cron Triggers run in my time zone?","No. Cron Triggers run in UTC and the expression has no zone setting, so convert your local time to UTC before you write it. Where clocks change for daylight saving, a trigger fixed in UTC moves by an hour against local time twice a year. The run table on this page shows each run in UTC and in your zone side by side.",{"question":49,"answer":50},"How many cron triggers can I have on Cloudflare?","Cloudflare caps Cron Triggers per account, not per Worker, with a far higher cap on Workers Paid than on Workers Free. Each expression in a Worker's triggers.crons list is one trigger. The numbers table on this page lists both caps, read from Cloudflare's limits page.",{"question":52,"answer":53},"Why does my Nitro task run on a different day locally?","In development, Nitro runs scheduledTasks with croner, which counts weekdays from 0 for Sunday and schedules in your machine's time zone. Cloudflare counts from 1 for Sunday and runs in UTC, so a weekday digit lands a day later in nuxt dev and the hour moves by your UTC offset. Weekday names such as MON read the same in both, which is why this page rewrites digits as names.",{"question":55,"answer":56},"How do I test a Cloudflare cron trigger locally?","Run wrangler dev, or the Cloudflare Vite plugin, and request \u002Fcdn-cgi\u002Flocal\u002Fscheduled with the expression in a cron query parameter, each space written as a plus sign. Add format=json to get the handler's outcome back as JSON. For a Nuxt app, build first, and pass a cron that equals one of your scheduledTasks keys, or Nitro runs no task.",{"question":58,"answer":59},"Does Cloudflare support a seconds field in cron expressions?","No. Cron Triggers take five fields, from minute to weekday, so the finest schedule is once a minute. A six-field expression from Quartz or croner starts with seconds, and it has to lose that field before Cloudflare will take it.",[61,62,63],"cloudflare-workers-pricing-calculator","nuxt-environment-variables","cloudflare-d1-pricing-calculator",{"body":65,"to":66},"Nuxter reads the crons in wrangler.jsonc and builds Nitro's scheduledTasks from them, so the key Nitro looks up always matches the cron Cloudflare sends. Its clean-up jobs, such as pruning expired sessions, run as Nitro tasks on that trigger.","\u002Ffeatures",{"type":68,"value":69,"toc":537},"minimark",[70,75,92,95,136,157,161,299,314,318,344,349,356,360,373,403,406,410,534],[71,72,74],"h2",{"id":73},"cloudflares-cron-dialect","Cloudflare's cron dialect",[76,77,78,79,83,84,87,88,91],"p",{},"A Cron Trigger is five fields: minute, hour, day of month, month and weekday, always in UTC. Each field takes ",[80,81,82],"code",{},"*",", lists with commas, ranges with hyphens and steps with slashes. Months and weekdays also take three-letter names in any case, such as ",[80,85,86],{},"jan"," or ",[80,89,90],{},"FRI",".",[76,93,94],{},"Cloudflare adds three extensions borrowed from the Quartz scheduler:",[96,97,98,116,126],"ul",{},[99,100,101,104,105,108,109,87,112,115],"li",{},[80,102,103],{},"L"," in the day-of-month field is the last day of the month, and ",[80,106,107],{},"LW"," the last weekday, Monday to Friday. After a weekday, as in ",[80,110,111],{},"FRIL",[80,113,114],{},"6L",", it means the last Friday.",[99,117,118,121,122,125],{},[80,119,120],{},"W"," after a date, as in ",[80,123,124],{},"15W",", is the weekday nearest the 15th, without crossing into another month.",[99,127,128,131,132,135],{},[80,129,130],{},"#"," picks the nth weekday of the month: ",[80,133,134],{},"MON#1"," is the first Monday.",[76,137,138,139,142,143,146,147,149,150,152,153,156],{},"There is no seconds field, no ",[80,140,141],{},"?"," and no shortcut such as ",[80,144,145],{},"@daily",". Cloudflare's parser, saffron, reads ",[80,148,103],{}," and ",[80,151,120],{}," only as capitals. When both day fields are set, as in ",[80,154,155],{},"0 9 1 * MON",", the trigger runs on the 1st and on every Monday, not only on a Monday that falls on the 1st. saffron and croner both join the two fields with OR, the rule Unix cron documents too.",[71,158,160],{"id":159},"the-weekday-trap","The weekday trap",[162,163,164,183],"table",{},[165,166,167],"thead",{},[168,169,170,174,177,180],"tr",{},[171,172,173],"th",{},"Digit",[171,175,176],{},"Cloudflare",[171,178,179],{},"croner, Nitro dev",[171,181,182],{},"Unix cron",[184,185,186,202,216,230,244,258,272,286],"tbody",{},[168,187,188,194,197,200],{},[189,190,191],"td",{},[80,192,193],{},"0",[189,195,196],{},"Refused",[189,198,199],{},"Sun",[189,201,199],{},[168,203,204,209,211,214],{},[189,205,206],{},[80,207,208],{},"1",[189,210,199],{},[189,212,213],{},"Mon",[189,215,213],{},[168,217,218,223,225,228],{},[189,219,220],{},[80,221,222],{},"2",[189,224,213],{},[189,226,227],{},"Tue",[189,229,227],{},[168,231,232,237,239,242],{},[189,233,234],{},[80,235,236],{},"3",[189,238,227],{},[189,240,241],{},"Wed",[189,243,241],{},[168,245,246,251,253,256],{},[189,247,248],{},[80,249,250],{},"4",[189,252,241],{},[189,254,255],{},"Thu",[189,257,255],{},[168,259,260,265,267,270],{},[189,261,262],{},[80,263,264],{},"5",[189,266,255],{},[189,268,269],{},"Fri",[189,271,269],{},[168,273,274,279,281,284],{},[189,275,276],{},[80,277,278],{},"6",[189,280,269],{},[189,282,283],{},"Sat",[189,285,283],{},[168,287,288,293,295,297],{},[189,289,290],{},[80,291,292],{},"7",[189,294,283],{},[189,296,199],{},[189,298,199],{},[76,300,301,302,305,306,309,310,313],{},"Cloudflare counts weekdays the way Quartz does, from 1 for Sunday. Unix cron and croner count from 0 for Sunday and accept 7 as Sunday again. A line copied from a crontab therefore runs a day early on Cloudflare, and a line written for Cloudflare runs a day late in ",[80,303,304],{},"nuxt dev",". The names ",[80,307,308],{},"SUN"," to ",[80,311,312],{},"SAT"," mean the same day everywhere, so the tool rewrites every weekday digit it finds as a name.",[71,315,317],{"id":316},"nitro-scheduled-tasks-on-workers","Nitro scheduled tasks on Workers",[76,319,320,321,324,325,328,329,332,333,336,337,340,341,343],{},"Nuxt 4 runs on Nitro 2, where tasks sit behind ",[80,322,323],{},"experimental.tasks",". ",[80,326,327],{},"nitro.scheduledTasks"," maps a cron string to the tasks it runs. On Cloudflare, ",[80,330,331],{},"triggers.crons"," in the Wrangler file decides when the Worker wakes. Nitro's scheduled handler then takes the cron that fired, ",[80,334,335],{},"controller.cron",", and runs the tasks whose key is that exact string. A key that differs by one character, even ",[80,338,339],{},"MON"," against ",[80,342,222],{},", runs nothing in production and raises no error.",[76,345,346,348],{},[80,347,304],{}," has no Cloudflare scheduler, so Nitro runs the same keys with croner on your machine's clock. That is where both traps show up: croner reads weekday digits from 0 for Sunday, and it schedules in your local time zone rather than UTC.",[76,350,351,352,355],{},"Nitro v3, which arrives with Nuxt 5, writes the Wrangler triggers from ",[80,353,354],{},"scheduledTasks"," at build time, so the copy goes away. On Nuxt 4, keep the two lists identical, or generate one from the other.",[71,357,359],{"id":358},"test-a-trigger-before-you-deploy","Test a trigger before you deploy",[76,361,362,364,365,368,369,372],{},[80,363,304],{}," runs Nitro in Node rather than in workerd, so it has no ",[80,366,367],{},"\u002Fcdn-cgi\u002Flocal\u002Fscheduled"," route and never calls the Worker's scheduled handler. The route comes from ",[80,370,371],{},"wrangler dev"," and the Cloudflare Vite plugin, which is why the tool's curl command runs against the built Worker. Under the Vite plugin, swap 8787 for the Vite port, 5173 by default.",[76,374,375,376,379,380,383,384,387,388,391,392,395,396,399,400,91],{},"Besides ",[80,377,378],{},"cron",", the route reads ",[80,381,382],{},"time",", which sets ",[80,385,386],{},"controller.scheduledTime"," in milliseconds since the epoch, and ",[80,389,390],{},"format",": with ",[80,393,394],{},"format=json"," it returns the handler's ",[80,397,398],{},"outcome"," and whether it called ",[80,401,402],{},"controller.noRetry()",[76,404,405],{},"Once deployed, the Worker's Cron Events page in the dashboard lists recent runs, and Workers Logs keeps them for longer.",[71,407,409],{"id":408},"common-schedules","Common schedules",[162,411,412,422],{},[165,413,414],{},[168,415,416,419],{},[171,417,418],{},"Expression",[171,420,421],{},"Runs, in UTC",[184,423,424,434,444,454,464,474,484,494,504,514,524],{},[168,425,426,431],{},[189,427,428],{},[80,429,430],{},"*\u002F5 * * * *",[189,432,433],{},"Every 5 minutes",[168,435,436,441],{},[189,437,438],{},[80,439,440],{},"0 * * * *",[189,442,443],{},"Every hour, on the hour",[168,445,446,451],{},[189,447,448],{},[80,449,450],{},"0 *\u002F6 * * *",[189,452,453],{},"At 00:00, 06:00, 12:00 and 18:00",[168,455,456,461],{},[189,457,458],{},[80,459,460],{},"0 3 * * *",[189,462,463],{},"Every day at 03:00",[168,465,466,471],{},[189,467,468],{},[80,469,470],{},"30 8 * * MON-FRI",[189,472,473],{},"Monday to Friday at 08:30",[168,475,476,481],{},[189,477,478],{},[80,479,480],{},"0 9 * * MON",[189,482,483],{},"Every Monday at 09:00",[168,485,486,491],{},[189,487,488],{},[80,489,490],{},"0 0 1 * *",[189,492,493],{},"The 1st of every month at 00:00",[168,495,496,501],{},[189,497,498],{},[80,499,500],{},"0 0 L * *",[189,502,503],{},"The last day of every month at 00:00",[168,505,506,511],{},[189,507,508],{},[80,509,510],{},"59 23 LW * *",[189,512,513],{},"The last weekday of every month at 23:59",[168,515,516,521],{},[189,517,518],{},[80,519,520],{},"0 18 * * FRI#1",[189,522,523],{},"The first Friday of every month at 18:00",[168,525,526,531],{},[189,527,528],{},[80,529,530],{},"0 0 1 JAN *",[189,532,533],{},"1 January at 00:00",[76,535,536],{},"Paste any of them into the tool to see the next runs in your own time zone.",{"title":538,"searchDepth":539,"depth":539,"links":540},"",2,[541,542,543,544,545],{"id":73,"depth":539,"text":74},{"id":159,"depth":539,"text":160},{"id":316,"depth":539,"text":317},{"id":358,"depth":539,"text":359},{"id":408,"depth":539,"text":409},"cloudflare-cron-generator",null,[549,555,561],{"path":550,"tool":61,"name":551,"title":552,"description":553,"summary":554,"checkedAt":9},"\u002Ftools\u002Fcloudflare-workers-pricing-calculator","Cloudflare Workers pricing calculator","Cloudflare Workers Pricing Calculator for a SaaS","Cloudflare Workers pricing calculator for a SaaS. Turn monthly users into a bill for Workers, D1, KV, R2, Queues and AI, and find the first Free limit you hit.","Turn monthly users into a Workers, D1, KV, R2, Queues and AI bill, and find the first Free plan limit you hit.",{"path":556,"tool":62,"name":557,"title":558,"description":559,"summary":560,"checkedAt":9},"\u002Ftools\u002Fnuxt-environment-variables","Nuxt environment variables","Nuxt Environment Variables: runtimeConfig to NUXT_","Paste a nuxt.config to get the Nuxt environment variables that override each runtimeConfig key, the type each value arrives as and the names that collide.","Paste a nuxt.config and get the NUXT_ variable for every runtimeConfig key, the type it arrives as and the names that collide.",{"path":562,"tool":63,"name":563,"title":564,"description":565,"summary":566,"checkedAt":9},"\u002Ftools\u002Fcloudflare-d1-pricing-calculator","Cloudflare D1 pricing calculator","Cloudflare D1 Pricing Calculator and Batch Limits","Cloudflare D1 pricing calculator. Turn users and queries into rows read and written, check the Free plan's daily limits, and size batch inserts under D1's caps.","Rows read and written, storage and the Free plan's daily limits, plus batch sizes that fit D1's caps.",[]]