← All use cases

Jobs & cron outcomes

When a job needs a decision, not just a red checkmark.

9:41
Roundtrip
Failed

Nightly backup failed

The 02:00 job exited non-zero. Retry it, snooze it, or look.

Job
nightly-backup
Exit code
1
Started
02:00 UTC
Duration
8m 12s
The round trip

A notification that opens into a decision

Every Roundtrip request is one loop: something happens, a person decides on their phone, and the decision lands back in your app, signed.

  1. 1
    Trigger

    The trigger

    A scheduled job, backup, or long-running command finishes in a state that needs a human call — failed, partially succeeded, or waiting on a yes before it continues.

  2. 2
    Ask

    The ask

    Roundtrip delivers the outcome with the exit status and a link to the run, plus actions like Retry, Snooze, or View logs. The on-call engineer chooses without opening a laptop.

  3. 3
    Response

    What comes back

    The chosen action returns to your webhook and your job runner acts on it, re-running, deferring, or moving on, closing the loop the red checkmark never could.

The API

One request out, one signed response back

The card on the phone is rendered straight from the request body, not a mockup. When the recipient responds, Roundtrip POSTs a signed event to your webhook and retries until it lands.

POST /roundtrip/v1/requests200 OK
{
  "channels": [
    "jobs"
  ],
  "notification": {
    "title": "Job · nightly-backup",
    "body": "The 02:00 job exited non-zero — retry or snooze?"
  },
  "content": {
    "title": "Nightly backup failed",
    "description": "The 02:00 job exited non-zero. Retry it, snooze it, or look.",
    "status": {
      "label": "Failed",
      "tone": "danger"
    },
    "sections": [
      {
        "type": "keyvalue",
        "columns": 2,
        "items": [
          {
            "label": "Job",
            "value": "nightly-backup",
            "mono": true
          },
          {
            "label": "Exit code",
            "value": "1",
            "mono": true
          },
          {
            "label": "Started",
            "value": "02:00 UTC"
          },
          {
            "label": "Duration",
            "value": "8m 12s"
          }
        ]
      }
    ],
    "actions": [
      {
        "id": "retry",
        "label": "Retry",
        "style": "primary"
      },
      {
        "id": "logs",
        "label": "View logs",
        "style": "secondary"
      }
    ]
  },
  "response": {
    "mode": "optional",
    "webhook": "https://api.example.com/roundtrip"
  }
}
9:41
Roundtrip
Failed

Nightly backup failed

The 02:00 job exited non-zero. Retry it, snooze it, or look.

Job
nightly-backup
Exit code
1
Started
02:00 UTC
Duration
8m 12s
POST https://api.example.com/roundtripsigned · tap
{
  "requestId": "req_8Kx2…",
  "channel": "jobs",
  "kind": "tap",
  "action": "retry",
  "respondedAt": "2026-06-20T16:41:09Z"
}

Wire up Jobs & cron outcomes

Get an API key and send your first request in the next few minutes.

More use cases