GitHub Actions + Sandglass: Monitor Scheduled Workflows

Scheduled workflows that go quiet are the hardest failures to catch. Sandglass catches them.

Add a heartbeat ping to any GitHub Actions scheduled workflow so Sandglass knows it ran. If the workflow silently stops firing, Sandglass opens an incident before your users notice.

Requirements

  • A GitHub repository with at least one scheduled workflow (cron trigger)
  • Permission to add repository secrets
  • A Sandglass heartbeat check with its URL stored as the SANDGLASS_HEARTBEAT_URL repository secret
  • A Sandglass account on any plan (heartbeat checks are available on the free tier)

How to connect

Step 1: Create a heartbeat check in Sandglass

In Sandglass, add a new Heartbeat check. Set the expected interval to match your workflow schedule — for example, 60 minutes for an hourly cron. Copy the heartbeat URL shown after saving.

Step 2: Store the heartbeat URL as a repository secret

In your GitHub repository, go to Settings > Secrets and variables > Actions and create a new secret named SANDGLASS_HEARTBEAT_URL. Paste the heartbeat URL as the value. Secrets are encrypted and never appear in logs.

Step 3: Add the heartbeat step to your workflow

At the end of your job steps, add a step that runs: "curl -fsS -m 10 --retry 3 \"${{ secrets.SANDGLASS_HEARTBEAT_URL }}\"". Because it comes last, it only fires when all preceding steps succeed. A failed earlier step skips it, and Sandglass opens an incident when the heartbeat goes missing.

Step 4: Verify the first run

Trigger the workflow manually via "Run workflow" or wait for the next scheduled run. In Sandglass, the heartbeat check should flip to "Up" within seconds of the curl completing. If it stays pending, check the Actions run log to confirm the curl step executed and returned 200.

What you can do

  • Catch silently broken schedules: GitHub does not alert you when a scheduled workflow stops running. Sandglass does. If the cron fires but the job fails before the heartbeat step, or if GitHub skips the run entirely, Sandglass opens an incident.
  • Zero infrastructure overhead: The integration is a single curl command in your YAML. No external services, no tokens beyond the heartbeat URL, no webhook receivers to maintain. The heartbeat URL itself is the entire integration.
  • Works with matrix builds: For matrix workflows, ping the heartbeat from a final job that depends on all matrix legs using "needs: [build]". That way a single heartbeat confirms every matrix combination completed, not just one.
  • Explicit failure reporting: The /fail suffix on the heartbeat URL lets you open a Sandglass incident immediately on job failure rather than waiting for the heartbeat window to expire. Combine both: ping the normal URL on success, ping /fail on failure.

Frequently Asked Questions

Know when your scheduled workflows go quiet

Start free

Free plan, no credit card required.