Daily blog draft from your content calendar to Contentful
Every weekday at 8am, take the next topic from your Google Sheets content calendar, draft a full first-pass article, and save it as a Contentful draft for review.
Every weekday at 8am (skip weekends), read our Google Sheets content calendar using the Get Values operation. The calendar has one row per topic with columns: topic, target keyword, angle, notes, status. The spreadsheet id, sheet/tab name, and header row should all be configurable knobs.
Find the first row where the status column is empty or set to unclaimed. Process exactly one row per run to keep behavior predictable. If no unclaimed row is found, log that and stop for the day without creating anything.
For that row, draft a full first-pass blog article tuned to the topic, target keyword, angle, and any notes on the row. The draft must include: an H1 headline that uses the target keyword naturally; a 2-3 sentence intro; three to five section headings with 1-2 paragraphs of body copy under each; and a meta description around 150-160 characters that leads with the target keyword. The body should read like a real first draft, not an outline.
Create the draft in Contentful using the Create Entry operation against the blogPost content type. Leave the entry as a draft — never publish it, and never call any publish endpoint. Populate localized fields keyed by locale code, defaulting to en-US: for example fields.title["en-US"], fields.body["en-US"], fields.metaDescription["en-US"], fields.slug["en-US"]. The Contentful space id, environment (default master), content type id (default blogPost), locale code (default en-US), and the exact field id mapping should all be configurable so the workflow adapts to spaces with a different schema.
Once Contentful returns the new entry sys.id, write two things back to the same calendar row using the Update Values operation: the new entry id (or a link built from the space/environment/entry id) in a dedicated column, and "Draft ready" in the status column, so the marketing team knows the row is queued for review.
Only touch one row per run. Never publish. If anything fails partway through (draft written but calendar update fails, or vice versa), report the failure clearly so a human can reconcile the row before the next morning's run.
Additional information
What does this prompt do?
- Every weekday morning, grabs the next unclaimed row from your Google Sheets content calendar (topic, target keyword, angle, notes, status).
- Drafts a full first-pass blog article with a headline, intro, three to five sections, and a meta description tuned to your target keyword.
- Saves the draft to your Contentful blogPost content type as a draft, so nothing is published without your team's sign-off.
- Writes the new Contentful entry link and a Draft ready status back to the calendar row so marketing knows exactly what to review.
What do I need to use this?
- A Google Sheet with your content calendar — one row per topic, with columns for topic, target keyword, angle, notes, and status.
- A Contentful space with a blogPost content type (or a similar one you point the workflow at) and a login to save drafts into it.
How can I customize it?
- When it runs — Monday only, twice a day, a different time zone, or on top of a different signal in the sheet.
- Which Contentful content type to write to and which locale to fill in, if yours is not blogPost or en-US.
- How the draft should read — target word count, house style guide, and how strictly to hit the keyword.
Frequently asked questions
Will this publish the article automatically?
What if there are no unclaimed rows in the calendar?
Can I point it at a content type other than blogPost?
Does it work with multiple locales?
What if someone already started a draft for that topic by hand?
Related templates
Stop staring at the blank page every morning.
Let your content calendar hand a fresh first draft to your marketing team before they open their laptops.