Cron Jobs
Schedule recurring tasks for any service. Run database cleanups, send reports, sync data, or trigger webhooks on a cron schedule — all managed from the dashboard.
Creating a cron job
- Open your service detail page
- Go to the Cron Jobs section
- Click Create Cron Job
- Configure the job:
- Name — lowercase, alphanumeric, and hyphens only (unique per service)
- Schedule — choose a preset or enter a cron expression
- Timezone — IANA timezone (default: UTC)
- Type — HTTP trigger or shell command
- Click Create
The dashboard shows a live preview of the next 3 execution times based on your schedule.
Trigger types
HTTP trigger
Makes an HTTP request to your running service on a schedule. Ideal for Next.js API routes, Express endpoints, or webhook handlers.
- Method: GET or POST
- Path: The endpoint to hit (e.g.
/api/cron/cleanup) - Uses your service’s internal hostname — no authentication needed
POST /api/cron/send-reportsCommand trigger
Runs a shell command inside a fresh container using your service’s Docker image. The container gets all of your service’s environment variables.
- Working directory:
/app - Stdout/stderr: Captured and stored in run history
node scripts/cleanup.jsSchedule format
Presets
Choose from common intervals without writing cron syntax:
| Preset | Cron expression |
|---|---|
| Every minute | * * * * * |
| Every 5 minutes | */5 * * * * |
| Every 15 minutes | */15 * * * * |
| Every 30 minutes | */30 * * * * |
| Every hour | 0 * * * * |
| Every 6 hours | 0 */6 * * * |
| Every 12 hours | 0 */12 * * * |
| Daily (midnight) | 0 0 * * * |
| Daily at 9 AM | 0 9 * * * |
| Weekly (Monday 9 AM) | 0 9 * * 1 |
| Monthly (1st, midnight) | 0 0 1 * * |
Custom cron expression
Standard 5-field format: minute hour day month weekday
┌───────────── minute (0-59)│ ┌───────────── hour (0-23)│ │ ┌───────────── day of month (1-31)│ │ │ ┌───────────── month (1-12)│ │ │ │ ┌───────────── day of week (0-6, Sunday=0)│ │ │ │ │* * * * *Advanced options
Expand the Advanced section when creating or editing a cron job:
| Option | Default | Range |
|---|---|---|
| Memory | 256 MB | 64–4096 MB |
| CPU | 0.25 vCPU | 0.1–4 vCPU |
| Timeout | 5 minutes | 1 second – 1 hour |
| Overlap policy | Skip | Skip / Buffer One / Allow All |
Overlap policies
What happens when a job takes longer than the interval between runs:
- Skip — don’t trigger if the previous run is still in progress
- Buffer One — queue one extra execution, skip further triggers
- Allow All — execute immediately in parallel
Run history
Each cron job shows a list of recent runs with:
- Status — success, failed, timed out, skipped, or running
- Duration — how long the execution took
- Triggered by — schedule, manual, or backfill
- Error message — stderr output on failure
Click any run to see the full output.
Manual trigger
Click Run Now on any cron job to trigger it immediately, outside of the regular schedule. Manual runs are tracked in the same history with a “manual” badge.
Auto-pause on failure
If a cron job fails repeatedly (consecutive failures), Stackpad automatically pauses it to prevent runaway costs and log noise. The job shows a “Paused by system” badge. Re-enable it from the cron job settings after fixing the issue.
Plan limits
| Plan | Per service | Per project | Minimum interval | Max timeout |
|---|---|---|---|---|
| Starter | 2 | 5 | 15 minutes | 5 minutes |
| Pro | 10 | 25 | 1 minute | 30 minutes |
| Business | 25 | 100 | 1 minute | 1 hour |
| Enterprise | Unlimited | Unlimited | 1 minute | 1 hour |
Availability
Cron jobs are available for web and service types only. They cannot be created for databases, caches, GPU services, or object storage.
What’s next?
- Scale to zero — cron-aware idle detection
- Logging — view cron job output in the log viewer
- Environment variables — cron containers inherit service env vars