CronEngine docs

Schedule with confidence.
Know exactly what runs.

The practical guide to schedules, HTTP requests, response handling, alerts, troubleshooting, and plan capacity. No account is required to read it.

CronEngine schedule documentation illustration

Timezone aware

Schedules follow local calendar time

Fixed outbound IP

45.9.188.216 for allowlisting

Useful run history

Status, timing, errors, and response

Durable alerts

Delivery retries are handled separately

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. 1

    Create the job

    Open Dashboard → New cron job. Give it a useful name and paste the endpoint URL.

  2. 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. 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. 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.
No credit card on Free Maps and tags on every plan Charts and history on every plan Alerts and digests on every plan

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.

FieldAllowedExamples
Minute0-59*/5 every 5 minutes
Hour0-238,17 at 08:00 and 17:00
Day1-31 or LL last day of the month
Month1-121,7 January and July
Weekday0-61-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.

Examplesmin hour day month weekday
*/15 * * * *Every 15 minutes
0 8 * * 1-5Weekdays at 08:00
30 6 1 * *First of each month at 06:30
0 23 L * *Last day of each month at 23:00
0 9 15 * 1Only when the 15th is a Monday

Supported 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.

Example POST request
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.

Redirects

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.

10 KB capture limit

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.

Plan timeout

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 modeWhat is stored in run history
AlwaysThe captured response for successful and failed runs.
Only on failureThe captured response only when the configured success criteria fail.
NeverNo 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

Overlap skip

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
Failed run

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

TriggerBehavior
NoneNo per-run alert events.
Every failureCreates an alert for each failed execution.
State changeAlerts on the first failure, then again on recovery.
Failure thresholdAlerts when consecutive failures reach your threshold, then on recovery.
Every runAlerts 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.

application/json version 1
{
  "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 id and ignore duplicates with the same ID.
  • Network errors, 408, 425, 429, and 5xx responses retry. Other non-2xx responses fail permanently.
  • http_status is 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 reference

08 · 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

See current pricing
Plan Active jobs Reserved runs Fastest schedule Timeout History per job Alert channels
Free53,000Every 15 min20 sec5 runs1
Starter2510,000Every 5 min60 sec20 runs1
Pro5030,000Every 2 min150 sec30 runs2
BusinessUnlimited90,000Every minute300 sec40 runs3
EnterpriseUnlimited300,000Every minute600 sec50 runs3

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.

CadenceReservationMath
Every minute43,20060 × 24 × 30
Every 5 minutes8,64012 × 24 × 30
Every 15 minutes2,8804 × 24 × 30
Hourly72024 × 30
Daily301 × 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.

Compare plan limits and timeouts

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.