Skip to content
Notion Arena
HomeComponentsDocs & SystemsMeeting Notes OS
📝
📚 Docs & SystemsFreeNative recipeStaff pick

Meeting Notes OS

A meetings database with a template that writes its own action items.

Version
v3.0.0
Updated
2026-10-08
Plan
Free

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.

24
requests
13
manual steps
1POST
/v1/pages

Create the “meeting-notes-os” container page under the page you chose

2POST
/v1/databases

Create the “Meetings” database with 10 base properties

3GET
/v1/databases/{meetings_database_id}

Read back Meetings to get its default data source id

4PATCH
/v1/data_sources/{meetings_data_source_id}

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

5POST
/v1/databases

Create the “Action Items” database with 6 base properties

6GET
/v1/databases/{actions_database_id}

Read back Action Items to get its default data source id

7PATCH
/v1/data_sources/{actions_data_source_id}

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

8POST
/v1/databases

Create the “Projects” database with 4 base properties

9GET
/v1/databases/{projects_database_id}

Read back Projects to get its default data source id

10PATCH
/v1/data_sources/{projects_data_source_id}

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

11POST
/v1/views

Create the “Calendar” calendar view on meetings

12POST
/v1/views

Create the “Notes owed” table view on meetings

13POST
/v1/views

Create the “By type” board view on meetings

14POST
/v1/views

Create the “My open actions” table view on actions

15POST
/v1/views

Create the “Overdue” list view on actions

16POST
/v1/views

Create the “Meetings per project” chart view on meetings

17POST
/v1/pages

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

×2
18POST
/v1/pages

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

×2
19POST
/v1/pages

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

×2
20POST
/v1/pages

Create the “Meeting page template body” page

21PATCH
/v1/blocks/{meeting_page_template_body_page_id}/children

Append 16 blocks of page body

3 steps cannot be scripted: Database template: “Meeting”; Button: “New meeting”; Automation: close the loop after the meeting.

Run it yourselfNotion-Version 2026-03-11
curl -X POST https://notionarena.vercel.app/api/install \
  -H 'content-type: application/json' \
  -d '{
    "component": "meeting-notes-os",
    "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.

📝

Meetings

ref: meetings
1× title1× select1× date1× people1× status2× relation2× rich_text1× url1× files2× rollup2× formula1× created_time
Namen/a
Type1:1 · Team · Project · Client +2
Daten/a
Attendeesn/a
StatusScheduled → Happening → Notes written → Actions closed +1
Project→ projects (two-way)
Action items→ actions (two-way)
Agendan/a
Decisionsn/a
Recordingn/a
Attachmentsn/a
Open actionsunchecked(Action items.Done)
All actionscount_values(Action items.Name)
Actions closedif(prop("All actions") == 0, "n/a", format(prop("All actions") - prop("Open actions")) + "/" + format(prop("All actions")))
Is overdueif(and(prop("Date") < now(), prop("Status") == "Scheduled"), "🔴 Notes not written", "")
Createdn/a
✅

Action Items

ref: actions
1× title1× people1× date1× checkbox1× select1× relation1× rich_text1× formula
Namen/a
Ownern/a
Duen/a
Donen/a
PriorityHigh · Medium · Low
Meeting→ meetings
Contextn/a
Due stateifs(prop("Done"), "✅ Done", empty(prop("Due")), "⚪ No date", prop("Due") < now(), "🔴 Overdue", dateBetween(prop("Due"), now(), "days") == 0, "🟠 Today", true, "🟢 " + format(dateBetween(prop("Due"), now(), "days")) + "d")
📁

Projects

ref: projects
1× title1× status1× people1× date1× relation1× rollup
Namen/a
Statusdefault Not started / In progress / Done
Ownern/a
Duen/a
Meetings→ meetings
Meeting countcount_values(Meetings.Name)

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.

Calendarcalendar

on meetings

Notes owedtable

on meetings

filter: {"property":"Is overdue","string":{"does_not_equal":""}}…

By typeboard

on meetings

My open actionstable

on actions

filter: {"and":[{"property":"Done","checkbox":{"equals":false}},{"proper…

Overduelist

on actions

filter: {"property":"Due state","string":{"contains":"Overdue"}}…

Meetings per projectchart

on meetings

Documentation pages

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

📄Meeting page template body16 blocks
📄This is the body Notion inserts when you apply the “Meeting” database template. Every block below is a real block type: the installer can build the equivalent page directly through Append block children.

Date

@Attendees

Type

Project


Agenda
1.…
Notes
Topic 1

Notes

•Detail
Decisions
📌Record the decision and the reason, not just the outcome. Six months from now the reason is the only part that is useful.
•Decision, why, who decided
Action items

Embed the Action Items database as a linked view filtered to this meeting. Then each row you add is a real tracked action with an owner and a due date.

Action, @owner, due date

Carry-over

Anything unresolved from the last meeting with this group. Linked view: same Type, same Attendees, Status ≠ Actions closed.

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.

Database template: “Meeting”

The API can create a page with this body and can apply an existing template when creating a page, but it cannot author the template itself.

  1. 1Meetings → the ▾ beside New → + New template.
  2. 2Name it “Meeting”. Set Type and Status = Scheduled as property defaults.
  3. 3Paste the body shown on this page: Notion keeps the headings, toggles and to-dos as real blocks.
  4. 4In the Action items section, type /linked and choose Action Items, filtered to Meeting = this page (Relative link → Meeting).
  5. 5Template ••• → Set as default.

Button: “New meeting”

Button properties are response-only in the Notion API: the schema is returned on read, but the API ignores button settings on write and cannot create a button or configure its actions.

  1. 1On your Meetings home page: /button.
  2. 2Action 1: Add page to → Meetings. Apply the “Meeting” template. Set Date to Today, Type to Team.
  3. 3Action 2: Open page → the page created in step 1.
  4. 4Label it “+ New meeting” and give it an icon.

Automation: close the loop after the meeting

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

  1. 1Meetings → Automations → New automation.
  2. 2Trigger: Date is before Today. Condition: Status is Scheduled.
  3. 3Action: do not set Status to “Notes written”. Add a comment @mentioning the first attendee: “Notes owed.”
  4. 4Second automation: when every Action item is Done, set Status to “Actions closed”. Notion cannot express “all related rows”, so use a weekly recurring review instead.

About this component

The highest-leverage recipe in the kit. One database, one page template with agenda / notes / decisions / action items sections, a relation from action items back to a Tasks database, and a button that opens a pre-filled new meeting in one click.

What it does

  • Template content is created with real block types: headings, toggles, to-dos, callouts
  • Action items get their own due date and owner, and roll back up to the meeting
  • Formula that renders 'Overdue', 'Due today' or 'Scheduled' from the due date
  • Calendar view grouped by meeting type

Where people put it

↳Team wikis where decisions must be findable later
↳1:1 tracking between manager and report
↳Client call logs with follow-ups

Pairs well with

All in Docs & Systems
📖
New

Reading Progress Tracker

Track pages read in one book, with progress saved on this device.

DocsFreeWidgetv1.0.0
🧠
New

Spaced Repetition Deck

A due-card queue with simple local review intervals.

DocsFreeWidgetv1.0.0
🧠
New

Flashcards

A focused question-and-answer deck with active-recall progress.

DocsFreeWidgetv1.0.0