GitHub Actions: check whether scheduled work finished

By Austin Oaks Solutions, maker of Job Heartbeat.

A daily report or recurring export can miss its deadline even when the last completed run was green. GitHub documents that scheduled Actions runs can be delayed, and queued jobs may be dropped under heavy load. Scheduled workflows also run from the default branch; in public repositories, 60 days without repository activity can disable them.

An outside completion heartbeat gives you another signal: did this job reach its success point before the next expected deadline? Keep your existing GitHub notifications and checks.

1. Choose one job with a clear expectation

Start with a noncritical recurring job that is safe to pause. Check its schedule, timezone, normal duration and enabled state. GitHub suggests avoiding the start of the hour to reduce scheduling delays; this does not guarantee an on-time run.

Create a matching check in Job Heartbeat. Allow for normal run time and the first scheduled execution. Read the browser setup timing note before choosing a cadence:
https://beat.austinoaksapi.com/#browser-onboarding

An interval monitor needs a predictable completion interval. A weekday-only or irregular schedule needs separate consideration; do not assume that a daily setting understands weekends or your cron expression.

2. Decide what must succeed

Put the heartbeat after the result you care about. If the job generates and uploads a report, validate the report and finish the upload first. Required failures must stop the successful path. A skipped step, ignored error or empty result must not silently qualify as completed work.

For a single job, the existing integration example uses a final step guarded by success(). That checks step status; your workflow still has to validate its output. With several dependent jobs or a matrix, do not treat one successful branch as completion of all required work.

3. Keep the heartbeat URL private

Store your unique heartbeat URL as a GitHub Actions secret named JOB_HEARTBEAT_URL. Pass that secret to the final step as an environment variable with the same name. Do not put the URL directly in a workflow file, screenshot, issue or shared example, and avoid debug logging that exposes it.

Use the GitHub Actions example in our integration guidance as the starting point:
https://austinoaksapi.com/docs

Send one heartbeat after the complete successful run. Keep it out of an always-running cleanup step. During setup, inspect the HTTP result privately and confirm that Job Heartbeat recorded the signal. A successful shell command alone is not the whole acceptance check.

4. Check a later run and actual alert receipt

After initial setup, wait for a later scheduled run and confirm that its heartbeat was recorded. When safe, pause only this noncritical workflow long enough to pass the monitor's alert deadline. Verify that the alert email actually reaches your inbox. Resume the workflow and confirm another scheduled completion.

Do not rely on the alert until you have checked receipt yourself. A provider accepting an email does not establish delivery to your inbox. Job Heartbeat records a completion signal; it does not independently verify report accuracy or repair the workflow.

Start with one recurring job

Review Job Heartbeat and its free plan before choosing a pilot:
https://austinoaksapi.com/job-heartbeat

You do not need to send us your repository, logs, workflow credentials or private output.

This is a documentation-based guide prepared with AI assistance. We have not executed this GitHub Actions setup or verified alert receipt for this guide. It is not a tested, ready-to-import workflow.

Sources

GitHub scheduled workflows: https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows#schedule
GitHub Actions secrets: https://docs.github.com/en/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets
GitHub status checks: https://docs.github.com/en/actions/reference/workflows-and-actions/expressions#status-check-functions