GitHub Actions Scheduled Workflow Monitoring

Start monitoring your scheduled workflows free — up to 10 checks, no card required.

The problem

GitHub Actions scheduled workflows fail quietly. The `schedule` trigger is best-effort, not guaranteed: GitHub delays cron-triggered runs under load and disables schedules entirely after 60 days of repository inactivity, so a "nightly" workflow can simply stop firing with no error and no notification. Even when a run does start, a green checkmark only tells you the workflow completed — it says nothing about whether the run was hours late, ran far longer than usual, or quietly produced no output. And if the workflow never triggers at all, there is no failed run to alert on, because there is no run. Teams discover the gap only when the backup, migration, or sync that the workflow was supposed to perform turns out to be days stale.

How Pakyas helps

Pakyas uses execution-signal monitoring: your workflow proves it ran by sending a ping, and Pakyas compares those signals against the schedule you expect. If a scheduled run is skipped or GitHub silently disables the cron, no ping arrives and Pakyas marks the check Missing. If the run starts hours after its expected window, it is flagged Late. If it runs far longer than its normal duration, it is Overrunning. And if the job sends a failure signal or a non-zero exit, it is recorded as an Error — distinct from a run that simply never happened. Because the signal comes from inside the job rather than from GitHub's status, Pakyas catches the exact failure mode GitHub Actions hides: the scheduled workflow that never fired. Alerts route to email, Slack, Telegram, or webhooks the moment a check leaves On Schedule.

Set it up

  1. Create a check and grab its ping URL

    # In the Pakyas dashboard, create a check for your scheduled workflow
    # and set its expected schedule (e.g. cron 0 3 * * *).
    # Copy the check's ping URL — it looks like:
    #   https://ping.pakyas.com/<your-check-id>
    # where <your-check-id> is the check's public_id (a UUID).

    The ping URL has no /ping/ prefix. Success is the bare URL; append /start to signal a run beginning and /fail to signal failure.

  2. Store the ping URL as a repository secret

    # GitHub repo → Settings → Secrets and variables → Actions → New repository secret
    # Name:  PAKYAS_PING_URL
    # Value: https://ping.pakyas.com/<your-check-id>

    Storing the full URL as a secret keeps the check ID out of your workflow YAML and logs.

  3. Wrap the scheduled job with start, success, and fail pings

    name: Nightly Backup
    
    on:
      schedule:
        - cron: '0 3 * * *'   # 03:00 UTC daily
      workflow_dispatch:        # allow manual runs
    
    jobs:
      backup:
        runs-on: ubuntu-latest
        env:
          PAKYAS_PING_URL: ${{ secrets.PAKYAS_PING_URL }}
        steps:
          - uses: actions/checkout@v4
    
          - name: Signal start to Pakyas
            run: curl -fsS "$PAKYAS_PING_URL/start"
    
          - name: Run backup
            run: ./scripts/backup.sh
    
          - name: Signal success to Pakyas
            if: success()
            run: curl -fsS "$PAKYAS_PING_URL"
    
          - name: Signal failure to Pakyas
            if: failure()
            run: curl -fsS "$PAKYAS_PING_URL/fail"

    The if: success() / if: failure() pair guarantees Pakyas always receives a terminal signal. If the scheduled run never fires at all, no ping arrives and Pakyas reports the check as Missing.

A worked example

A daily Postgres backup. A scheduled workflow runs at 03:00 UTC (cron: '0 3 * * *'): it sends a /start ping, runs pg_dump and uploads the dump to S3, then sends a success ping on completion or a /fail ping if the dump or upload fails. In Pakyas you set the check's expected schedule to match the cron and add a small grace window for runner queue time. If GitHub silently disables the schedule after repo inactivity, or a run is skipped during peak load, no success ping arrives within the window and Pakyas flags the check Missing — so you learn the backup stopped running before you ever need to restore from it, instead of discovering a multi-day gap during an incident.

Pricing

Pakyas has four tiers: Free ($0, up to 10 checks), Developer ($9/mo), Pro ($29/mo), and Business ($99/mo). Most teams can start monitoring their scheduled GitHub Actions workflows on the free tier and upgrade as the number of monitored jobs grows.

See the full breakdown on the pricing page.

New to the terminology? See the cron monitoring glossary for plain-language definitions of every job state, or explore everything Pakyas tracks on the features page.

Start monitoring your scheduled workflows free — up to 10 checks, no card required.

Execution-signal precision: know when a job is Missing, Late, Overrunning, or reports an Error — not just up or down.

Start monitoring free