Heartbeat monitoring for scheduled jobs
Find out when a scheduled job doesn't run.
Backups, invoice syncs, certificate renewals and report exports fail quietly. Add one curl line to each job. Oak Creek works out when the next ping is due from its cron schedule and time zone, and alerts your team when it is late, fails or runs far longer than usual.
No agent. Outbound HTTPS only. Plans from $19 a month for 50 checks.
/etc/cron.d/pg-backup
# /etc/cron.d/pg-backup (runs 02:15 America/Los_Angeles)
15 2 * * * deploy \
curl -fsS -m 10 --retry 3 https://ping.oakcreekventures.xyz/7f3c2a91/start && \
/opt/scripts/pg_backup.sh > /tmp/pg_backup.log 2>&1; \
curl -fsS -m 10 --retry 3 --data-binary @/tmp/pg_backup.log \
https://ping.oakcreekventures.xyz/7f3c2a91/$? $ oakcreek checks show nightly-pg-backupschedule 15 2 * * * (America/Los_Angeles)grace 20mlast start 2026-10-29 02:15:03 PDTlast end 2026-10-29 02:38:41 PDT exit=0 23m38sstatus UP next expected 2026-10-30 02:15 PDT
From first check to first alert in about ten minutes
- 01
Create a check
Give it a name, a cron expression such as 15 2 * * *, the time zone it runs in and a grace period. Oak Creek returns a unique ping URL.
- 02
Add the ping to your job
Call the URL with curl, wget, PowerShell Invoke-RestMethod or any HTTP client. Send /start before the work and the exit code after it.
- 03
Choose who hears about it
Route each check to a Slack channel, a Microsoft Teams channel, a PagerDuty service, email addresses or your own webhook.
- 04
Read the run history
Every run shows start time, duration, exit code and the last lines of output, so the first question after an alert already has an answer.
Late is measured against the schedule
A check knows its cron expression, time zone and grace period. If nightly-pg-backup should ping at 02:15 with a 20-minute grace period and nothing has arrived by 02:35, the check turns Late and the first alert goes out. Silence is treated as a failure, which is how most broken cron jobs actually look.
- Cron expressions or simple periods (every 15 minutes, every 6 hours)
- IANA time zones, with daylight saving changes handled
- Tags such as prod, billing or client-acme-staging for filtering and routing
- Checks
- Runs
- Integrations
- API keys
- Settings
Checks
Project: production
| Check | Last ping | Status |
|---|---|---|
| nightly-pg-backup prod, db | 6h ago | Up |
| stripe-invoice-sync billing | 41m ago | Late |
| certbot-renew web | 3d ago | Up |
| s3-log-rotate infra | 9h ago | Down |
- Checks
- Runs
- Integrations
- API keys
- Settings
nightly-pg-backup
Last 14 runs
- Median duration
- 23m 40s
- Last run
- 58m 12s
- 2.5x median
- Failed runs
- 1
- exit=2 on Oct 21
Failures and slow runs, not only missing ones
Send the exit code with the final ping and any non-zero result is a failure. Send /start as well and Oak Creek records how long each run took. Set a maximum duration, or let it flag runs that take more than twice the median, a common sign of a growing table or a stuck lock.
Alerts that escalate and close themselves
Start with a Slack or Microsoft Teams message. If the check is still down after a delay you choose, open a PagerDuty incident or email the on-call address. When the next good ping arrives, Oak Creek posts the recovery and resolves the incident, so nobody has to remember to close it.
- Checks
- Runs
- Integrations
- API keys
- Settings
stripe-invoice-sync
Today, PDT
- Expected ping not received (grace 10m) 09:40
- Oak Creek posted to Slack #billing-alerts 09:40
- Oak Creek opened a PagerDuty incident (still down after 30m) 10:10
- Ping received, exit=0, 2m 08s 10:22
- Oak Creek resolved the PagerDuty incident 10:22
Who uses Oak Creek, and what they monitor
Product engineering teams
Background work that runs outside the request path and nobody watches.
- Kubernetes CronJobs and Celery beat tasks
- Nightly database dumps to S3 or Backblaze B2
- Payment and invoice reconciliation with Stripe
Agencies and dev studios
Many client sites, one place to see which scheduled tasks stopped.
- WordPress WP-Cron and Laravel Scheduler jobs
- Let's Encrypt certificate renewals
- One project per client, with separate alert routes
IT and systems administrators
Scripts on servers and NAS boxes that only get noticed when a restore is needed.
- Windows Task Scheduler and PowerShell scripts
- rsync, restic and Veeam job wrappers
- systemd timers on Linux hosts
What we store, and how we protect it
Oak Creek is built to receive as little as possible. A ping carries a timestamp, source IP, user agent and an optional exit code. Output is only stored if you send it.
- Encryption
- TLS 1.2+ for every ping and API call. Stored data, including log tails, is encrypted at rest.
- Limited output
- At most the last 10 KB of a request body is kept per run. Strip secrets before sending; we never ask for credentials.
- Scoped keys
- Ping URLs can be rotated at any time. API keys are either read-only or read-write, per project.
- Export and deletion
- Export checks and run history as JSON or CSV. Deleted projects are purged from production systems within 30 days.
- Access
- Team members get Owner, Admin or Viewer roles. Viewers can see status and history but cannot change alerts.
- Support response
- Email replies within one business day on Starter and Team, within four business hours on Business.
Questions engineers ask first
Do I need to install an agent or open a port?
No. Your job makes an outbound HTTPS request to Oak Creek. Nothing listens on your servers and Oak Creek never connects into your network.
What happens if the ping itself fails because of a network blip?
Use curl's --retry flag as in the example above. If no ping arrives within the grace period, the check goes Late and then Down, which is usually what you want to know anyway.
How do you handle daylight saving time?
Cron checks store an IANA time zone such as America/Los_Angeles or Europe/Berlin. Expected run times are calculated in that zone, so a 02:15 job is still expected at 02:15 local time after the clock changes.
Can I see why a job failed?
Yes, if you send it. Post the job's output in the body of the final ping and Oak Creek keeps the last 10 KB with that run. Without a body, you still get the exit code and duration.
What counts toward my plan?
Checks. Each monitored job is one check, regardless of how often it runs or how many people on your team receive alerts.
Can we pause alerts during a deploy or maintenance?
Yes. Pause a single check, or create a maintenance window for a tag such as prod-db so alerts are held until the window closes.
Put your most important job under watch today
Email us to open a 14-day trial with Team limits. No card needed to start.