Guides · CI · scheduled workflows

Alert if a GitHub Action never ran

GitHub emails failed runs. It does not email a scheduled workflow that never started. Add a heartbeat step on success. If the ping stops, Gonewatch alerts you.

How it works

  1. 1

    Create a monitor

    Fixed time of day if the workflow is on a cron schedule. Rolling interval if you expect a success after each deploy.

  2. 2

    Store the URL as a secret

    GONEWATCH_URL = the full heartbeat URL. Never commit the token.

  3. 3

    Ping on success only

    A final step with if: success() POSTs the heartbeat. Failures skip it so the miss is visible.

Last step in the workflow

GitHub Marketplace

Install gonewatch/heartbeat from the GitHub Marketplace. Same POST as curl — the Action is the installable step.

- name: Gonewatch heartbeat
  if: success()
  uses: gonewatch/heartbeat@v1
  with:
    url: ${{ secrets.GONEWATCH_URL }}

Set GONEWATCH_URL to the full https://www.gonewatch.com/api/heartbeat/… URL from the monitor page. curl still works: curl -fsS -X POST "$GONEWATCH_URL".

Silence is the failure

What this catches

A disabled schedule, a forked repo that lost the cron, Actions minutes exhausted, or a workflow file removed in a merge.

What this is not

Not a replacement for GitHub’s failure emails. Use those for red X’s. Use Gonewatch for jobs that never ran at all.

GitHub Actions questions

Silence versus a failed run.

Doesn't GitHub already email me when a workflow fails?

It emails failures. It does not email a workflow that never started — a disabled schedule, a missed cron, or a repo that stopped running. The heartbeat is for silence.

Where do I put the secret?

Repo or environment secret, for example GONEWATCH_URL, set to the full heartbeat URL from the monitor page. The step should run only on success.

Should I use the GitHub Action or curl?

Same endpoint. Prefer uses: gonewatch/heartbeat@v1 if you already write workflows. curl -fsS -X POST "$GONEWATCH_URL" is equivalent if you already have it.

Fixed time or rolling interval?

If the workflow is on a schedule (weekdays at 6 AM), use fixed time of day. If it runs after every deploy, use a rolling interval that matches how often you expect a success.

More guides

Watch one scheduled workflow

Free plan. One secret, one Action step, email if the schedule goes quiet.

Create a monitor