Skip to content
Notion Arena
🎯
💼 Business & CRMFreeNative recipe

OKR System

Objectives, key results and confidence, rolled up to a company score.

Version
v1.2.0
Updated
2026-09-12
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.

24
requests
7
manual steps
1POST
/v1/pages

Create the “okr-system” container page under the page you chose

2POST
/v1/databases

Create the “Objectives” database with 6 base properties

3GET
/v1/databases/{objectives_database_id}

Read back Objectives to get its default data source id

4PATCH
/v1/data_sources/{objectives_data_source_id}

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

5POST
/v1/databases

Create the “Key Results” database with 9 base properties

6GET
/v1/databases/{keyResults_database_id}

Read back Key Results to get its default data source id

7PATCH
/v1/data_sources/{keyResults_data_source_id}

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

8POST
/v1/databases

Create the “Initiatives” database with 5 base properties

9GET
/v1/databases/{initiatives_database_id}

Read back Initiatives to get its default data source id

10PATCH
/v1/data_sources/{initiatives_data_source_id}

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

11POST
/v1/views

Create the “This quarter” board view on objectives

12POST
/v1/views

Create the “Scores by team” chart view on objectives

13POST
/v1/views

Create the “Needs an update” table view on keyResults

14POST
/v1/views

Create the “All key results” list view on keyResults

15POST
/v1/views

Create the “Initiative board” board view on initiatives

16POST
/v1/pages

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

×2
17POST
/v1/pages

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

×3
18POST
/v1/pages

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

×2
19POST
/v1/pages

Create the “Weekly OKR check-in” page

20PATCH
/v1/blocks/{weekly_okr_check_in_page_id}/children

Append 9 blocks of page body

2 steps cannot be scripted: Automation: flag confidence below 5; Recurring template: weekly check-in page.

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

🎯

Objectives

ref: objectives
1× title2× select1× people1× status1× rich_text1× relation3× rollup3× formula
Namen/a
Quarter2026 Q3 · 2026 Q4 · 2027 Q1 · 2027 Q2
TeamCompany · Product · Engineering · Revenue
Ownern/a
StatusDraft → Committed → Tracking → Achieved +1
Why it mattersn/a
Key results→ keyResults (two-way)
KR countcount_values(Key results.Name)
Average progressaverage(Key results.Progress)
Average confidenceaverage(Key results.Confidence)
Scoreif(prop("KR count") == 0, 0, round(prop("Average progress") * 100))
On trackifs(prop("Score") >= 70, "🟢 On track", prop("Score") >= 40, "🟡 At risk", prop("Score") > 0, "🔴 Off track", true, "⚪ Not started")
Days left in quarterdateBetween(dateAdd(now(), 90, "days"), now(), "days")
📐

Key Results

ref: keyResults
1× title2× relation1× people1× select4× number1× rich_text1× date4× formula
Namen/a
Objective→ objectives
Ownern/a
MetricCount · Percentage · Revenue · Time +1
Start valuenumber
Target valuenumber
Current valuenumber
Unitn/a
Confidencenumber
Last updatedn/a
Initiatives→ initiatives (two-way)
Progressif(prop("Target value") == prop("Start value"), 0, min(1, max(0, (prop("Current value") - prop("Start value")) / (prop("Target value") - prop("Start value")))))
Progress labelformat(round(prop("Progress") * 100)) + "%"
Staleif(empty(prop("Last updated")), true, dateBetween(now(), prop("Last updated"), "days") > 10)
Confidence labelifs(prop("Confidence") >= 8, "🟢 " + format(prop("Confidence")), prop("Confidence") >= 5, "🟡 " + format(prop("Confidence")), true, "🔴 " + format(prop("Confidence")))
🛠️

Initiatives

ref: initiatives
1× title1× status1× people1× date1× relation1× rich_text
Namen/a
Statusdefault Not started / In progress / Done
Ownern/a
Duen/a
Key result→ keyResults
Notesn/a

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.

This quarterboard

on objectives

filter: {"property":"Quarter","select":{"equals":"2026 Q4"}}…

Scores by teamchart

on objectives

Needs an updatetable

on keyResults

filter: {"property":"Stale","checkbox":{"equals":true}}…

All key resultslist

on keyResults

Initiative boardboard

on initiatives

Documentation pages

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

🗓️Weekly OKR check-in9 blocks
🗓️Fifteen minutes, every Friday. Update Current value and Confidence before the meeting, not during it.
1. Numbers first

For each key result: what is the current value, and what moved it this week?

2. Confidence second

Confidence is a judgement, not a computation. If it dropped by three or more points, that key result is the agenda.

3. One decision

Every check-in ends with exactly one decision: keep, add an initiative, or abandon. Not three.


Why Confidence is a number and not a formula

A formula can only see properties on the same row. Confidence is a forecast about the future, which no property can express. Notion formulas cannot trigger side effects either, so a low confidence cannot itself alert anyone. That is what the automation below is for.

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.

Automation: flag confidence below 5

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

  1. 1Key Results → Automations → New automation.
  2. 2Trigger: Confidence changes, to a value less than 5.
  3. 3Action: Add a comment @mentioning the Owner and the Objective's Owner.
  4. 4Action: set the parent Objective's Status to Tracking so it surfaces in the review.

Recurring template: weekly check-in page

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. 1Create a database “OKR check-ins” with Date, Attendees (Person) and a linked view of Key Results filtered to Needs an update.
  2. 2New → ▾ → + New template → body: the three headings above plus an embedded linked view.
  3. 3Template ••• → Repeat → Every Friday at 09:00.

About this component

Objectives hold a quarter, an owner and a confidence level. Key results hold a start, a target and a current value, with a formula that computes progress as a percentage. A rollup on the Objective averages its key results, so the company score is never stale.

What it does

  • Progress computed from start/target/current, clamped 0-100%
  • Confidence as a 1-10 number property with a colour-coded formula label
  • Quarter select property drives every filtered view
  • Chart view of objective scores, grouped by team

Where people put it

↳Startup quarterly planning
↳Team-level goals inside a company wiki
↳Personal annual objectives

Pairs well with

All in Business & CRM
🧮

ROI Calculator

Sliders in, a payback chart out, for proposals and sales pages.

BusinessFreeWidgetv1.0.1
💵
New

Monthly Budget Planner

Compare monthly income against four editable expense buckets.

BusinessFreeWidgetv1.0.0
📦
New

Inventory Counter

Adjust a small item list with plus and minus stock controls.

BusinessFreeWidgetv1.0.0