doneyet. Sign in
Heartbeat tracking & alerting for background work

Know the moment a job is stuck, late, or done.

doneyet watches your CI pipelines, cron jobs, and batch workflows. When a run stalls, overruns its window, or fails — you get paged. When it finishes — you see it. No more silent failures.

Free tier, no credit card. Producer libraries are open source (Apache 2.0).

A run that goes quiet
START HEARTBEATS NOTHING ARRIVES GRACE WINDOW STALL RAISED ON-CALL PAGED NOBODY HAD TO BE WATCHING. EXAMPLE

Built for the jobs nobody is watching

Specification

CI runs, k8s CronJobs, ETL, nightly batches — the work that only gets noticed when it silently stops.

Heartbeat & stall detection

Register a run, heartbeat while it works, finish when it's done. Miss a heartbeat past the grace window and doneyet raises a stall before anyone notices.

Alerts that reach you

Stall, overrun, failure, or SLA-at-risk — routed to Slack, PagerDuty, Opsgenie, MS Teams, or a signed webhook. Hysteresis + circuit breakers keep flapping runs from paging twice.

A registry of everything that runs

Every workflow and run in one place, with live status, durations, and history. Stop grepping CI logs to answer "did the nightly job run?"

Drop-in producers

A shell wrapper, a k8s sidecar, a GitHub Actions step, or the dyt CLI. Open-source libraries — wrap an existing job in minutes, no rewrite.

SLA windows & overrun

Give a job a deadline. doneyet warns before the SLA is breached and flags overruns, so a "successful" job that ran 3× too long doesn't slip by.

Trends & metrics

p50/p95 durations, success rates, and a Prometheus endpoint — see a job getting slower before it starts failing.

Pulse — data freshness & volume

Watch the data , not just the run. Alert when a table updates late or a load writes the wrong row count — see Pulse ↓

Three calls. That's the integration.

Hold the lever, then release it deliberately

Wrap any job — CI step, cron entry, container — with start / heartbeat / finish. doneyet does the watching.

  1. 1

    Register the run

    Your job calls start at the top. doneyet now expects it to finish within its grace + SLA window.

  2. 2

    Heartbeat while it works

    Long jobs ping every few seconds. Go quiet past the grace window and a stall alert fires automatically.

  3. 3

    Finish — or get paged

    Call finish on success/failure. No finish, no heartbeat? doneyet pages on-call so a dead job never sits silent.

Prefer clicks to code? Everything's in the dashboard.

No terminal required. Here's where things live and what to put in the form — full click-by-click walkthrough on the Get started page.

FieldWhat to put
NameA human name for the job — e.g. Nightly Export. The slug auto-fills from it (the id your job/CLI references).
Check-in graceHow long the run may go silent before doneyet raises a stall. Set it a little above your longest gap between heartbeats — e.g. 2m.
Expected durationRoughly how long a normal run takes — e.g. 10m. doneyet flags runs that overrun it, catching a "succeeded" job that ran 3× too long.
Then…Hit Create, open the workflow's Connect tab for a paste-ready snippet, and wire a channel in Admin → Notifications so breaches reach you.

Pulse — watch the data, not just the job

A run can say ✓ succeeded and still leave a table stale or half-loaded. Pulse monitors the asset — freshness and row volume — and pages you on the breach a green run hides.

One monitor per asset: freshness_max_lag_s (update by when) and/or a volume floor, ceiling, or anomaly sensitivity . Slack/PagerDuty routing reuses your existing alert rules.

Push: one HTTP call at the end of a pipeline step, from whatever scheduler you run — Airflow, dbt, Dagster, k8s CronJob, a bash line. Bridge: set source_workflow_slug and Pulse derives freshness from that doneyet workflow's last successful run — no producer change.

Stale or off-volume opens one deduped incident and fans out through your channels as on_stale / on_volume . Goes healthy again → it resolves itself. Test paging up front with dyt pulse monitor test .

Already run jobs through doneyet? The bridge gives those assets freshness monitoring for free. Bringing an external scheduler? One observe call wires it — no agent, no polling.

Pulse pricing & how it beats the incumbents →

Simple, per-organization pricing

Rating plate

One flat price per org — not per seat. One pooled allowance of API + workflow calls; pick the tier that fits your volume.

Free

$0
  • 300 API + workflow calls / mo
  • Up to 5 workflows
  • Slack & email alerts
Start free

Starter

$29 / org / mo
  • 1,000 API + workflow calls / mo
  • Up to 25 workflows & 25 Pulse monitors
  • + PagerDuty, MS Teams, webhooks
Start Starter

Team

$149 / org / mo
  • 4,000 API + workflow calls / mo
  • Up to 100 workflows & 100 Pulse monitors
  • Pulse volume anomaly · SSO · all channels
Start Team

Business & Enterprise

Custom
  • Unlimited workflows & monitors
  • Audit log · SCIM · custom hosting / BYOC
  • Priority support & SLA
talk to us

A "call" = one workflow run or one API request. Hard-stop at your plan's allowance (no surprise overage); upgrade any time. Business & Enterprise are billed manually —

Frequently asked questions

Cron monitoring, dead man's switches, and data freshness — the short version.

What is cron job monitoring, and how do I know if a cron job failed?

Cron job monitoring watches your scheduled jobs and alerts you when one fails, stalls, or never runs at all. Instead of grepping logs after the fact, your job checks in with doneyet at the start and end of each run — if it fails or misses its expected check-in, doneyet raises an alert, so a silently failed cron job never goes unnoticed.

What is a dead man's switch for cron jobs?

A dead man's switch alerts you when something expected stops happening. Your job "checks in" with doneyet on each run; if a check-in never arrives within its grace window, doneyet fires an alert. This catches the worst failure mode — a job that dies silently and simply never runs — which log- or exit-code-based monitoring completely misses.

How does doneyet detect a stalled or stuck job?

You wrap a job with three calls: start, heartbeat, and finish. Long-running jobs send a heartbeat while they work; if doneyet stops receiving heartbeats past the grace window, or the job never calls finish, it flags the run as stalled and pages your on-call — before anyone notices the output is missing.

Do I need to install an agent or SDK?

No. doneyet works over plain HTTP, so any job that can make a web request can report in — a shell one-liner, a GitHub Actions step, an Airflow or dbt task, a Kubernetes CronJob, or the dyt CLI. There is no agent, daemon, or polling to run and maintain.

What is data freshness monitoring (Pulse)?

Pulse watches your data assets instead of your jobs. It alerts when a warehouse table updates late (freshness) or writes an unexpected row count (volume) — catching a "successful" pipeline that still left a table stale or half-loaded, a failure that run-level monitoring can't see.

Is doneyet free?

Yes — doneyet has a free plan with no credit card, enough to monitor a handful of workflows and data assets. Paid plans (Starter $29/month, Team $149/month) add more monitors, notification channels, SSO, and Pulse volume-anomaly detection.

Stop finding out the hard way.

Wrap your first job in a few minutes and let doneyet tell you when something's wrong.

Start free