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.

Agentic Task
ContentfulGoogle SheetsMarketingContent Generation
PromptCreate

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.

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.

FAQs

Will this publish the article automatically?
No. It always saves the article as a draft in Contentful. Your marketing team reviews it and publishes when they are ready.
What if there are no unclaimed rows in the calendar?
The workflow skips that run and does not create a draft. It will try again the next morning.
Can I point it at a content type other than blogPost?
Yes. The content type is a knob you set when you configure the workflow, so any Contentful content type with fields for title, body, and meta description works.
Does it work with multiple locales?
Yes. It writes each field under the locale code you tell it to use, so a multi-language Contentful space is fine.
What if someone already started a draft for that topic by hand?
Mark the row's status as claimed (or anything other than empty or unclaimed) and the workflow will skip it on the next run.

Related templates

Call overdue Xero customers with an AI collections agent

Every weekday at 10am, an AI voice agent phones your most overdue Xero accounts, logs what each customer promised, and reports back to finance in Slack.

LiveKit
Xero
Deepgram
+2
Agentic Task
Local listing health board for every location you manage

See every Google Maps listing you manage on one screen, ranked worst first, with an audit button that writes the fix list for you.

Local Business Data
Google Sheets
App
Let support send one-off Loops emails without an engineer

Your team picks a template, finds the customer, checks they are safe to email, then sends it, with every send logged where the whole team can see it.

Loops.so
Stripe
Google Sheets
App
Stop cold emails to anyone with a live deal in Pipedrive

Every night at 2am, pull the contacts on your open and won deals and block them from your cold outreach before the next send goes out.

Mailshake
Pipedrive
Google Sheets
Deterministic Code
iMessage campaign console with pre-flight checks and delivery board

Build every text campaign in one screen: check who is actually reachable, see a realistic send plan, then watch delivery land row by row.

LoopMessage
Google Sheets
HubSpot
App
LinkedIn Ads budget pacing dashboard for every client account

See every LinkedIn ad account's spend against the budget you committed to, catch overspend early, and rebalance without rebuilding a spreadsheet.

LinkedIn Ads
Google Sheets
Slack Bot
App

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.