Scheduled Publishing
Scheduled publishing lets you approve content in advance and have it go live automatically at a specific date and time. Use it for press releases, campaign pages, time-sensitive announcements, or any content that needs to be published at a precise moment.
Do this now (3 lines)
- Submit for review, then approve with a publish date
- Confirm status becomes
scheduled - After the time (up to ~5 min), confirm
publishedand Public API
How It Works
draft
↓ submit_for_review
pending_review
↓ approve (with a publish date)
scheduled ← publish_at = 2025-02-01T00:00:00Z (UTC)
↓ Cron job runs about every 5 minutes
published ← once publish_at has passed- An editor submits the entry for review as usual
- A
tenant_adminapproves and sets a Publish Date - The revision status becomes
scheduled - A Cron job runs about every 5 minutes and moves any revision past its
publish_attopublished - The entry becomes available via the public API
Cron precision
The Cron job runs about every 5 minutes, so the actual publish time may lag by up to about 5 minutes. If you need second-level precision, scheduled publishing is not the right tool.
Setting Up a Schedule
Step 1: Create and submit the entry
Create your entry and fill in the fields as normal, then click Submit for Review.
Step 2: Approve with a publish date
As a tenant_admin:
- Click Approve on the entry
- Enable Schedule Publishing
- Enter the desired publish date and time
Example input: February 1, 2025 at 9:00 AM (in your local timezone)
Stored as: 2025-02-01T00:00:00Z (UTC)The admin panel always shows times in your browser's local timezone while storing them in UTC.
Step 3: Confirm the schedule
In the entry list, the status column shows scheduled. Hovering over the status displays the exact scheduled publish time.
Canceling a Schedule
A scheduled revision can be canceled in two ways:
Reject
Moves the revision from scheduled → rejected. The entry is returned to the editor with a note.
scheduled → [reject] → rejected → [reopen] → draftWithdraw
Moves the revision from scheduled → draft directly, skipping the rejected state. Use this when you simply want to postpone or re-edit without a formal rejection.
Both options cancel the automatic publishing.
Bulk Scheduling
To set the same publish time for multiple entries at once:
- In the entry list, check the boxes next to the target entries (status must be
pending_review) - Click Bulk Actions → Schedule Publishing
- Enter the publish date and time
- Confirm
Prerequisite
Bulk scheduling only works on entries already in pending_review status. Entries in draft must be submitted for review first.
Replacing Published Content at a Future Time
To swap the content of an already-published entry on a specific date:
- Open the published entry and click Edit (new revision)
- Make the desired changes
- Submit for review and approve with a schedule date
Until the scheduled time, visitors see the currently published content. After the schedule time, the new revision goes live automatically. The old revision's status becomes superseded.
Webhook on Scheduled Publish
When a scheduled revision auto-publishes, luno fires an entry.published Webhook event just like an immediate publish:
{
"event": "entry.published",
"project_id": "project-uuid",
"form_set_slug": "blog",
"entry_slug": "my-scheduled-post",
"entry_id": "entry-uuid",
"revision_id": "revision-uuid",
"timestamp": "2025-02-01T00:00:00.000Z"
}Use this to trigger cache invalidation, send notifications, or sync content to external systems automatically at publish time. See Webhooks for setup details.
Common Use Cases
| Use Case | Tips |
|---|---|
| Press release | Schedule for the exact embargo time. Approve days in advance. |
| Campaign launch | Bulk-schedule all campaign pages for the same datetime. |
| Regular content | Pre-approve weekly or monthly updates and schedule them months ahead. |
| Global simultaneous publish | Use UTC to ensure content goes live at the same moment worldwide. |
Cron Setup (Self-hosting)
In a self-hosted environment, add the following Cron trigger to apps/api/wrangler.toml:
[triggers]
crons = ["*/5 * * * *"] # Scheduled publish (combined with other crons in production)This registers a Cloudflare Workers Cron Trigger. The scheduled-to-published promotion runs as part of the Worker's scheduled handler.
See the Deployment Guide for the full wrangler.toml configuration.
Next Steps
- Content Management — Approval workflow and revision statuses
- Webhooks — Triggering actions at publish time
- Deployment Guide — Configuring Cron in self-hosted environments