> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stackshift.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# Scheduling & Delayed Jobs

> Run jobs later for reminders, follow-ups, retry windows, cleanup, and recurring backend work.

<Tip>
  **Live.** This area is documented as current, user-reliable behavior.
</Tip>

## Goal

Schedule backend work without keeping a process alive or relying on request timing.

## Prerequisites

* A queue and job handler

## Workflow

<Steps>
  <Step>
    Pass scheduledAt when a job should run later.
  </Step>

  <Step>
    Use idempotency keys so rescheduling attempts do not duplicate work.
  </Step>

  <Step>
    Use recurring schedules for repeated platform tasks when your StackShift plan supports them.
  </Step>
</Steps>

## Run later

```ts Trial reminder theme={null}
await stackshift.queue('notifications').enqueue(
  'sendTrialEndingReminder',
  { customerId: 'cus_123' },
  {
    scheduledAt: '2026-05-12T10:00:00.000Z',
    idempotencyKey: 'trial-ending:cus_123',
  }
)
```

## Recurring jobs

* Use recurring jobs for daily cleanup, billing sync, report generation, and periodic reconciliation.
* Keep the job body idempotent because recurring jobs often touch external systems.
* Use observability to inspect the latest run and previous attempts.

## Expected result

<Check>
  Delayed work runs at the intended time and remains visible before execution.
</Check>

## Related guides

<CardGroup cols={2}>
  <Card title="Retries & Failure Handling" href="/durable-jobs/retries-and-failure-handling">
    Durable Jobs retries transient failures, preserves completed steps, and gives failed work a clear recovery path.
  </Card>

  <Card title="Observability" href="/durable-jobs/observability">
    Inspect each job run through status, attempts, logs, payload, result, errors, and timeline.
  </Card>
</CardGroup>
