Know when a GitHub Actions scheduled workflow didn't run
Scheduled GitHub Actions can be delayed, dropped or auto-disabled. Add a heartbeat step to catch it.
Signed in? Open any watch in your dashboard to see this recipe with your real ping URL filled in.
GitHub's schedule trigger is best-effort: runs can be delayed during busy periods, and scheduled workflows in public repositories are automatically disabled after 60 days without repository activity. Neither sends you an alert.
Add start, success and failure pings
yaml
name: nightly-report
on:
schedule:
- cron: "0 6 * * *" # 06:00 UTC
workflow_dispatch:
jobs:
report:
runs-on: ubuntu-latest
steps:
- run: curl -fsS -m 10 --retry 3 https://diditrun.app/p/YOUR-TOKEN/start
- uses: actions/checkout@v4
- name: Do the work
run: ./scripts/report.sh | tee output.txt
- name: Heartbeat (success)
if: success()
run: curl -fsS -m 10 --retry 3 -X POST --data-binary @output.txt https://diditrun.app/p/YOUR-TOKEN
- name: Heartbeat (failure)
if: failure()
run: curl -fsS -m 10 --retry 3 -X POST -d "run ${{ github.run_id }} failed" https://diditrun.app/p/YOUR-TOKEN/failStore the URL as a repository secret (e.g. HEARTBEAT_URL) if the repo is public.
Match the schedule
GitHub cron is in UTC. Create the watch with 0 6 * * * in UTC and a grace window of 30–60 minutes, since scheduled runs often start late.