Ghost editorial calendar: drag your month into shape

See every draft, scheduled and published Ghost post on a month calendar, drag posts to new dates, and park ideas until you are ready to write.

App
GhostMarketingContent Generation
PromptCreate

I run a Ghost publication and Ghost admin only gives me a flat list of posts, so I cannot see my month at a glance. Build me a publishing calendar app: a month view where every draft, scheduled and published post sits on its date, with a side rail of unscheduled idea cards I can park and then drop onto an empty day.

Load the calendar with Browse Posts (Admin API), never the Content API, because the Content API only returns published content and I need drafts and scheduled items too. Ghost 6.0 removed support for limit=all and caps pages at 100 items, so paginate: request 100 per page and keep advancing using meta.pagination.next until it comes back null. Fetch a window covering the visible month plus a few days either side so posts near the edges still render. Place published and scheduled posts on their published_at date. A draft that already has a published_at sits on that planned date; a draft with no date at all goes into the side rail under an Unscheduled drafts tray, above my idea cards. Each day cell shows compact post cards with a status colour for draft, scheduled and published, plus title, author, tags, and a newsletter chip on scheduled email issues. Clicking a card opens that post in Ghost admin in a new tab.

Put filters across the top of the calendar. Build the tag filter from Browse Tags (Admin API) so internal tags are included, the author filter from Browse Authors (Content API), and the newsletter filter from Browse Newsletters (Admin API) so I can see which newsletter a scheduled issue will email. Browse Authors (Content API) only lists authors who have published something, so also merge in any authors appearing on the posts you already fetched, otherwise an author who only has drafts would be missing from the filter. Filters should narrow both the grid and the side rail at the same time.

Let me drag a post card onto a different day to reschedule it, saved with Update Post (Admin API). The updated_at field is required on that request for optimistic locking, and omitting it or sending a stale value causes a conflict error, so the handler must first fetch the post's current updated_at with Read Post (Admin API) and send that exact value back. If Ghost still returns a conflict, refetch the post, restore the card to its original day, and tell me the post changed underneath me instead of overwriting anything. Only change published_at and keep the existing status and time of day. If the post is scheduled and I drop it on a date in the past, do not save it, because a scheduled post must have a future published_at; show me why and offer either to pick a future day or to convert the post to a draft on that date.

The idea cards live in the app's own storage, not in Ghost. Each card has a title, pitch notes, optional target tag names, an optional target author, an optional target date, who added it and when. I can add, edit, delete and reorder cards in the side rail. Dropping an idea card onto an empty day sets its target date and shows it on that day as a faded placeholder that is clearly not yet a real Ghost post, so parking a pitch never creates anything in my publication.

Highlight gaps in my cadence. For each week row in the visible month, check whether it contains any scheduled or published post, and if it does not, visibly flag that entire row with a tinted band and a label like No post this week, with a shortcut to drop an idea onto it. Show a count of gap weeks in the month header. Separately, look at upcoming work, meaning scheduled posts plus drafts dated in the future, and badge any card that has no feature image or no tags. Put a summary strip in the header along the lines of three upcoming issues missing a cover, two missing tags, and clicking it filters the grid down to exactly those posts.

Give every idea card a Draft this idea button that kicks off a background agent. The agent reads my recent posts with Browse Posts (Admin API), filtered to published and sorted by published_at descending, then pulls the full content of the most recent handful with Read Post (Admin API) to match my house style: how I open and close a piece, my structure, heading style, typical length and tone. It then writes a complete first draft from the idea card's title and pitch notes and files it with Create Post (Admin API), using ?source=html when sending HTML. It must always create the post as a draft and never publish or schedule it. Apply the card's target tags by passing them as names, since Ghost creates a tag inline if it does not already exist, and set published_at to the card's target date when there is one so the new draft lands on the right day. When it finishes, write the new post id back onto the idea card, mark the idea as drafted, and refresh the calendar so the draft appears in place and I can open it in Ghost to edit. Show the run state on the card while it works, and on failure show the error with a retry button.

Ghost stays the source of truth for everything on the calendar; only the idea cards are stored in the app. Include month navigation with a today marker, and never publish anything to my site.

What does this prompt do?

  • Shows your whole month at a glance, with every draft, scheduled post and published post sitting on its own date instead of buried in a flat list.
  • Reschedules a post when you drag it to a new day, and warns you before you drop a scheduled issue onto a date that has already passed.
  • Flags any week with nothing scheduled, and shows which upcoming issues are still missing a cover image or tags.
  • Keeps a side rail of unscheduled ideas, and turns any one of them into a full first draft written in your usual voice with a single click.

What do I need to use this?

  • A Ghost publication you can sign in to as an administrator.
  • A custom integration created in your Ghost settings, so the calendar can see drafts and scheduled posts and save date changes.
  • The read only key from that same integration, used to list the authors in your filter.
  • A handful of published posts, so the drafting assistant has your house style to learn from.

How can I customize it?

  • Change what counts as a cadence gap, for example flag any week without a scheduled post, or any week with fewer than two.
  • Decide which filters sit at the top of the calendar: tag, author, or which newsletter a scheduled issue will email.
  • Tune the drafting assistant, including how many recent posts it reads for style and how long a first draft it should write.

FAQs

Will my drafts and scheduled posts show up, or only published ones?
All three. The calendar reads your publication with administrator access, so drafts and scheduled issues appear alongside everything you have already published. A draft with no date yet waits in the side rail until you drop it onto a day.
What happens if I drag a scheduled post onto a date that has already passed?
The calendar stops you and explains why. Ghost will not hold a scheduled post for a date in the past, so you get the choice of picking a future day or turning the post back into a draft.
Does the Draft this idea button publish anything to my site?
No. It always writes a draft, never a published or scheduled post. The draft lands on your calendar and in your Ghost editor so you can review, edit and schedule it yourself.
How does it know my writing style?
Before writing, it reads through your recent published posts and picks up how you open, structure and close a piece, along with your usual length and tone. The more you have published, the closer the match.
Where do the idea cards live?
Inside the app itself, not in your publication. Parking a pitch does not create anything in Ghost, so your post list stays clean until you decide an idea is worth drafting.

Related templates

Find and refresh the Ghost posts quietly losing traffic

See every published post ranked by how much search traffic it has lost, then let an agent draft a refreshed version you approve before publishing.

Ghost
Google Search Console
Google Analytics
App
Sell and invoice Ghost newsletter sponsor slots in one board

Replace the sponsorship spreadsheet with a live board of upcoming issues, sold and open slots, real subscriber counts, and paid or unpaid status from Stripe.

Ghost
Stripe
App
Ghost cover art desk: generate and set every post image

See every draft, scheduled and published post in one place, spot the ones missing a cover, and set an on-brand image in a couple of clicks.

Generate Image
Ghost
Slack
App
Narrate every new Ghost blog post into an audio edition

Every hour, Geni finds your newest Ghost posts, narrates them in a consistent ElevenLabs voice, saves the MP3 to Google Drive, and announces the audio edition in Slack.

Ghost
ElevenLabs
Google Drive
+1
Agentic Task
Monday morning Ghost membership growth report in Slack

Start every week with a real read on your publication. Net new free vs paid members, churn, top posts, and one recommendation, posted to Slack.

Ghost
Slack Bot
Agentic Task
Daily AI blog posts from a Google Sheets idea queue

Every weekday at 7am, turn the next idea in your Google Sheet into a finished Ghost post with a matching stock photo and a published URL written back to the row.

Google Sheets
Pexels
Ghost
Agentic Task

Stop scrolling a flat list of posts.

Put your whole publishing month on one screen, drag it into shape, and turn parked ideas into finished first drafts.