{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"content-calendar","type":"registry:block","title":"Content Calendar","description":"Idea → Draft → Review → Published, with a calendar and a channel breakdown.","author":"Notion Arena","categories":["planning"],"tags":["native","free","content","marketing","calendar","editorial","social"],"meta":{"kind":"native","tier":"free","version":"1.3.0","updatedAt":"2026-09-16","notionPlan":"Plus","emoji":"📣","delivery":["api","duplicate","guide"],"capabilities":{"interactive":false,"offlineSafe":true,"persistsLocally":false,"writesToNotion":true,"needsNetwork":false},"recipe":"content-calendar","installUrl":"https://notionarena.vercel.app/api/install"},"files":[{"path":"recipes/content-calendar.json","type":"registry:file","target":"notion/recipes/content-calendar.json","content":"{\n  \"$schema\": \"https://notionarena.vercel.app/r/schema.json\",\n  \"notionVersion\": \"2026-03-11\",\n  \"id\": \"content-calendar\",\n  \"summary\": \"Ideas and Pieces with a promote-to-piece relation, an editorial calendar, a channel chart, and a public intake form.\",\n  \"databases\": [\n    {\n      \"ref\": \"ideas\",\n      \"title\": \"Ideas\",\n      \"icon\": \"💡\",\n      \"properties\": {\n        \"Name\": {\n          \"title\": {}\n        },\n        \"Score\": {\n          \"select\": {\n            \"options\": [\n              {\n                \"name\": \"A: ship it\",\n                \"color\": \"green\"\n              },\n              {\n                \"name\": \"B: needs work\",\n                \"color\": \"blue\"\n              },\n              {\n                \"name\": \"C: maybe\",\n                \"color\": \"yellow\"\n              },\n              {\n                \"name\": \"D: no\",\n                \"color\": \"red\"\n              }\n            ]\n          }\n        },\n        \"Angle\": {\n          \"multi_select\": {\n            \"options\": [\n              {\n                \"name\": \"How-to\",\n                \"color\": \"blue\"\n              },\n              {\n                \"name\": \"Contrarian\",\n                \"color\": \"red\"\n              },\n              {\n                \"name\": \"Data\",\n                \"color\": \"green\"\n              },\n              {\n                \"name\": \"Story\",\n                \"color\": \"purple\"\n              },\n              {\n                \"name\": \"Comparison\",\n                \"color\": \"yellow\"\n              }\n            ]\n          }\n        },\n        \"Audience\": {\n          \"select\": {\n            \"options\": [\n              {\n                \"name\": \"Beginner\",\n                \"color\": \"green\"\n              },\n              {\n                \"name\": \"Practitioner\",\n                \"color\": \"blue\"\n              },\n              {\n                \"name\": \"Decision maker\",\n                \"color\": \"purple\"\n              }\n            ]\n          }\n        },\n        \"Source\": {\n          \"select\": {\n            \"options\": [\n              {\n                \"name\": \"Support question\",\n                \"color\": \"yellow\"\n              },\n              {\n                \"name\": \"Sales call\",\n                \"color\": \"green\"\n              },\n              {\n                \"name\": \"Search term\",\n                \"color\": \"blue\"\n              },\n              {\n                \"name\": \"Shower thought\",\n                \"color\": \"pink\"\n              }\n            ]\n          }\n        },\n        \"Keyword / search volume\": {\n          \"rich_text\": {}\n        },\n        \"Piece\": {\n          \"relation\": {\n            \"type\": \"dual_property\",\n            \"dual_property\": {\n              \"synced_property_name\": \"Source idea\"\n            }\n          },\n          \"__relationRef\": \"pieces\"\n        },\n        \"Promoted\": {\n          \"checkbox\": {}\n        },\n        \"Notes\": {\n          \"rich_text\": {}\n        },\n        \"Submitted\": {\n          \"created_time\": {}\n        }\n      },\n      \"seed\": [\n        {\n          \"name\": \"Why Notion HTML blocks change component design\",\n          \"props\": {\n            \"Score\": \"A: ship it\",\n            \"Angle\": [\n              \"Contrarian\",\n              \"Data\"\n            ]\n          }\n        },\n        {\n          \"name\": \"The three ways to get a component into Notion\",\n          \"props\": {\n            \"Score\": \"A: ship it\",\n            \"Angle\": [\n              \"How-to\"\n            ]\n          }\n        }\n      ]\n    },\n    {\n      \"ref\": \"pieces\",\n      \"title\": \"Pieces\",\n      \"icon\": \"📣\",\n      \"properties\": {\n        \"Name\": {\n          \"title\": {}\n        },\n        \"Status\": {\n          \"status\": {\n            \"options\": [\n              {\n                \"name\": \"Brief\",\n                \"color\": \"gray\",\n                \"group\": \"To-do\"\n              },\n              {\n                \"name\": \"Drafting\",\n                \"color\": \"blue\",\n                \"group\": \"In progress\"\n              },\n              {\n                \"name\": \"Review\",\n                \"color\": \"yellow\",\n                \"group\": \"In progress\"\n              },\n              {\n                \"name\": \"Scheduled\",\n                \"color\": \"purple\",\n                \"group\": \"In progress\"\n              },\n              {\n                \"name\": \"Published\",\n                \"color\": \"green\",\n                \"group\": \"Complete\"\n              },\n              {\n                \"name\": \"Killed\",\n                \"color\": \"red\",\n                \"group\": \"Complete\"\n              }\n            ]\n          }\n        },\n        \"Channel\": {\n          \"multi_select\": {\n            \"options\": [\n              {\n                \"name\": \"Blog\",\n                \"color\": \"blue\"\n              },\n              {\n                \"name\": \"Newsletter\",\n                \"color\": \"yellow\"\n              },\n              {\n                \"name\": \"LinkedIn\",\n                \"color\": \"purple\"\n              },\n              {\n                \"name\": \"X\",\n                \"color\": \"gray\"\n              },\n              {\n                \"name\": \"YouTube\",\n                \"color\": \"red\"\n              },\n              {\n                \"name\": \"Docs\",\n                \"color\": \"green\"\n              }\n            ]\n          }\n        },\n        \"Format\": {\n          \"select\": {\n            \"options\": [\n              {\n                \"name\": \"Article\",\n                \"color\": \"blue\"\n              },\n              {\n                \"name\": \"Tutorial\",\n                \"color\": \"green\"\n              },\n              {\n                \"name\": \"Case study\",\n                \"color\": \"purple\"\n              },\n              {\n                \"name\": \"Changelog\",\n                \"color\": \"gray\"\n              },\n              {\n                \"name\": \"Video\",\n                \"color\": \"red\"\n              }\n            ]\n          }\n        },\n        \"Author\": {\n          \"people\": {}\n        },\n        \"Reviewer\": {\n          \"people\": {}\n        },\n        \"Publish date\": {\n          \"date\": {}\n        },\n        \"Last worked\": {\n          \"date\": {}\n        },\n        \"Live URL\": {\n          \"url\": {}\n        },\n        \"Cover\": {\n          \"files\": {}\n        },\n        \"Source idea\": {\n          \"relation\": {\n            \"type\": \"single_property\",\n            \"single_property\": {}\n          },\n          \"__relationRef\": \"ideas\"\n        },\n        \"Funnel stage\": {\n          \"select\": {\n            \"options\": [\n              {\n                \"name\": \"Awareness\",\n                \"color\": \"blue\"\n              },\n              {\n                \"name\": \"Consideration\",\n                \"color\": \"yellow\"\n              },\n              {\n                \"name\": \"Conversion\",\n                \"color\": \"green\"\n              }\n            ]\n          }\n        },\n        \"Words / length\": {\n          \"number\": {\n            \"format\": \"number_with_commas\"\n          }\n        },\n        \"Days to publish\": {\n          \"formula\": {\n            \"expression\": \"if(empty(prop(\\\"Publish date\\\")), 0, dateBetween(prop(\\\"Publish date\\\"), now(), \\\"days\\\"))\"\n          }\n        },\n        \"Ready\": {\n          \"formula\": {\n            \"expression\": \"if(and(prop(\\\"Status\\\") == \\\"Scheduled\\\", not(empty(prop(\\\"Publish date\\\"))), prop(\\\"Days to publish\\\") <= 7), \\\"🟢 Ready\\\", \\\"\\\")\"\n          }\n        },\n        \"Stalled\": {\n          \"formula\": {\n            \"expression\": \"if(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\\\", \\\"\\\")\"\n          }\n        },\n        \"Week\": {\n          \"formula\": {\n            \"expression\": \"format(prop(\\\"Publish date\\\"))\"\n          }\n        }\n      },\n      \"seed\": [\n        {\n          \"name\": \"Component registries, explained for Notion people\",\n          \"props\": {\n            \"Status\": \"Drafting\",\n            \"Channel\": [\n              \"Blog\",\n              \"Newsletter\"\n            ],\n            \"Format\": \"Article\"\n          }\n        },\n        {\n          \"name\": \"Build a KPI strip that runs inside a Notion page\",\n          \"props\": {\n            \"Status\": \"Scheduled\",\n            \"Channel\": [\n              \"YouTube\"\n            ],\n            \"Format\": \"Tutorial\"\n          }\n        }\n      ]\n    }\n  ],\n  \"views\": [\n    {\n      \"on\": \"pieces\",\n      \"name\": \"Editorial calendar\",\n      \"type\": \"calendar\",\n      \"configuration\": {\n        \"type\": \"calendar\",\n        \"calendar_by\": \"Publish date\"\n      }\n    },\n    {\n      \"on\": \"pieces\",\n      \"name\": \"Pipeline\",\n      \"type\": \"board\",\n      \"configuration\": {\n        \"type\": \"board\",\n        \"card_layout\": \"cover_dominant\"\n      }\n    },\n    {\n      \"on\": \"pieces\",\n      \"name\": \"Covers\",\n      \"type\": \"gallery\",\n      \"configuration\": {\n        \"type\": \"gallery\",\n        \"card_layout\": \"cover_dominant\",\n        \"cover_size\": \"medium\"\n      },\n      \"filter\": {\n        \"property\": \"Status\",\n        \"status\": {\n          \"equals\": \"Published\"\n        }\n      }\n    },\n    {\n      \"on\": \"pieces\",\n      \"name\": \"By channel\",\n      \"type\": \"chart\",\n      \"configuration\": {\n        \"type\": \"chart\",\n        \"chart_type\": \"column\",\n        \"x_axis\": {\n          \"type\": \"date\",\n          \"property_name\": \"Publish date\",\n          \"date_grouping\": \"month\"\n        },\n        \"y_axis\": {\n          \"aggregator\": \"count\"\n        },\n        \"color_theme\": \"pink\",\n        \"show_data_labels\": true,\n        \"height\": \"medium\"\n      }\n    },\n    {\n      \"on\": \"ideas\",\n      \"name\": \"Submit an idea\",\n      \"type\": \"form\",\n      \"configuration\": {\n        \"type\": \"form\",\n        \"properties\": [\n          {\n            \"property_name\": \"Name\",\n            \"visible\": true,\n            \"label\": \"Your idea\",\n            \"required\": true\n          },\n          {\n            \"property_name\": \"Angle\",\n            \"visible\": true,\n            \"label\": \"What kind of piece?\"\n          },\n          {\n            \"property_name\": \"Audience\",\n            \"visible\": true,\n            \"label\": \"Who is it for?\"\n          },\n          {\n            \"property_name\": \"Notes\",\n            \"visible\": true,\n            \"label\": \"Anything else\",\n            \"required\": false\n          }\n        ],\n        \"submit_label\": \"Send it over\"\n      }\n    },\n    {\n      \"on\": \"ideas\",\n      \"name\": \"Idea backlog\",\n      \"type\": \"table\",\n      \"sorts\": [\n        {\n          \"property\": \"Score\",\n          \"direction\": \"ascending\"\n        }\n      ]\n    },\n    {\n      \"on\": \"pieces\",\n      \"name\": \"Stalled\",\n      \"type\": \"table\",\n      \"filter\": {\n        \"property\": \"Stalled\",\n        \"string\": {\n          \"contains\": \"Stalled\"\n        }\n      }\n    }\n  ],\n  \"pages\": [\n    {\n      \"title\": \"Editorial home\",\n      \"icon\": \"🗞️\",\n      \"blocks\": [\n        {\n          \"object\": \"block\",\n          \"type\": \"table_of_contents\",\n          \"table_of_contents\": {\n            \"color\": \"gray\"\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"heading_2\",\n          \"heading_2\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"This week\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"color\": \"default\",\n            \"is_toggleable\": false\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"paragraph\",\n          \"paragraph\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Linked view of Pieces filtered to Ready, plus anything Stalled. Two lists, no third.\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"color\": \"default\"\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"heading_2\",\n          \"heading_2\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"The calendar\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"color\": \"default\",\n            \"is_toggleable\": false\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"paragraph\",\n          \"paragraph\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Embed the Editorial calendar view full-width. Publish dates are the contract; everything else is negotiable.\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"color\": \"default\"\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"heading_2\",\n          \"heading_2\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Idea intake\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"color\": \"default\",\n            \"is_toggleable\": false\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"callout\",\n          \"callout\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Publish the form view to a public URL and put it in your footer. \",\n                  \"link\": null\n                },\n                \"annotations\": {\n                  \"bold\": true\n                }\n              },\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Support questions are the best idea source you have: they are pre-qualified by the fact that someone asked.\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"icon\": {\n              \"type\": \"emoji\",\n              \"emoji\": \"💡\"\n            },\n            \"color\": \"yellow_background\"\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"divider\",\n          \"divider\": {}\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"heading_3\",\n          \"heading_3\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Scoring an idea\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"color\": \"default\",\n            \"is_toggleable\": false\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"table\",\n          \"table\": {\n            \"table_width\": 3,\n            \"has_column_header\": true,\n            \"has_row_header\": false\n          },\n          \"children\": [\n            {\n              \"object\": \"block\",\n              \"type\": \"table_row\",\n              \"table_row\": {\n                \"cells\": [\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Score\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Meaning\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Action\",\n                        \"link\": null\n                      }\n                    }\n                  ]\n                ]\n              }\n            },\n            {\n              \"object\": \"block\",\n              \"type\": \"table_row\",\n              \"table_row\": {\n                \"cells\": [\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"A\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Specific audience, specific problem, we have proof\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Brief this week\",\n                        \"link\": null\n                      }\n                    }\n                  ]\n                ]\n              }\n            },\n            {\n              \"object\": \"block\",\n              \"type\": \"table_row\",\n              \"table_row\": {\n                \"cells\": [\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"B\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Right topic, thin evidence\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Find the data or the story first\",\n                        \"link\": null\n                      }\n                    }\n                  ]\n                ]\n              }\n            },\n            {\n              \"object\": \"block\",\n              \"type\": \"table_row\",\n              \"table_row\": {\n                \"cells\": [\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"C\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Interesting to us, unclear to a reader\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Park it\",\n                        \"link\": null\n                      }\n                    }\n                  ]\n                ]\n              }\n            },\n            {\n              \"object\": \"block\",\n              \"type\": \"table_row\",\n              \"table_row\": {\n                \"cells\": [\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"D\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"We have said it, or nobody needs it\",\n                        \"link\": null\n                      }\n                    }\n                  ],\n                  [\n                    {\n                      \"type\": \"text\",\n                      \"text\": {\n                        \"content\": \"Delete it\",\n                        \"link\": null\n                      }\n                    }\n                  ]\n                ]\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}"},{"path":"recipes/content-calendar.manual.md","type":"registry:file","target":"notion/recipes/content-calendar.manual.md","content":"## Recurring template: weekly editorial slots\n\n**Why this cannot be scripted:** 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.\n\n1. Pieces → ▾ beside New → + New template → “Weekly slot”.\n2. Set Status to Brief, Publish date to next Monday, Channel to Newsletter.\n3. Template ••• → Repeat → Every Monday at 08:00.\n4. Create four of these if you publish weekly on four channels; one template cannot vary its own properties by weekday.\n\n## Automation: tell the reviewer when a draft is ready\n\n**Why this cannot be scripted:** Database automations have no public API surface. They are configured per-database in the Notion app under ••• → Automations.\n\n1. Pieces → Automations → New automation.\n2. Trigger: Status changes to Review.\n3. Action: add a comment @mentioning Reviewer.\n4. Second automation: when Status becomes Published and Live URL is empty, comment “Add the URL”.\n"}]}