Payments are experiencing issues due to temporary restrictions in Russia. If your payment does not go through, please submit a support request.Our support team is available 24/7 — we are always here to help with hosting and server issues.We are now accepting requests for dedicated server rental and colocation services in our data center.Reminder: we recommend enabling backups for additional data protection.A new VPS/VDS lineup with NVMe storage and improved performance is now available.Maintenance work on some servers has been completed. All services are operating normally.
Article4 min readViews0

Cloudflare Workers Skipped and Duplicated Cron Triggers: What to Check After the Outage

The October 26–27 incident affected part of the Cloudflare Workers schedules: jobs could be delayed, skipped, or launched again. We examine how to perform a safe reconciliation without a mass restart.

Comments 0

Several wooden metronomes in a bright room: one spot is empty, while two mechanisms stand nearby
In this article

If a business task was executed via a Cloudflare Workers schedule, check the window from 00:48 to 04:15 MSK on October 27: some Cron Triggers may have started late, failed to start, or run more than once. The incident is already closed, so verifying actual results is now critical. For a specific project, skips and repeats have not yet been confirmed: first verify them against logs and business data. A mass repeat without this verification can create duplicates.

Cloudflare began its investigation on October 26 at 21:48 UTC and reported the affected portion of Workers schedulers. The incident card lists three observed variants: late start, skip, and multiple starts. The status was changed to "resolved" on October 27 at 01:15 UTC. This is a service status update, not proof of an error in every project on Workers.

In a message from October 23, Cloudflare had already described a similar incident involving delayed, skipped, and repeated Cron Triggers. The recurrence of the event is a reason to check not only the provider's logs but also how the task handles a repeat or a missing single run.

Who Needs to Perform the Check

A Cron Trigger is a schedule that invokes a handler scheduled() in a Cloudflare Worker. It can trigger catalog synchronization, report preparation, temporary data cleanup, sending notifications, or calls to an external API. If a project does not use Workers Cron Triggers, this incident does not explain its skipped job.

  • Compile a list of Worker scripts that had active Cron Triggers during the specified window.
  • Separately, flag jobs with irreversible consequences: money deductions, order modifications, email dispatch, inventory exports, or data deletion.
  • Record the expected launch time for each job in UTC: Cloudflare executes Cron Triggers in UTC, even if the team discusses the schedule in Moscow time.

What to Check After the Incident

Start with the history of a specific Worker. In the Cron Triggers documentation, Cloudflare states that the Cron Events section stores the 100 most recent invocations, while Workers Logs provides a longer history. The invocation history shows the handler's operation, but the outcome of the business operation must still be verified in the system it modifies.

  1. For each expected time, find the corresponding invocation: on-time, late, missing, or repeated.

  2. Match the invocation with the result: a generated report, an updated record, a sent message, or an external API confirmation.

  3. For duplicates, check whether two business operations with the same purpose were created. Do not rely on just two lines in the Worker log: the second run may have completed before the data changed.

  4. For skips, determine whether the task can be safely executed later. Use the original period and a stable operation identifier if the system contract allows it.

  5. Record the decision for each disputed run: the result was already obtained, the duplicate was neutralized, the task was executed later, or the skip was accepted consciously.

The event ScheduledEvent corresponds to the scheduled run. The scheduled() handler documentation describes the scheduledTime field with the scheduled time and the waitUntil() method for registering asynchronous tasks whose results affect the call status. These details help link a late actual run to the original schedule, but they do not replace the business identifier for the order, report, or period.

Why You Cannot Simply Repeat the Entire Window

A skipped export can sometimes be performed later. Resending an email is annoying, but recharging a buyer or creating a second order already changes data. Therefore, a single action "run everything again" mixes different risks.

A safe task must recognize already processed operations. For a report, such a key can be a time period; for an import, a package version; for an event, a stable event_id. If the task triggers a webhook, a separate analysis is useful regarding why a retry must not create a second order. The mechanism depends on the system, but the criterion is one: a retry with the same intent must not produce a second business result.

When the Check Can Be Closed

  • For each critical schedule, expected and actual launches within the incident window are known.
  • Late and missed jobs are reconciled against business data, not just the Worker log.
  • Retries did not create duplicates, or duplicates were identified and handled via standard procedure.
  • Tasks with consequences received a verifiable re-run key and an observable outcome.

At the time of preparing this material, Cloudflare marked the incident as resolved. This is not a reason to assume consequences are automatically fixed within each project: the provider restored the scheduler, but the application owner must confirm that the required operations were performed exactly within the allowable count during the disputed window.

Discussion 0

Share your experience and ask questions. Comments without links appear after editorial review.

No comments yet. Start the discussion.