Skip to content
← All recipes

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/fail

Store 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.

Set it up free

3 watches free on Did It Run?. No credit card.

Create your first watch