Skip to main content

T+00:00

Your alerting is configured. Nobody has checked it wakes anyone up.

Find out whether your alerting catches data loss, before it has to.

DataLossSimulator sends a synthetic failure event to your own webhook, Slack channel or PagerDuty service, then records whether an alert reached a human and how long that took. Nothing in your systems is read, changed or deleted — every scenario is a payload that describes a failure, never one that causes it.

Example run — bulk record deletion

Scenario fired

00:00:00

Gap

Alert received

--:--:--

Detection target: 15 minutes

Awaiting detection…

An illustration of the record a run produces, not live data. Your own runs are scored the same way, from the times you log.

T+00:41

Monitoring coverage is usually asserted, never measured

Somebody added the alert eighteen months ago. The query still runs. Nobody has watched it fire since. The failure modes that survive that long are the quiet ones — a job that exits 0 with an empty file, a cascade that removes more rows than intended, a backup window that passes with no run at all. Nothing errors, so nothing pages.

alert.existsThe alert is still there
Dashboards get rebuilt, queries get renamed, a threshold gets muted during an incident and never unmuted. None of that produces an error.
alert.routesIt reaches someone awake
A rule that posts to a channel nobody watches at 03:00 is indistinguishable from a rule that works, right up until the night it matters.
alert.timelyIt fires soon enough to matter
Detection that arrives four hours after a bad delete is a post-mortem, not a response. The gap is the number worth measuring.

T+04:12

One scenario, in full

Export job silent failureThe failure mode where nothing errors. The job reports success, the file lands, and the file is empty. Your alerting has to notice the size, not the exit code. This is the entire body your endpoint receives, marked synthetic on three separate fields so an engineer woken by it knows in one line that it is a drill.

POST → your webhook endpoint

{
  "source": "datalosssimulator",
  "synthetic": true,
  "event": "drill.fired",
  "run_id": "run_example",
  "fired_at": "2026-01-01T02:00:00.000Z",
  "scenario": {
    "id": "export-silent-failure",
    "name": "Export job silent failure",
    "category": "export"
  },
  "summary": "[DRILL] Export job silent failure — Nightly export writes a 0-byte file and exits 0.",
  "signal": {
    "job": "nightly_export",
    "exit_code": 0,
    "bytes_written": 0,
    "expected_rows_min": 50000
  },
  "note": "Synthetic drill from DataLossSimulator. No production data was read, changed or deleted."
}

Slack and PagerDuty destinations get the same event in their own message shape. Six scenarios ship in the library, across data deletion, export and backup, and dependency outage.

T+15:00

How a run is scored

You set a detection target when you schedule the run — the number of minutes inside which an alert should have reached a human. After the event fires you log what actually happened, and the run resolves to one of three states.

  • caught_fastAn alert reached a human inside the target.
  • caught_lateAn alert arrived, after the target had passed.
  • missedNothing reached a human at all.

T+30d

What builds up over time

Each run lands on a dated timeline with the scenario, the destination, the delivery result and the measured gap. That turns “we probably have monitoring for that” into a record you can point at in a review.

Being exact about this version: runs fire when you press the button, and outcomes are self-reported. The timeline is stored in your browser, so it belongs to the browser you used and disappears if you clear site data — export it from Settings if you want to keep it. Accounts, unattended monthly scheduling and digest emails are not built yet; a monthly cadence is recorded as a reminder on the dashboard and nothing fires without you.

T+90d

Pricing

One plan, $49.99 per month. Nothing in the app is behind a paywall today — every scenario, every run and the full history are available without paying. The pricing page states exactly what checkout does on this deployment.