Monitor your first cron job in under 2 minutes.
Log in, click New monitor, give it a name and set how often your job runs. You'll get a unique ping URL.
Call the ping URL at the end of your job. That's it — if we don't hear from it, we alert you.
Enable duration monitoring in the monitor settings, then use the two-call pattern. We track how long your job takes and alert you if it runs unexpectedly slow.
Pass a count parameter with your ping. DeadManCheck will alert you if your job runs but processes zero rows — catching silent failures that duration monitoring misses entirely.
# Simple heartbeat
curl -s https://deadmancheck.io/ping/YOUR-ID
# With duration tracking
curl -s https://deadmancheck.io/ping/YOUR-ID/start
./your_job.sh
curl -s https://deadmancheck.io/ping/YOUR-ID
# With output assertions — alert if count is 0
ROWS=$(./your_job.sh)
curl -s -X POST -H "Content-Type: application/json" \
-d "{\"count\": $ROWS}" \
https://deadmancheck.io/ping/YOUR-ID
# Report failure
curl -s "https://deadmancheck.io/ping/YOUR-ID/fail?exit_code=1"
import httpx
PING_URL = 'https://deadmancheck.io/ping/YOUR-ID'
# At start
httpx.get(f'{PING_URL}/start')
# ... your job ...
rows_processed = run_etl()
# On success — pass row count for output assertions
httpx.post(PING_URL, json={'count': rows_processed})
# On failure
httpx.get(f'{PING_URL}/fail', params={'exit_code': 1})
- name: Run job
id: job
run: |
./your_job.sh
echo "rows=$(cat /tmp/row_count.txt)" >> $GITHUB_OUTPUT
- name: Ping DeadManCheck
if: success()
run: |
curl -s -X POST -H "Content-Type: application/json" \
-d "{\"count\": ${{ steps.job.outputs.rows }}}" \
https://deadmancheck.io/ping/YOUR-ID
- name: Report failure
if: failure()
run: curl -s https://deadmancheck.io/ping/YOUR-ID/fail
const PING_URL = 'https://deadmancheck.io/ping/YOUR-ID';
await fetch(`${PING_URL}/start`);
try {
const rowsProcessed = await yourJob();
// Pass count — alerts if job ran but processed nothing
await fetch(PING_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ count: rowsProcessed })
});
} catch (err) {
await fetch(`${PING_URL}/fail?exit_code=1`);
throw err;
}