01 · Quickstart
Your first job in five minutes
You need a publicly reachable HTTP or HTTPS URL. CronEngine runs independently of your browser, so your computer can be off after the job is saved.
-
1
Create the job
Open Dashboard → New cron job. Give it a useful name and paste the endpoint URL.
-
2
Choose the request
Select GET for a simple trigger, or POST/PUT/PATCH when you need a raw request body. Add authentication or headers if required.
-
3
Set the schedule
Use the visual builder, a five-field expression such as 0 8 * * 1-5, or a macro such as @daily. The schedule uses your account timezone.
-
4
Test and activate
Use Test request to verify connectivity and success rules. Save the job as active, then inspect Run history after it fires.
Good first test: schedule a GET endpoint with @hourly, leave the default success rule and overlap protection enabled, and store responses only on failure.
02 · Feature guide
What you get after creating an account
These product tools are available on every plan, including Free. Plans change capacity, history retention, timeout length, channel count, and how frequently a schedule can run.
Build and control
Create jobs without guesswork
-
Visual schedule builder and raw cron
Use guided fields, macros, or a five-field expression with live validation and an immediate reserved-run estimate. -
Test request and manual runs
Check the current form before saving, or trigger an existing job from the dashboard without waiting for its schedule. -
Pause, resume, edit, and delete
Temporarily stop a job without losing its request, schedule, organization, or alert settings. -
Import and export
Import CronEngine JSON or a crontab. Copy or download a JSON snapshot for backups and moving job settings.
Monitor and debug
See what happened and what comes next
-
Operational dashboard
Scan active and paused jobs, next runs, last outcomes, HTTP status, and scheduled-run usage. -
Timezone-aware Agenda
Browse upcoming executions by local day and time, with an option to include paused jobs. -
Detailed run history
Inspect success, status, duration, error explanations, and saved response content in pretty or raw form. -
Execution charts and success rate
Compare duration across recent runs and spot failures or performance changes visually.
Organize and operate
Keep a growing job list manageable
-
Nested maps
Group jobs by environment, project, client, or workflow, with root maps and one level of sub-maps. -
Colored tags
Label jobs by priority, owner, environment, or task type for faster scanning. -
Bulk actions
Select jobs to pause or delete together, and bulk-manage maps and tags. -
Fast dashboard actions
Copy an endpoint URL, open history, edit, test, pause, resume, or delete from the job row.
03 · Schedules
Cron syntax and local time
CronEngine accepts a five-field expression. Names are not accepted in jobs created in the UI; use the numeric ranges below. Imported crontabs may normalize month and weekday names, and Sunday is stored as 0.
| Field | Allowed | Examples |
|---|---|---|
| Minute | 0-59 | */5 every 5 minutes |
| Hour | 0-23 | 8,17 at 08:00 and 17:00 |
| Day | 1-31 or L | L last day of the month |
| Month | 1-12 | 1,7 January and July |
| Weekday | 0-6 | 1-5 Monday through Friday |
Each field supports *, a value, comma-separated values, ranges, and steps: N, N,M, N-M, */S, N/S, or N-M/S. The special L is valid only by itself in the day field.
*/15 * * * *Every 15 minutes0 8 * * 1-5Weekdays at 08:0030 6 1 * *First of each month at 06:300 23 L * *Last day of each month at 23:000 9 15 * 1Only when the 15th is a MondaySupported macros
@hourly0 * * * *
@daily0 0 * * *
@midnight0 0 * * *
@weekly0 0 * * 0
@monthly0 0 1 * *
@yearly0 0 1 1 *
@annually0 0 1 1 *
Macros are case-insensitive and stored in lowercase. @reboot is not supported because dispatcher restarts are not a reliable per-job schedule.
Important: day-of-month and weekday use AND
When both fields are restricted, CronEngine requires both to match. Some Unix cron implementations use OR instead. In CronEngine, 0 9 15 * 1 runs at 09:00 only when the 15th of the month is a Monday, not on every Monday plus every 15th.
Timezone behavior
Schedules use the timezone in Account settings, not the server timezone. @daily means local midnight. Changing your timezone recalculates upcoming executions for all active jobs.
Example: 0 9 * * * in Europe/Brussels stays at 09:00 Brussels time as the UTC offset changes.
DST behavior
During the spring clock jump, a nonexistent local time is skipped. During the autumn rollback, a repeated matching local time runs once in each real occurrence.
Month lengths, leap years, and calendar boundaries are resolved from the real local calendar.
04 · HTTP requests
What CronEngine sends
Your endpoint must be publicly reachable. HTTP works, but HTTPS is strongly recommended whenever a URL, header, or body contains sensitive data.
Methods
GET, POST, PUT, PATCH, DELETE, and HEAD are supported.
Custom headers
Enter one Name: value header per line, up to 8,000 bytes total.
Request bodies
POST, PUT, and PATCH send a raw body of up to 10,000 bytes.
Content types
Choose JSON, form-urlencoded, or plain text for body methods.
Authentication
No auth, Bearer token, or HTTP Basic username and password.
Network safety
Private, local, metadata, reserved, blocked hosts, and blocked IPs are rejected.
POST /hooks/nightly HTTP/1.1
Host: api.example.com
User-Agent: CronEngine-Dispatcher/2
Authorization: Bearer your-dedicated-token
Content-Type: application/json
Accept: application/json
X-Environment: production
{"source":"cronengine","task":"nightly-sync"}
Managed headers
CronEngine manages Authorization through the auth fields and manages Content-Type through its selector. Connection, content length, host, proxy, transfer-encoding, trailer, upgrade, and user-agent headers cannot be overridden.
Credential storage
Job tokens, Basic credentials, custom header values, and request bodies must be available to workers, so they are stored as entered at the application level and may appear in database backups. Use unique, least-privilege credentials that can be rotated or revoked.
05 · Responses
Success, redirects, and saved content
Default success rule
Any HTTP 2xx or 3xx response is successful.
A network error, DNS failure, refused connection, TLS failure, or timeout is always a failure because no response was received. You can customize accepted ranges, add exact codes, and optionally require that the captured body contains or does not contain case-sensitive text. Status and body conditions can use AND or OR.
Scheduled executions follow at most four redirect hops (five requests in the chain, including the original). Every destination is checked against the outbound safety rules. Test request and Run once do not follow redirects.
CronEngine reads the first 10 KiB (10,240 bytes) of a response. Larger responses receive a [truncated] marker. Body success checks use this captured portion.
The request stops at your plan’s timeout, from 20 seconds on Free through 600 seconds on Enterprise. A timeout is recorded as a failure.
| Save mode | What is stored in run history |
|---|---|
| Always | The captured response for successful and failed runs. |
| Only on failure | The captured response only when the configured success criteria fail. |
| Never | No response body. Status, duration, success, and error details are still recorded. |
The save mode controls history storage, not whether CronEngine captures the first 10 KB while evaluating body-based success rules.
06 · Execution
Skips are not failures
Expected control flow
Overlap protection is enabled by default. If the previous execution is still within its lease when the next occurrence becomes due, that occurrence is consumed and skipped.
- No failed history row
- No health-state change
- No failure notification
An attempted execution failed
The request was attempted and encountered a network error or did not satisfy the job’s success criteria.
- Recorded in run history
- Updates consecutive-failure health
- May create a notification event
Job execution retries vs notification delivery retries
Job executions are not automatically replayed
A failed HTTP job remains one failed scheduled occurrence. CronEngine does not immediately call the endpoint again, which avoids accidentally duplicating non-idempotent work. The next attempt is the next scheduled occurrence; you can also use Run once manually.
Notification deliveries can retry
Once a run creates an alert event, delivery has its own durable outbox. Transient email/provider/network failures and webhook HTTP 408, 425, 429, or 5xx responses are retried with exponential backoff, up to five attempts by default. This retries the alert, not the job.
Free-plan safety: a Free job is automatically paused after 20 consecutive failed executions and a one-time account email is queued. A success resets the count; manually resuming the job starts a fresh count.
07 · Notifications
Choose when and where alerts arrive
| Trigger | Behavior |
|---|---|
| None | No per-run alert events. |
| Every failure | Creates an alert for each failed execution. |
| State change | Alerts on the first failure, then again on recovery. |
| Failure threshold | Alerts when consecutive failures reach your threshold, then on recovery. |
| Every run | Alerts for successful and failed runs; available on paid plans. |
Channels include email, generic signed webhooks, Slack, Discord, and Telegram. Channel counts and daily delivery caps depend on the plan and are enforced independently per channel type. Weekly and monthly account digests are separate from per-job alerts.
Generic webhook payload
What CronEngine sends to your endpoint
Generic webhooks receive an HTTPS POST with JSON. The envelope is versioned, contains a stable event ID, and includes the job and run snapshot that caused the notification.
{
"version": "1",
"id": "evt_1842",
"type": "job.failed",
"created_at": "2026-07-25T08:09:10Z",
"job": {
"id": 7,
"name": "Nightly invoice sync",
"url": "https://example.com/tasks/invoices",
"history_url": "https://cronengine.com/jobs/history?id=7"
},
"run": {
"id": 9124,
"success": false,
"http_status": 503,
"duration_ms": 812,
"error": "The endpoint returned HTTP 503.",
"fired_at": "2026-07-25T08:09:10Z"
}
}
Event types
- job.failed
- A failure alert or configured threshold was reached.
- job.recovered
- The first success after an open failure incident.
- job.run.succeeded
- A successful every-run notification.
- job.run.failed
- A failed every-run notification.
Delivery contract
- Delivery is at least once, so the same event can arrive more than once.
- Return any 2xx status to acknowledge the event.
-
Store
idand ignore duplicates with the same ID. - Network errors, 408, 425, 429, and 5xx responses retry. Other non-2xx responses fail permanently.
-
http_statusis null when no HTTP response was received. - Notification redirects are not followed.
Headers on every generic webhook
X-CronEngine-Webhook-Version: 1
X-CronEngine-Event-Id: evt_1842
X-CronEngine-Event-Type: job.failed
X-CronEngine-Timestamp: 1784966950
Optional signature
When a signing secret is configured, CronEngine adds X-CronEngine-Signature: v1=<hex HMAC-SHA256>. Verify the HMAC over <timestamp>.<raw body> before decoding JSON, use a constant-time comparison, and reject stale timestamps.
Slack and Discord use their native incoming-webhook payloads. Telegram uses the official Bot API. Each includes the outcome, HTTP status, duration, error, history link, and stable event ID.
Full webhook reference08 · Troubleshooting
When a request fails
No response / network error
Confirm the hostname resolves publicly, the port is reachable, and the URL does not point to localhost, a private network, cloud metadata, a reserved range, or a blocked CronEngine address. Check DNS, TLS certificate validity, and your plan timeout.
HTTP 401 or 403
Check the Bearer token or Basic credentials. Confirm the credential is active and has permission for this endpoint. If a WAF or firewall is involved, allowlist the CronEngine outbound IP.
HTTP 404
Verify the full path and environment. Redirects are followed for scheduled jobs, but a redirect cannot rescue an incorrect final route.
HTTP 405
The endpoint rejected the selected method. Match GET, POST, PUT, PATCH, DELETE, or HEAD to what your server route accepts.
HTTP 415 or body parsing errors
Match the selected Content-Type to the raw body. For JSON, validate the JSON and use application/json. For form data, URL-encode the body.
HTTP 429
Your endpoint is rate-limiting scheduled executions. Reduce the cadence or change the endpoint limit. The job itself is not automatically retried.
HTTP 5xx
The request reached your application. Inspect its server logs using the run timestamp, then use the stored response and CronEngine error explanation for context.
Response looks cut off
Run history and body matching use only the first 10 KiB. Put health or success markers near the start of the response and keep diagnostic payloads concise.
Expected run is missing
Check whether the job is active, whether DST skipped a nonexistent local time, and whether overlap protection skipped an occurrence while the prior execution lease was active.
Firewall allowlisting
Allow inbound requests from CronEngine
Add this single IPv4 address to the allowlist for the exact route and port CronEngine calls. Keep normal authentication enabled; an IP allowlist should be an additional check, not the only credential.
45.9.188.216
Scheduled job requests identify themselves with User-Agent: CronEngine-Dispatcher/2. The fixed IP is the reliable network allowlist value; user-agent strings can be imitated and should only help with logs or routing.
09 · Plan usage
Capacity is reserved up front
Scheduled runs are a reservation model, not a meter. Each active job reserves how often its expression is expected to fire in a fixed 30-day month. CronEngine checks the total when you create, edit, or resume a job. Actual executions are not counted afterward, so capacity never runs out midway through a month and nothing resets on the first.
Feature availability
Plan capacity at a glance
| Plan | Active jobs | Reserved runs | Fastest schedule | Timeout | History per job | Alert channels |
|---|---|---|---|---|---|---|
| Free | 5 | 3,000 | Every 15 min | 20 sec | 5 runs | 1 |
| Starter | 25 | 10,000 | Every 5 min | 60 sec | 20 runs | 1 |
| Pro | 50 | 30,000 | Every 2 min | 150 sec | 30 runs | 2 |
| Business | Unlimited | 90,000 | Every minute | 300 sec | 40 runs | 3 |
| Enterprise | Unlimited | 300,000 | Every minute | 600 sec | 50 runs | 3 |
Every plan includes failure, recovery, consecutive-failure threshold alerts, and weekly or monthly digests. Every-run notifications are available from Starter. Daily notification caps are 5, 20, 50, 100, and unlimited per channel type from Free through Enterprise.
| Cadence | Reservation | Math |
|---|---|---|
| Every minute | 43,200 | 60 × 24 × 30 |
| Every 5 minutes | 8,640 | 12 × 24 × 30 |
| Every 15 minutes | 2,880 | 4 × 24 × 30 |
| Hourly | 720 | 24 × 30 |
| Daily | 30 | 1 × 30 |
Worked example · Starter
A mixed workload fits
Every 5 min8,640
Hourly720
Daily30
Reserved9,390
Starter limit10,000
Remaining610
Worked example · Free
One more hourly job does not fit
Every 15 min2,880
Proposed hourly720
Would reserve3,600
Free limit3,000
Over by600
Pause another active job, run the new job less often, or change plan. Paused jobs reserve no capacity.
Calendar-specific schedules are estimated across a canonical 365-day year and scaled to 30 days. This correctly charges schedules involving day 31, weekdays, L, and CronEngine’s day-plus-weekday AND behavior. Any valid rare schedule reserves at least one run.
10 · Account settings
Controls you will find after sign-in
Profile and timezone
Update your display name and IANA timezone. A timezone change reschedules active jobs and controls the local dates used for digests and reports.
Notification email
Send alerts to a dedicated address. A new notification address must be verified before it becomes the active destination.
Email digests
Choose off, weekly, or monthly. Weekly summaries are prepared after 08:00 Monday; monthly summaries after 08:00 on the first, in your timezone. Empty digests are not sent.
Login security
Review active sessions and revoke other remembered or logged-in devices. Password changes and account access controls live under Security.
Billing
Paid accounts can open Stripe’s hosted portal to update payment details, review the subscription, and view billing history.
Archive account
Archiving pauses product use while preserving the account. Deletion and other account-management options are explained in Settings.
Ready to configure your account?
The documentation stays public; account controls require a signed-in, verified account.