Docs

Scheduled Publishing & Content Expiry

Set a future date for an entry to go live automatically, and optionally set an unpublish time so content disappears just as cleanly as it appeared.

How scheduling works

Every entry supports two optional timestamp fields:

FieldEffect
publish_atEntry is kept in scheduled status until this time, then automatically moved to published.
unpublish_atA published entry is automatically moved back to draft at this time (content expiry).

An entry with a publish_at value in the future appears in the entries list with a Scheduled badge and is excluded from all public API responses until the time passes.

Setting a schedule in the editor

  1. Open an entry in the editor.
  2. In the Meta panel on the right, expand the Publishing section.
  3. Click the Publish at date-time field and choose a future date and time (stored in UTC).
  4. Optionally fill in the Unpublish at field to set a content expiry.
  5. Save the entry. Its status is automatically set to scheduled.

You can clear either field at any time to cancel the scheduled action. Manually publishing an entry before its publish_at time overrides the schedule.

The scheduler

The Orbiter server runs a setInterval loop every 60 seconds that queries for entries where:

  • status = 'scheduled' and publish_at <= now() — these are moved to published.
  • status = 'published' and unpublish_at <= now() — these are moved to draft.

The interval is defined in server.js and starts when the Orbiter pod boots. No external cron job or task queue is required.

Webhook on scheduled publish

When the scheduler promotes an entry to published, it fires your configured Build webhook exactly as if the entry had been published manually. The webhook payload is identical. See the Build Webhook docs for payload format and configuration.

API

You can set or clear schedule fields via the REST API:

PATCH /api/collections/:collectionId/entries/:slug/status
{
  "status":       "scheduled",
  "publish_at":   "2026-07-01T09:00:00Z",
  "unpublish_at": "2026-07-31T23:59:59Z"
}

To cancel scheduling, send null for either field:

PATCH /api/collections/:collectionId/entries/:slug/status
{ "publish_at": null, "unpublish_at": null, "status": "draft" }

The response always includes the current values of both fields alongside the resolved status.

Calendar view

Scheduled and expiring entries are visualized on a month grid in the Calendar — blue chips for upcoming publishes, gold chips for upcoming expiries. The dashboard also shows a mini calendar widget with upcoming dates at a glance.