Skip to content
Notion Arena
📣
🗂️ Planning & ProjectsFreeNative recipe

Content Calendar

Idea → Draft → Review → Published, with a calendar and a channel breakdown.

Version
v1.3.0
Updated
2026-09-16
Plan
Plus

The install plan

Exactly what Notion Arena sends to Notion, in order. Notion's data-source model forces two passes: relations, rollups and the formulas that read them need data_source_ids that only exist once the databases do.

20
requests
8
manual steps
1POST
/v1/pages

Create the “content-calendar” container page under the page you chose

2POST
/v1/databases

Create the “Ideas” database with 9 base properties

3GET
/v1/databases/{ideas_database_id}

Read back Ideas to get its default data source id

4PATCH
/v1/data_sources/{ideas_data_source_id}

Add 1 deferred properties to Ideas: relations (with resolved data_source_ids), then the rollups and formulas that read them

5POST
/v1/databases

Create the “Pieces” database with 12 base properties

6GET
/v1/databases/{pieces_database_id}

Read back Pieces to get its default data source id

7PATCH
/v1/data_sources/{pieces_data_source_id}

Add 5 deferred properties to Pieces: relations (with resolved data_source_ids), then the rollups and formulas that read them

8POST
/v1/views

Create the “Editorial calendar” calendar view on pieces

9POST
/v1/views

Create the “Pipeline” board view on pieces

10POST
/v1/views

Create the “Covers” gallery view on pieces

11POST
/v1/views

Create the “By channel” chart view on pieces

12POST
/v1/views

Create the “Submit an idea” form view on ideas

13POST
/v1/views

Create the “Idea backlog” table view on ideas

14POST
/v1/views

Create the “Stalled” table view on pieces

15POST
/v1/pages

Seed 2 rows into Ideas so the views are not empty on first open (one request per row; Notion has no bulk insert)

×2
16POST
/v1/pages

Seed 2 rows into Pieces so the views are not empty on first open (one request per row; Notion has no bulk insert)

×2
17POST
/v1/pages

Create the “Editorial home” page

18PATCH
/v1/blocks/{editorial_home_page_id}/children

Append 10 blocks of page body

2 steps cannot be scripted: Recurring template: weekly editorial slots; Automation: tell the reviewer when a draft is ready.

Run it yourselfNotion-Version 2026-03-11
curl -X POST https://notionarena.vercel.app/api/install \
  -H 'content-type: application/json' \
  -d '{
    "component": "content-calendar",
    "mode": "plan"
  }'

# add "token" and "parentPageId" and switch to "mode": "api" to install for real

What gets created

The real property schemas, not a description of them. Every formula below is a Notion Formula 2.0 expression you can paste into a property by hand if you would rather not use the API at all.

💡

Ideas

ref: ideas
1× title3× select1× multi_select2× rich_text1× relation1× checkbox1× created_time
Namen/a
ScoreA: ship it · B: needs work · C: maybe · D: no
AngleHow-to · Contrarian · Data · Story +1
AudienceBeginner · Practitioner · Decision maker
SourceSupport question · Sales call · Search term · Shower thought
Keyword / search volumen/a
Piece→ pieces (two-way)
Promotedn/a
Notesn/a
Submittedn/a
📣

Pieces

ref: pieces
1× title1× status1× multi_select2× select2× people2× date1× url1× files1× relation1× number4× formula
Namen/a
StatusBrief → Drafting → Review → Scheduled +2
ChannelBlog · Newsletter · LinkedIn · X +2
FormatArticle · Tutorial · Case study · Changelog +1
Authorn/a
Reviewern/a
Publish daten/a
Last workedn/a
Live URLn/a
Covern/a
Source idea→ ideas
Funnel stageAwareness · Consideration · Conversion
Words / lengthnumber_with_commas
Days to publishif(empty(prop("Publish date")), 0, dateBetween(prop("Publish date"), now(), "days"))
Readyif(and(prop("Status") == "Scheduled", not(empty(prop("Publish date"))), prop("Days to publish") <= 7), "🟢 Ready", "")
Stalledif(and(prop("Status") != "Published", not(empty(prop("Last worked"))), dateBetween(now(), prop("Last worked"), "days") > 10), "⚠️ Stalled " + format(dateBetween(now(), prop("Last worked"), "days")) + "d", "")
Weekformat(prop("Publish date"))

Views

Created through POST /v1/views, which shipped in March 2026 and is the reason provisioning a workspace from code finally works end to end.

Editorial calendarcalendar

on pieces

Pipelineboard

on pieces

Coversgallery

on pieces

filter: {"property":"Status","status":{"equals":"Published"}}…

By channelchart

on pieces

Submit an ideaform

on ideas

Idea backlogtable

on ideas

Stalledtable

on pieces

filter: {"property":"Stalled","string":{"contains":"Stalled"}}…

Documentation pages

Appended with real block types (headings, toggles, callouts, to-dos, column lists) in chunks of 100, the Append block children limit.

🗞️Editorial home10 blocks
≡ table of contents
This week

Linked view of Pieces filtered to Ready, plus anything Stalled. Two lists, no third.

The calendar

Embed the Editorial calendar view full-width. Publish dates are the contract; everything else is negotiable.

Idea intake
💡Publish the form view to a public URL and put it in your footer. Support questions are the best idea source you have: they are pre-qualified by the fact that someone asked.

Scoring an idea
ScoreMeaningAction
ASpecific audience, specific problem, we have proofBrief this week
BRight topic, thin evidenceFind the data or the story first
CInteresting to us, unclear to a readerPark it
DWe have said it, or nobody needs itDelete it

The parts the API cannot do

Every recipe ships with its manual steps written out, because pretending the API covers everything is how people end up with a half-built workspace. These are real Notion limitations, quoted from the API reference.

Recurring template: weekly editorial slots

Recurring database templates (daily/weekly/monthly) are configured in the app on the template's ••• menu; the API can create pages from a template but cannot schedule recurrence.

  1. 1Pieces → ▾ beside New → + New template → “Weekly slot”.
  2. 2Set Status to Brief, Publish date to next Monday, Channel to Newsletter.
  3. 3Template ••• → Repeat → Every Monday at 08:00.
  4. 4Create four of these if you publish weekly on four channels; one template cannot vary its own properties by weekday.

Automation: tell the reviewer when a draft is ready

Database automations have no public API surface. They are configured per-database in the Notion app under ••• → Automations.

  1. 1Pieces → Automations → New automation.
  2. 2Trigger: Status changes to Review.
  3. 3Action: add a comment @mentioning Reviewer.
  4. 4Second automation: when Status becomes Published and Live URL is empty, comment “Add the URL”.

About this component

A content pipeline with an Ideas database, a Pieces database holding channel, publish date and status, and a calendar view that doubles as the editorial schedule. Includes the recurring weekly template that seeds next week's slots.

What it does

  • Chart view: pieces published per channel per month
  • Gallery view using page covers so the calendar reads visually
  • Form view for contributors to submit ideas without workspace access
  • Status groups that drive a 'ready to publish' formula

Where people put it

↳Solo creators running three channels
↳Marketing teams with freelance contributors
↳Newsletter operators planning issues
🗃️

Mini Kanban

A drag-and-drop board that lives inside a page, not a database.

PlanningProWidgetv1.1.0
🧭

Eisenhower Matrix

Sort tasks by urgency and importance in four quadrants.

PlanningFreeWidgetv1.0.3
📅

Gantt Timeline

A dependency-aware timeline you can hand to a client.

PlanningProWidgetv1.2.0