Schedules
Schedules let you run rules on a recurring basis using cron expressions or poll intervals. Combined with schedule guards, you can ensure rules only fire during appropriate windows and pause them instantly with Quick Freeze when needed.
How It Works
When a rule uses a schedule or poll trigger, TinyOps evaluates it at the specified cadence. Before each evaluation, schedule guards are checked. If a guard blocks execution, the run is marked as skipped with a reason logged. Otherwise, the rule evaluates normally.
Cron Expressions
Cron format follows the standard 5-field syntax:
minute hour day month weekday| Field | Values | Description |
|---|---|---|
| minute | 0-59 | Minute of the hour |
| hour | 0-23 | Hour of the day (UTC unless timezone configured) |
| day | 1-31 | Day of the month |
| month | 1-12 | Month of the year |
| weekday | 0-6 | Day of the week (0 = Sunday) |
Examples
| Expression | Meaning |
|---|---|
0 9 * * 1-5 | Weekdays at 9:00 AM |
*/15 * * * * | Every 15 minutes |
0 0 1 * * | First day of every month at midnight |
30 17 * * 5 | Fridays at 5:30 PM |
name: daily-cost-check
trigger:
type: schedule
cron: "0 9 * * 1-5"
provider: vercel
condition:
field: billing.mtd_spend
operator: gte
value: 50
action:
type: notify
channel: slack
message: "Vercel spend alert: ${{billing.mtd_spend}} MTD"Poll Intervals
For simpler recurring checks, use poll intervals instead of cron. Format is a number followed by a unit:
| Unit | Abbreviation | Example |
|---|---|---|
| Minutes | m | 5m |
| Hours | h | 1h |
| Days | d | 1d |
The minimum poll interval is 1 minute. Intervals shorter than 1 minute will be rejected.
name: stale-pr-check
trigger:
type: poll
interval: 1h
condition:
field: pr.last_activity_days
operator: gte
value: 7
action:
type: notify
channel: slack
message: "PR #{{pr.number}} is stale"Schedule Guards
Guards add conditions that must be met before a scheduled rule executes. If a guard blocks, the execution is marked as skipped with the guard name as the reason.
Business Hours Guard
Restricts rule execution to your organization’s configured business hours.
| Setting | Description |
|---|---|
| Timezone | Per-organization timezone setting |
| Start/End times | Configurable per day of the week |
name: cost-alert
trigger:
type: schedule
cron: "0 * * * *"
guards:
- type: duringBusinessHoursFreeze Window Guard
Blocks rule execution during defined freeze periods. Supports both one-time and recurring windows.
name: deploy-notify
trigger:
type: webhook
event: push
guards:
- type: excludeFreezeWindowsEach organization can have a maximum of 50 freeze windows. Remove expired one-time windows to free up slots.
Quick Freeze
Quick Freeze lets you instantly pause all scheduled rules for a specified duration. Useful for incidents, maintenance windows, or when you need immediate quiet.
Open the Schedules page in your dashboard
Click “Quick Freeze”
Select duration (e.g., 15 minutes, 1 hour, 4 hours)
All scheduled rules are paused immediately
Rules resume automatically when the freeze expires
Skipped Executions
When a guard blocks a scheduled execution, TinyOps records it with:
| Field | Value |
|---|---|
| Status | skipped |
| Reason | Guard name (e.g., duringBusinessHours, excludeFreezeWindows, quickFreeze) |
| Timestamp | When the execution was attempted |
Skipped executions appear in your Dashboard & Analytics and can be filtered by status.
Related
- Cost Guard - uses scheduled triggers for daily spend checks
- PR Health Pack - uses poll intervals for stale PR detection
- Dashboard & Analytics - view and filter skipped executions
- Deploy Safety - combine with freeze windows for deploy blackouts