Skip to content

Cronjob.de › Guides › GitHub Actions

GitHub Actions cron not running? Start workflows on time from outside

A GitHub workflow starts on time when you trigger it via workflow_dispatch through the API instead of schedule. GitHub itself writes that schedule can be delayed under high load and that queued runs may then even be dropped. Cronjob.de sends a POST to the GitHub API at a fixed time, and the run begins. All you enter is the address, a token and the schedule. If you stay with the GitHub schedule, a heartbeat tells you when a run is missing.

Updated:

Why at all

Why scheduled GitHub workflows run late or not at all

GitHub says it in its own documentation: the schedule event can be delayed when many workflows run at the same time, especially at the start of every hour. If the load is high enough, queued runs are even dropped. A workflow meant to start at 3:00 then begins at 3:20 or not at all.

On top of that come a few rules that are easy to trip over: scheduled workflows only run on the default branch, in UTC unless you set timezone, and at most every five minutes. In a public repository GitHub disables scheduled workflows after 60 days without activity. After that, nothing happens any more.

For a Monday morning report, a nightly backup or an export another system is waiting for, that is too uncertain. The way out: the workflow gets the additional trigger workflow_dispatch, and Cronjob.de starts it at a fixed time through the API.

URL to call
https://api.github.com/repos/IHR-NAME/IHR-REPO/actions/workflows/nightly.yml/dispatches
Recommended interval
as often as the workflow should run, to the minute
Tested with
GitHub Actions (workflow_dispatch)
Sufficient Cronjob.de plan
The free plan is enough for a workflow that runs daily or hourly. Minute-precise schedules, the call log with GitHub’s response and failure emails come with Plus.

Setup

Step by step

The AI does it faster

You do not have to transfer any of this by hand. Paste this guide – or the one for your own system – into the assistant, and Cronjob.de fills in address, method, schedule and headers. Where something is unclear it asks instead of guessing. At the end you see what was entered and create the job with one click.

Included in the free plan at no extra cost. You will find it after signing in under "Cronjobs" → "Create with AI".

  1. Prepare the workflow for starting from outside

    In the workflow file, add the trigger workflow_dispatch under on:. You can remove the existing schedule or keep it as a fallback. Important: the file has to be on the default branch, otherwise the workflow cannot be started from outside.

    # .github/workflows/nightly.yml
    name: Nightly
    on:
      workflow_dispatch:
      # schedule:
      #   - cron: '0 3 * * *'
    jobs:
      work:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v7
          - run: ./scripts/nightly.sh
  2. Create a token with the “Actions” permission

    On GitHub, go to Settings → Developer settings → Personal access tokens and create a fine-grained token. Select only this one repository and, under repository permissions, Actions: Read and write. That is all the start needs. Under Expiration you set when the token expires. Note the date, because after that GitHub answers with an error and the workflow no longer starts.

  3. Create an account at Cronjob.de

    Registration takes a minute and is free. Five cronjobs stay free forever; the first 14 days run on the Unlimited plan, including the call log with GitHub’s response.

    Start for free 14 days of Unlimited included, no payment details

  4. Create the cronjob with the API address

    As the address, enter the endpoint with your name, your repository and the file name of the workflow. Right in front of the address, set the request method to POST. Below it, content type (here application/json) and request body appear; the branch goes into the body. Under headers, add the token and the format header.

    Address:         https://api.github.com/repos/YOUR-NAME/YOUR-REPO/actions/workflows/nightly.yml/dispatches
    Request method:  POST
    Content type:    application/json
    Request body:    {"ref":"main"}
    Headers:         Authorization: Bearer github_pat_…
                     Accept: application/vnd.github+json
  5. Pick the schedule

    Choose how often the workflow should run, for example daily at 3:00. Our schedules use German time (Europe/Berlin). GitHub uses UTC unless timezone is set. If you know crontab syntax, type it directly or let the AI assistant build the schedule from a single sentence.

    0 3 * * *

    You can enter this expression at Cronjob.de exactly as it is – the schedule field understands crontab notation. But you do not have to know it: simply click the schedule together instead.

  6. Switch on notifications

    Enter an email address under Notifications. If GitHub does not answer with success, for example because the token has expired, you hear about it on the first failure. Failure notifications by email are included from the Plus plan, and free during the first 14 days.

  7. Optional: monitor the run itself

    The start alone does not tell you whether the workflow runs through. Create a heartbeat for that and let the workflow report at the end: the address on success, the same address with /fail on failure. If the check-in is missing or reports a failure, we alert you. This also works if you stay with the GitHub schedule: set a generous grace period, such as one hour, so that delays do not raise an alarm, but a dropped or disabled schedule does.

          - name: Report success
            if: success()
            run: curl -fsS -m 10 --retry 3 https://runcheck.de/a8k3m2x9q1
          - name: Report failure
            if: failure()
            run: curl -fsS -m 10 --retry 3 https://runcheck.de/a8k3m2x9q1/fail

What the five fields of an expression like */5 * * * * mean is explained in the crontab reference – with examples and the most common pitfalls. You can build the expression in the crontab generator. Whether you need an outside service at all is shown in the comparison of the three ways.

Verification

Is it actually running?

Run the cronjob once by hand. The Cronjob.de call log then shows status 204 (empty response, API version 2022-11-28) or 200 with the run ID (API version 2026-03-10). Both mean: accepted. On GitHub, a new run with the trigger workflow_dispatch appears under Actions. If nothing shows up, the workflow file is usually not on the default branch or the file name in the address is wrong.

FAQ

Common questions about GitHub Actions

Why does my scheduled workflow not start on time?
According to GitHub, the schedule event is delayed under high load, especially at the start of every hour, and queued runs can be dropped entirely. There is no promise about the time. If you need to start on time, have the workflow started from outside via workflow_dispatch.
My schedule does not run at all any more.
Two common causes: in a public repository GitHub disables scheduled workflows after 60 days without activity. And scheduled workflows only run on the default branch. If the file only exists on another branch, nothing happens. A heartbeat at the end of the workflow catches both, because the check-in stops arriving.
Which response from GitHub is correct?
According to the GitHub docs, API version 2022-11-28 returns 204 with an empty response, or 200 with "return_run_details":true in the body. API version 2026-03-10 always answers 200 with the run ID. You choose the version with the X-GitHub-Api-Version header. We count both as success.
The call ends with 401 or 403.
401 means: the token is missing, mistyped or expired. 403 usually means: the token lacks the permission Actions: Read and write for this repository. Create a new token and replace the Authorization header in the cronjob.
The call ends with 404 or 422.
404: owner, repository or file name in the address are wrong, the token may not see this repository, or the method is not set to POST. For private repositories without valid authentication GitHub deliberately answers 404 instead of 403. 422: the request is invalid, usually ref is missing from the body, the branch does not exist or the workflow has no workflow_dispatch trigger.
Can I pass values to the workflow?
Yes, through inputs in the request body, for example {"ref":"main","inputs":{"environment":"production"}}. The inputs have to be defined in the workflow under workflow_dispatch:; GitHub allows up to 25.
How often can I start a workflow this way?
With us up to every minute (from Plus; in five-minute steps on the free plan); GitHub’s own schedule allows at most every five minutes. In private repositories every run counts against the Actions minutes of your GitHub account. In public repositories standard runners are free according to GitHub.
How safe is the token with you?
It is only stored in the settings of your cronjob. Still, restrict it as far as possible: a fine-grained token, only this one repository, only the Actions permission. With that, nothing can be done except starting this workflow. When you no longer need it, revoke it on GitHub.
Is your server rejecting our calls? Error 403 almost always comes from a firewall, a security plugin or directory protection – not from your script. All our calls carry the fixed identifier Cronjob.de in the user agent. Ask your host for an exception for it; that is more reliable than allowing IP addresses, because ours can change. Addresses and details in the FAQ. Other errors such as 401, 404 or 500 are explained in the troubleshooting guide.

Create your cronjob now

Create an account, enter the address, click the schedule. Five cronjobs are free forever, the first 14 days run on the Unlimited plan.

Start for free See pricing

More guides

Official documentation of GitHub Actions

The details about GitHub come from GitHub’s official documentation, as of October 2026. Please check there whether anything has changed since. GitHub and GitHub Actions are trademarks of GitHub, Inc. This guide comes from Cronjob.de and has no business relationship with GitHub.

By Joscha Schultze, operator of Cronjob.de · Written with AI assistance, provider details checked against their official pages.