Content Publishing Pipeline
Your team wants to publish a blog post, case study, or guide. This procedure coordinates the entire pipeline — from creating a brief, through writing and review, to publishing and announcement. It keeps author, editor, designer, and publisher in sync without anyone playing project manager.
Use it when: Someone has a content idea that needs to go from draft to published. Works for blog posts, case studies, guides, announcements, and newsletters.
What makes it interesting: It has review loops — if the editor requests changes, the procedure sends the author back to drafting. It nudges authors who are falling behind on deadlines, and handles different content types (blog vs. newsletter) with different publishing checks.
Walkthrough
Header
id: content-publishing
version: 1
trigger: manual
category: Operations
# Content Publishing Pipeline
Take a content piece from idea through writing, review, design, and publishing.
Covers blog posts, case studies, and educational guides.Input
The inputs capture the content brief. SEO keywords and a topic brief are optional but help the author get started faster.
## Input
| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| title | string | yes | | Working title |
| type | string | yes | | blog-post / case-study / guide / announcement / newsletter |
| author | string | yes | | Who's writing it |
| target_date | date | no | +2 weeks | Target publish date |
| brief | string | no | | Topic brief, angle, audience, key points |
| seo_keywords | string | no | | Target keywords |
| channel | string | no | #marketing | Slack channel for updates |State
## State
| Field | Storage | Description |
|-------|---------|-------------|
| content_record | Notion DB row | Row in Content Calendar |
| draft_page | Notion page | The actual draft |
| current_step | invocation | Where we are |Steps
Step 1 — Create the brief. Set up a Content Calendar entry and a draft page. If no brief was provided, the procedure creates a template for the author to fill in.
### create_brief
Create a row in the **Content Calendar** database with title, type, author,
status "Drafting", target date, and SEO keywords.
Create a Notion page for the draft. If brief provided, add it as the opening
section. Otherwise, add a template:
## Brief
**Audience:** [who is this for?]
**Angle:** [what's the unique take?]
**Key points:** [3-5 bullet points]
**CTA:** [what should the reader do next?]
DM {input.author}: "Content piece created: '{input.title}'. Draft page: [link].
Target: {input.target_date}."
→ write_draftStep 2 — Wait for the draft. The procedure waits until one week before the publish date. If the author goes quiet for too long, it sends a reminder.
### write_draft
**Wait until**: {input.target_date} - 7d (one week before publish)
**On event** `draft_ready` → review
Periodic nudge if no event after 50% of time:
DM {input.author}: "Reminder: '{input.title}' draft is due soon."
→ reviewStep 3 — Review. Post the draft for the team to review. If the reviewer requests changes, execution loops back to the writing step.
### review
Update content record status to "In Review".
Post in {input.channel}:
> 📝 Ready for review: **{input.title}**
> Author: {input.author} | Type: {input.type}
> Draft: [link]
> Please review and leave comments. React ✅ when approved.
**Wait**: 3d
- **On event** `approved` → prepare_publish
- **On event** `changes_requested`: DM author with feedback, → write_draft
- **On timeout**: Ping reviewer again, CC marketing lead.
→ prepare_publishStep 4 — Prepare for publishing. Run content-type-specific checks before handoff to the publisher.
### prepare_publish
Update status to "Ready to Publish".
For blog-post or guide:
- Check SEO metadata (title tag, meta description, keywords)
- Check for at least one image/graphic
- If no image, request one in {input.channel}
For newsletter:
- Prepare email subject line and preview text
DM publisher: "'{input.title}' is ready to publish. All assets attached."
→ publishStep 5 — Publish. Go live and announce to the company.
### publish
Update status to "Published". Set Published Date to today.
Post in {input.channel}:
> 🚀 Published: **{input.title}** — [URL]
> Author: {input.author}. Please share on socials!
Post in #general: "New on the blog: **{input.title}** — [link]"
→ done ✓Output
## Output
| Field | Type | Description |
|-------|------|-------------|
| published_url | string | URL of the published piece |
| content_record_id | string | Notion page ID in Content Calendar |
| days_to_publish | number | Days from creation to publish |
| type | string | Content type |Key Patterns
This procedure demonstrates patterns you can reuse:
- Review loops —
changes_requestedsends the author back to drafting - Periodic nudges — the author gets reminded before deadlines
- Content-type branching — different checks for blog posts vs. newsletters
- Multi-role coordination — author, reviewer, designer, and publisher stay in sync