Cronjob.de › Guides › GitHub Actions
GitHub Actions cron not running? Start workflows on time from outside
With schedule, GitHub runs workflows on a timetable – but without any promise of exactly when. If you have to rely on it, have the workflow started from outside instead: Cronjob.de calls the GitHub API at a fixed time, and the run starts right away. This guide shows both ways: starting on time and, if you stay with the GitHub schedule, at least noticing when a run is missing.
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 a time zone, 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".
-
Prepare the workflow for starting from outside
In the workflow file, add the trigger
workflow_dispatchunderon:. You can remove the existingscheduleor 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@v4 - run: ./scripts/nightly.sh -
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. Mind the lifetime: without your own setting the token expires after 30 days. Choose a longer lifetime and note the date.
-
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.
-
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. In the Advanced tab, set the request method to POST, the content type to
application/jsonand put the branch into the request body. Under custom 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"} Custom headers: Authorization: Bearer github_pat_… Accept: application/vnd.github+json -
Pick the schedule
Choose how often the workflow should run – for example daily at 3:00. Our schedules use German time (Europe/Berlin), not UTC as on GitHub. 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.
-
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.
-
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
/failon 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 a response with status 204 (or 200, depending on GitHub’s API version) – 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
scheduleevent 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 viaworkflow_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?
- Status
204 No Contentwith an empty response, or200with the details of the started run on the newer API version. We count both as success. - The call ends with 401 or 403.
401means: the token is missing, mistyped or expired.403usually means: the token lacks the permission Actions: Read and write for this repository. Create a new token and replace theAuthorizationheader in the cronjob.- The call ends with 404 or 422.
404: owner, repository or file name in the address are wrong, or the token may not see this repository.422: the workflow has noworkflow_dispatchtrigger, or the branch given inrefdoes not exist.- Can I pass values to the workflow?
- Yes, through
inputsin the request body, for example{"ref":"main","inputs":{"environment":"production"}}. The inputs have to be defined in the workflow underworkflow_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. Keep the Actions minutes of your GitHub account in mind: every run uses them.
- 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.
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 pricingMore guides
- Webspace
- Windows
- WordPress
- Nextcloud
- Contao
- Drupal
- Joomla
- All-Inkl (KAS)
- STRATO
- IONOS
- Matomo
- Dolibarr
- phpList
- Firefly III
- Host Europe
- Gambio
- Shopware
- JTL-Shop
- Moodle
- WooCommerce
- Doofinder
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.