Schedule a Ghost post to publish automatically at a set time
Set a future publish time in Ghost using scheduled_at, verify with the admin label or API, and avoid UTC and quota mistakes.
09 Aug 2025, 08:28 UTC

Useful answer
If you need a Ghost post to go live at a specific future time without opening the admin again, use Ghost's scheduled publishing. You set a scheduled_at datetime in UTC, and a background worker publishes the post when that time arrives. The practical takeaway: always enter the time in UTC, confirm your plan allows scheduled posts, and verify the "Scheduled" label before closing the editor.
This behavior applies to the Ghost Admin API and admin UI. Field names, plan tiers, and scheduled-post quotas can differ by Ghost version and hosting arrangement, so check your plan documentation before scheduling many posts.
How the scheduling mechanism works
Ghost stores a scheduled_at datetime on the post record. A background worker repeatedly checks for posts where scheduled_at is less than or equal to the current time and publishes them at the nearest minute. Until that worker runs, the post remains scheduled rather than draft or published.
Worked example: schedule through the admin UI
- Open Posts in the Ghost admin and open an existing draft or create a new post.
- Open the post settings menu and choose Schedule.
- Select the date and time. Enter the time in UTC, not your local time.
- Confirm the schedule. The post card should display a "Scheduled" label with the target date.
Worked example: schedule through the Admin API
Run this from a terminal with network access to your Ghost site. You need an Admin API key with permission to create posts.
curl -X POST "https://your-site.ghost.io/ghost/api/admin/posts/" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Ghost Admin " \
-d '{
"posts": [{
"title": "Example scheduled post",
"scheduled_at": "2026-12-01T09:00:00.000Z"
}]
}'
Replace https://your-site.ghost.io with your site URL, your-admin-api-key with a valid Admin API key, and scheduled_at with an ISO-8601 UTC timestamp. The Z suffix marks the time as UTC. Omitting it or supplying a local offset can cause the post to publish at the wrong hour.
Expected check: after the request succeeds, open the post in the admin and confirm the "Scheduled" label. You can also query the API:
curl -H "Authorization: Ghost Admin " \
"https://your-site.ghost.io/ghost/api/admin/posts/?filter=scheduled_at%3A2026-12-01T09%3A00%3A00.000Z"
Confirm the returned scheduled_at matches the intended time. Filter syntax and query encoding depend on your Ghost version.
Limits and common mistakes
- Timezone: use UTC. A naive local datetime without a timezone offset publishes at the wrong time.
- Past dates: a
scheduled_atin the past does not reliably publish immediately; treat it as invalid input. - Precision: publication happens at the minute level, not the second.
- Future horizon: Ghost does not support scheduling more than one year ahead.
- Plan quota: some Ghost plans cap scheduled posts, commonly around 100 per site, and require a Business or higher plan. Exceeding the quota can leave the post in draft. Verify your exact limit in your plan documentation.
- Worker delays: scheduled publishing depends on the background cron. On self-hosted or low-traffic installations, a paused worker can delay publication past the intended minute.
Diagnostic: a scheduled post did not publish
- Check the admin post list for the "Scheduled" label. If the label is missing, the post was never scheduled.
- Call GET /posts and inspect
scheduled_at. If the value is null or in the past, reschedule the post. - If you self-host Ghost, confirm the background worker is running. Hosted Ghost plans manage this for you, but delays can still occur during platform maintenance.
Rollback: unscheduling a post
Because scheduling changes post state, you can reverse it before publication. Open the post in the admin, change the schedule back to Draft, or update the post through the API without the scheduled_at field. The post returns to draft and will not publish at the earlier time.
Practical verification
After scheduling, reload the admin Posts page and look for the "Scheduled" badge on the post card. For API-driven schedules, retrieve the post with the Admin API and confirm scheduled_at equals your intended UTC time. If publication time passes and the post remains scheduled, check the worker status or contact your Ghost host.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.