GitHub Actions Scheduled Workflows
Monitor GitHub Actions scheduled workflows.
PingCron alerts you when a cron-triggered GitHub Actions workflow stops running, gets disabled by inactivity, or silently fails. One curl step and you'll know within seconds.
5 monitors free · No credit card · Live in under 60 seconds
GitHub Actions silently disables scheduled workflows after 60 days of repository inactivity.
GitHub disables scheduled workflows in repositories that haven't had activity in 60 days. The workflow file still exists. The cron expression still looks correct. The Actions tab shows a green checkmark on the last run. But the workflow simply isn't being invoked anymore — and GitHub does not send you a notification when it happens.
Beyond the 60-day rule, scheduled workflows can also fail in subtle ways. A typo in the cron expression that GitHub silently rounds. A required secret that was rotated and never re-added. A self-hosted runner that's offline. A workflow_dispatch that was meant to also be schedule-triggered but only one trigger was kept after a refactor.
The classic GitHub Actions cron failure pattern: it ran fine last week, you didn't change anything, and now it just doesn't fire. No error. No notification. Just absence.
GitHub Actions schedule failure modes:
- Repository hit 60 days of inactivity — GitHub disabled the schedule with no email
- A required secret expired and the workflow now fails on the auth step
- Self-hosted runner offline — workflow queued indefinitely with no timeout
- Cron expression was edited and the new schedule is broken or impossible
- GitHub's scheduled workflow infrastructure had an outage you never noticed
- Workflow was renamed and the old name's schedule was orphaned
Setup
Add one ping step at the end of your workflow.
If the workflow stops running for any reason, PingCron alerts you. Works for both schedule and workflow_dispatch triggers.
Before
name: Daily Sync
on:
schedule:
- cron: '0 2 * * *'
jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./sync.shAfter
name: Daily Sync
on:
schedule:
- cron: '0 2 * * *'
jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./sync.sh
- name: Ping PingCron
if: success()
run: curl -fsS https://api.pingcron.io/ping/abc123The if: success() condition ensures the ping only fires when every previous step succeeded. If a step fails, the ping never runs and PingCron alerts you after the grace period. To get instant failure alerts, add a separate step with if: failure() that pings /fail.
Real-world examples
With explicit failure ping
- name: Ping success
if: success()
run: curl -fsS https://api.pingcron.io/ping/abc123
- name: Ping failure
if: failure()
run: curl -fsS https://api.pingcron.io/ping/abc123/failStart + finish pings (catches hung workflows)
- name: Ping start
run: curl -fsS https://api.pingcron.io/ping/abc123/start
- run: ./sync.sh
- name: Ping finish
if: success()
run: curl -fsS https://api.pingcron.io/ping/abc123Reusable composite action
# .github/actions/pingcron/action.yml
name: PingCron
inputs:
monitor_id:
required: true
status:
default: success
runs:
using: composite
steps:
- shell: bash
run: |
URL="https://api.pingcron.io/ping/${{ inputs.monitor_id }}"
if [ "${{ inputs.status }}" = "fail" ]; then URL="$URL/fail"; fi
curl -fsS "$URL"What GitHub Actions schedules should you monitor?
Anything you set up with on: schedule that has to keep running.
Nightly test suites
Cron-triggered CI runs against main or production branches.
Database backup workflows
Scheduled pg_dump → S3 jobs running on Actions runners.
Reporting workflows
Daily metrics fetches, internal dashboards, weekly digests.
Dependency scanners
Dependabot-style scans, security audits, SBOM generation.
Deploy / sync jobs
Hourly content syncs, doc rebuilds, mirror pushes.
Stale issue / PR bots
Workflows that close inactive issues — silent failure breaks repo hygiene.
Cross-repo triggers
Scheduled workflow_dispatch calls into other repositories.
External API pulls
Periodic fetches from third-party APIs into repo state.
How it works
Three steps. About a minute total.
Create a GitHub Actions workflow monitor
Set the interval to match your cron expression (hourly, daily, weekly).
Add a curl step at the end of your workflow
Use if: success() so the ping only fires when every prior step succeeded.
Get alerted on missed runs
Whether GitHub disabled the workflow, the runner is offline, or a step failed — you get notified within seconds of the grace period elapsing.
Alerts where you'll actually see them.
Configure as many channels as you want per monitor.
HTML alerts with monitor details and direct links.
Slack
Post to any Slack channel via incoming webhook.
Discord
Native Discord webhook integration.
Custom webhooks
POST alerts to any endpoint with full payload.
FAQ
Don't let GitHub disable your scheduled workflow without telling you.
One curl step in your workflow. Get alerted the moment a scheduled run is missed.
Start monitoring free5 monitors free · No credit card · Live in under 60 seconds