Schedules
Create and manage cron-style scheduled jobs attached to a Skytells app — define recurring tasks that run on a fixed schedule inside your app's container.
The Schedules page lets you define recurring jobs that run inside the app's container on a cron schedule. Skytells triggers the job at the defined interval by executing a command inside the running container — no external cron daemon, no separate worker service required.
What schedules are for
Schedules are a good fit for:
- Sending digest emails or notifications at a fixed time
- Cleaning up stale records or archiving old data
- Refreshing a cache or syncing data from an external source
- Running database migrations or aggregation queries on a timer
- Health-check pings to external services
Schedules run inside the existing container. They do not spin up a separate container. If the app is stopped, schedules do not run. Make sure the app has status Running before relying on scheduled jobs.
Creating a schedule
Open the Schedules Page
Open Schedules from the app sidebar.
Add a Schedule
Select Add Schedule (or the + button).
Fill in the Schedule Details
Fill in the schedule details:
| Field | Description |
|---|---|
| Name | A label for this job (e.g. Daily cleanup). |
| Command | The command to execute inside the container (e.g. node scripts/cleanup.js or php artisan schedule:run). |
| Cron expression | When to run the job in standard cron format (see examples below). |
| Timezone | The timezone to interpret the cron expression in (defaults to UTC). |
Save the Schedule
Select Save. The schedule becomes active immediately.
Cron expression reference
The cron expression follows standard 5-field format:
┌───────────── minute (0–59)
│ ┌───────────── hour (0–23)
│ │ ┌───────────── day of month (1–31)
│ │ │ ┌───────────── month (1–12)
│ │ │ │ ┌───────────── day of week (0–7, 0 and 7 = Sunday)
│ │ │ │ │
* * * * *| Expression | Meaning |
|---|---|
* * * * * | Every minute |
0 * * * * | Every hour at the top of the hour |
0 9 * * * | Every day at 09:00 UTC |
0 9 * * 1 | Every Monday at 09:00 UTC |
0 0 1 * * | First day of every month at midnight |
*/15 * * * * | Every 15 minutes |
0 9,18 * * * | Every day at 09:00 and 18:00 UTC |
All cron expressions are interpreted in the timezone you select. If you pick UTC but your business logic expects local time, times will be off. Set the timezone explicitly when creating the schedule.
Viewing schedule execution history
Each schedule shows its next scheduled run time and the result of the last execution:
| Status | Meaning |
|---|---|
Success | The command exited with code 0. |
Failed | The command exited with a non-zero code. Open the execution log to see the error output. |
Running | The job is currently executing. |
Skipped | The previous run was still in progress when the next trigger fired — the new trigger was skipped to prevent overlap. |
Pausing and deleting schedules
- Pause a schedule to stop it from triggering without deleting the configuration.
- Delete a schedule to permanently remove it.
Paused schedules appear in the list but are greyed out.
Related
- Logs — view runtime output from scheduled job execution.
- Environment — make sure environment variables needed by the job are present.
- Monitoring — watch CPU spikes that correlate with scheduled jobs.
How is this guide?