---
title: "Recipe: Content and marketing operations"
description: "TL;DR: From a content brief, this playbook drafts a piece with an agent, saves it to Notion or your CMS as a draft, then parks with metaphor.waitForInput for reviewer Approve / Request changes. On approve it publishes to Webflow or your CMS. Trigger is manual or a new brief; outputs are a draft, a durable review gate, and an optional publish."
canonical_url: "https://docs.ballet.dev/articles/recipe-content-and-marketing-operations-FHMcpIJmBl"
md_url: "https://docs.ballet.dev/articles/recipe-content-and-marketing-operations-FHMcpIJmBl.md"
---
# Recipe: Content and marketing operations

**TL;DR:** From a content brief, this playbook drafts a piece with an agent, saves it to Notion or your CMS as a draft, then parks with `metaphor.waitForInput` for reviewer Approve / Request changes. On approve it publishes to Webflow or your CMS. Trigger is manual or a new brief; outputs are a draft, a durable review gate, and an optional publish.

## Who this is for

Marketing and content teams that want a consistent draft-review-publish pipeline.

## What you'll need

* **Connectors:** Notion (or CMS), Webflow (or publishing API), Slack (optional notifier).
* **Secrets:** Notion token, CMS/Webflow API key, Slack token (stored in Secrets — never hardcoded).
* **Trigger:** Manual run, or a webhook when a brief is created.

## How to build it with Ask Ballet

1. Open the Console on Home.
2. Paste the prompt below; set your brand voice and review channel.
3. Review the plan and confirm.
4. Connect Notion/CMS, Webflow, and Slack.

```text
Build a playbook that takes a content brief (topic, audience, keywords, outline) as
input. Draft a 600-800 word article in our brand voice with a title and meta
description. Save it as a draft page in Notion. Then call metaphor.waitForInput with
prompt "Approve draft for publish?", details (title, draft link, summary), and choices
Approve / Request changes — do not busy-wait or poll Slack. On Approve, publish to
Webflow as a draft post. On Request changes, stop and notify #content-review.
Optionally have a Slack notifier wake the run via POST /api/runs/:id/reply.
```

## What the playbook does

1. **Manual/webhook trigger** — accepts the brief input.
2. **Code step (draft)** — generates the article and metadata from the brief.
3. **HTTP step (save draft)** — creates the Notion/CMS draft.
4. **Code step (review gate)** — `await metaphor.waitForInput({ prompt, details, schema })` parks the same `runId` until a reviewer Continues in Studio or a notifier replies.
5. **HTTP step (publish)** — on approve, pushes to Webflow/CMS; on reject, skips publish and notifies.

## Variations and tips

* Feed this from [Generate a content brief](/articles/recipe-generate-a-content-brief-oatxIlpMYt): that recipe produces the brief; this one drafts, reviews, and publishes from it.
* Keep a human approval gate with durable `waitForInput` — not Console Allow/Ask mode and not a busy-loop. See [pause and resume](/articles/how-do-i-pause-and-resume-a-playbook-run-TK6ueiBF0d).
* Pass the draft link and summary as `details` so reviewers see the payload while Paused.
* Store all CMS and Slack tokens in Secrets.

## Related articles

* [How do I pause and resume a playbook run?](/articles/how-do-i-pause-and-resume-a-playbook-run-TK6ueiBF0d)
* [How do I wake a suspended run with reply or resume?](/articles/how-do-i-wake-a-suspended-run-with-reply-or-resume-EDYuheV1x4)
* [Generate a content brief](/articles/recipe-generate-a-content-brief-oatxIlpMYt)
* [Campaign performance report](/articles/recipe-campaign-performance-report-G5cihP4jhy)
* [How do I build a playbook with the Console?](/articles/how-do-i-build-a-playbook-with-the-console-ask-ballet-oHptRP9mI4)
