{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"okr-system","type":"registry:block","title":"OKR System","description":"Objectives, key results and confidence, rolled up to a company score.","author":"Notion Arena","categories":["business"],"tags":["native","free","okr","goals","strategy","rollup","formula"],"meta":{"kind":"native","tier":"free","version":"1.2.0","updatedAt":"2026-09-12","notionPlan":"Plus","emoji":"🎯","delivery":["api","duplicate","guide"],"capabilities":{"interactive":false,"offlineSafe":true,"persistsLocally":false,"writesToNotion":true,"needsNetwork":false},"recipe":"okr-system","installUrl":"https://notionarena.vercel.app/api/install"},"files":[{"path":"recipes/okr-system.json","type":"registry:file","target":"notion/recipes/okr-system.json","content":"{\n  \"$schema\": \"https://notionarena.vercel.app/r/schema.json\",\n  \"notionVersion\": \"2026-03-11\",\n  \"id\": \"okr-system\",\n  \"summary\": \"Objectives and Key Results with progress computed from start/target/current, confidence scoring, and a quarter-scoped chart.\",\n  \"databases\": [\n    {\n      \"ref\": \"objectives\",\n      \"title\": \"Objectives\",\n      \"icon\": \"🎯\",\n      \"properties\": {\n        \"Name\": {\n          \"title\": {}\n        },\n        \"Quarter\": {\n          \"select\": {\n            \"options\": [\n              {\n                \"name\": \"2026 Q3\",\n                \"color\": \"gray\"\n              },\n              {\n                \"name\": \"2026 Q4\",\n                \"color\": \"blue\"\n              },\n              {\n                \"name\": \"2027 Q1\",\n                \"color\": \"purple\"\n              },\n              {\n                \"name\": \"2027 Q2\",\n                \"color\": \"green\"\n              }\n            ]\n          }\n        },\n        \"Team\": {\n          \"select\": {\n            \"options\": [\n              {\n                \"name\": \"Company\",\n                \"color\": \"purple\"\n              },\n              {\n                \"name\": \"Product\",\n                \"color\": \"blue\"\n              },\n              {\n                \"name\": \"Engineering\",\n                \"color\": \"green\"\n              },\n              {\n                \"name\": \"Revenue\",\n                \"color\": \"yellow\"\n              }\n            ]\n          }\n        },\n        \"Owner\": {\n          \"people\": {}\n        },\n        \"Status\": {\n          \"status\": {\n            \"options\": [\n              {\n                \"name\": \"Draft\",\n                \"color\": \"gray\",\n                \"group\": \"To-do\"\n              },\n              {\n                \"name\": \"Committed\",\n                \"color\": \"blue\",\n                \"group\": \"To-do\"\n              },\n              {\n                \"name\": \"Tracking\",\n                \"color\": \"yellow\",\n                \"group\": \"In progress\"\n              },\n              {\n                \"name\": \"Achieved\",\n                \"color\": \"green\",\n                \"group\": \"Complete\"\n              },\n              {\n                \"name\": \"Abandoned\",\n                \"color\": \"red\",\n                \"group\": \"Complete\"\n              }\n            ]\n          }\n        },\n        \"Why it matters\": {\n          \"rich_text\": {}\n        },\n        \"Key results\": {\n          \"relation\": {\n            \"type\": \"dual_property\",\n            \"dual_property\": {\n              \"synced_property_name\": \"Objective\"\n            }\n          },\n          \"__relationRef\": \"keyResults\"\n        },\n        \"KR count\": {\n          \"rollup\": {\n            \"relation_property_name\": \"Key results\",\n            \"rollup_property_name\": \"Name\",\n            \"function\": \"count_values\"\n          }\n        },\n        \"Average progress\": {\n          \"rollup\": {\n            \"relation_property_name\": \"Key results\",\n            \"rollup_property_name\": \"Progress\",\n            \"function\": \"average\"\n          }\n        },\n        \"Average confidence\": {\n          \"rollup\": {\n            \"relation_property_name\": \"Key results\",\n            \"rollup_property_name\": \"Confidence\",\n            \"function\": \"average\"\n          }\n        },\n        \"Score\": {\n          \"formula\": {\n            \"expression\": \"if(prop(\\\"KR count\\\") == 0, 0, round(prop(\\\"Average progress\\\") * 100))\"\n          }\n        },\n        \"On track\": {\n          \"formula\": {\n            \"expression\": \"ifs(prop(\\\"Score\\\") >= 70, \\\"🟢 On track\\\", prop(\\\"Score\\\") >= 40, \\\"🟡 At risk\\\", prop(\\\"Score\\\") > 0, \\\"🔴 Off track\\\", true, \\\"⚪ Not started\\\")\"\n          }\n        },\n        \"Days left in quarter\": {\n          \"formula\": {\n            \"expression\": \"dateBetween(dateAdd(now(), 90, \\\"days\\\"), now(), \\\"days\\\")\"\n          }\n        }\n      },\n      \"seed\": [\n        {\n          \"name\": \"Become the default way teams extend Notion\",\n          \"props\": {\n            \"Quarter\": \"2026 Q4\",\n            \"Team\": \"Company\",\n            \"Status\": \"Tracking\"\n          }\n        },\n        {\n          \"name\": \"Make first-install a sub-minute experience\",\n          \"props\": {\n            \"Quarter\": \"2026 Q4\",\n            \"Team\": \"Product\",\n            \"Status\": \"Committed\"\n          }\n        }\n      ]\n    },\n    {\n      \"ref\": \"keyResults\",\n      \"title\": \"Key Results\",\n      \"icon\": \"📐\",\n      \"properties\": {\n        \"Name\": {\n          \"title\": {}\n        },\n        \"Objective\": {\n          \"relation\": {\n            \"type\": \"single_property\",\n            \"single_property\": {}\n          },\n          \"__relationRef\": \"objectives\"\n        },\n        \"Owner\": {\n          \"people\": {}\n        },\n        \"Metric\": {\n          \"select\": {\n            \"options\": [\n              {\n                \"name\": \"Count\",\n                \"color\": \"blue\"\n              },\n              {\n                \"name\": \"Percentage\",\n                \"color\": \"green\"\n              },\n              {\n                \"name\": \"Revenue\",\n                \"color\": \"yellow\"\n              },\n              {\n                \"name\": \"Time\",\n                \"color\": \"purple\"\n              },\n              {\n                \"name\": \"Rating\",\n                \"color\": \"pink\"\n              }\n            ]\n          }\n        },\n        \"Start value\": {\n          \"number\": {\n            \"format\": \"number\"\n          }\n        },\n        \"Target value\": {\n          \"number\": {\n            \"format\": \"number\"\n          }\n        },\n        \"Current value\": {\n          \"number\": {\n            \"format\": \"number\"\n          }\n        },\n        \"Unit\": {\n          \"rich_text\": {}\n        },\n        \"Confidence\": {\n          \"number\": {\n            \"format\": \"number\"\n          },\n          \"description\": \"1 (no chance) to 10 (certain). Updated weekly, never computed.\"\n        },\n        \"Last updated\": {\n          \"date\": {}\n        },\n        \"Initiatives\": {\n          \"relation\": {\n            \"type\": \"dual_property\",\n            \"dual_property\": {\n              \"synced_property_name\": \"Key result\"\n            }\n          },\n          \"__relationRef\": \"initiatives\"\n        },\n        \"Progress\": {\n          \"formula\": {\n            \"expression\": \"if(prop(\\\"Target value\\\") == prop(\\\"Start value\\\"), 0, min(1, max(0, (prop(\\\"Current value\\\") - prop(\\\"Start value\\\")) / (prop(\\\"Target value\\\") - prop(\\\"Start value\\\")))))\"\n          }\n        },\n        \"Progress label\": {\n          \"formula\": {\n            \"expression\": \"format(round(prop(\\\"Progress\\\") * 100)) + \\\"%\\\"\"\n          }\n        },\n        \"Stale\": {\n          \"formula\": {\n            \"expression\": \"if(empty(prop(\\\"Last updated\\\")), true, dateBetween(now(), prop(\\\"Last updated\\\"), \\\"days\\\") > 10)\"\n          }\n        },\n        \"Confidence label\": {\n          \"formula\": {\n            \"expression\": \"ifs(prop(\\\"Confidence\\\") >= 8, \\\"🟢 \\\" + format(prop(\\\"Confidence\\\")), prop(\\\"Confidence\\\") >= 5, \\\"🟡 \\\" + format(prop(\\\"Confidence\\\")), true, \\\"🔴 \\\" + format(prop(\\\"Confidence\\\")))\"\n          }\n        }\n      },\n      \"seed\": [\n        {\n          \"name\": \"1,000 workspaces with a component installed\",\n          \"props\": {\n            \"Metric\": \"Count\",\n            \"Start value\": 0,\n            \"Target value\": 1000,\n            \"Current value\": 214,\n            \"Confidence\": 7\n          }\n        },\n        {\n          \"name\": \"Median install time under 45 seconds\",\n          \"props\": {\n            \"Metric\": \"Time\",\n            \"Start value\": 240,\n            \"Target value\": 45,\n            \"Current value\": 132,\n            \"Confidence\": 6\n          }\n        },\n        {\n          \"name\": \"60% of installs come from the registry API\",\n          \"props\": {\n            \"Metric\": \"Percentage\",\n            \"Start value\": 0,\n            \"Target value\": 60,\n            \"Current value\": 18,\n            \"Confidence\": 5\n          }\n        }\n      ]\n    },\n    {\n      \"ref\": \"initiatives\",\n      \"title\": \"Initiatives\",\n      \"icon\": \"🛠️\",\n      \"properties\": {\n        \"Name\": {\n          \"title\": {}\n        },\n        \"Status\": {\n          \"status\": {}\n        },\n        \"Owner\": {\n          \"people\": {}\n        },\n        \"Due\": {\n          \"date\": {}\n        },\n        \"Key result\": {\n          \"relation\": {\n            \"type\": \"single_property\",\n            \"single_property\": {}\n          },\n          \"__relationRef\": \"keyResults\"\n        },\n        \"Notes\": {\n          \"rich_text\": {}\n        }\n      },\n      \"seed\": [\n        {\n          \"name\": \"Public registry endpoints\",\n          \"props\": {}\n        },\n        {\n          \"name\": \"One-click install from the detail page\"\n        }\n      ]\n    }\n  ],\n  \"views\": [\n    {\n      \"on\": \"objectives\",\n      \"name\": \"This quarter\",\n      \"type\": \"board\",\n      \"configuration\": {\n        \"type\": \"board\",\n        \"group_by\": {\n          \"type\": \"select\",\n          \"property_name\": \"Team\",\n          \"sort\": {\n            \"type\": \"manual\"\n          }\n        },\n        \"card_layout\": \"comfortable\"\n      },\n      \"filter\": {\n        \"property\": \"Quarter\",\n        \"select\": {\n          \"equals\": \"2026 Q4\"\n        }\n      }\n    },\n    {\n      \"on\": \"objectives\",\n      \"name\": \"Scores by team\",\n      \"type\": \"chart\",\n      \"configuration\": {\n        \"type\": \"chart\",\n        \"chart_type\": \"column\",\n        \"x_axis\": {\n          \"type\": \"select\",\n          \"property_name\": \"Team\",\n          \"sort\": {\n            \"type\": \"manual\"\n          }\n        },\n        \"y_axis\": {\n          \"aggregator\": \"average\",\n          \"property_name\": \"Score\"\n        },\n        \"color_theme\": \"purple\",\n        \"show_data_labels\": true,\n        \"height\": \"medium\"\n      }\n    },\n    {\n      \"on\": \"keyResults\",\n      \"name\": \"Needs an update\",\n      \"type\": \"table\",\n      \"filter\": {\n        \"property\": \"Stale\",\n        \"checkbox\": {\n          \"equals\": true\n        }\n      },\n      \"sorts\": [\n        {\n          \"property\": \"Last updated\",\n          \"direction\": \"ascending\"\n        }\n      ]\n    },\n    {\n      \"on\": \"keyResults\",\n      \"name\": \"All key results\",\n      \"type\": \"list\"\n    },\n    {\n      \"on\": \"initiatives\",\n      \"name\": \"Initiative board\",\n      \"type\": \"board\",\n      \"configuration\": {\n        \"type\": \"board\"\n      }\n    }\n  ],\n  \"pages\": [\n    {\n      \"title\": \"Weekly OKR check-in\",\n      \"icon\": \"🗓️\",\n      \"blocks\": [\n        {\n          \"object\": \"block\",\n          \"type\": \"callout\",\n          \"callout\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Fifteen minutes, every Friday. \",\n                  \"link\": null\n                },\n                \"annotations\": {\n                  \"bold\": true\n                }\n              },\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Update Current value and Confidence before the meeting, not during it.\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"icon\": {\n              \"type\": \"emoji\",\n              \"emoji\": \"🗓️\"\n            },\n            \"color\": \"purple_background\"\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"heading_3\",\n          \"heading_3\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"1. Numbers first\",\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\": \"For each key result: what is the current value, and what moved it this week?\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"color\": \"default\"\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"heading_3\",\n          \"heading_3\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"2. Confidence second\",\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\": \"Confidence is a judgement, not a computation. If it dropped by three or more points, that key result is the agenda.\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"color\": \"default\"\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"heading_3\",\n          \"heading_3\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"3. One decision\",\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\": \"Every check-in ends with exactly one decision: keep, add an initiative, or abandon. Not three.\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"color\": \"default\"\n          }\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"divider\",\n          \"divider\": {}\n        },\n        {\n          \"object\": \"block\",\n          \"type\": \"toggle\",\n          \"toggle\": {\n            \"rich_text\": [\n              {\n                \"type\": \"text\",\n                \"text\": {\n                  \"content\": \"Why Confidence is a number and not a formula\",\n                  \"link\": null\n                }\n              }\n            ],\n            \"color\": \"default\"\n          },\n          \"children\": [\n            {\n              \"object\": \"block\",\n              \"type\": \"paragraph\",\n              \"paragraph\": {\n                \"rich_text\": [\n                  {\n                    \"type\": \"text\",\n                    \"text\": {\n                      \"content\": \"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.\",\n                      \"link\": null\n                    }\n                  }\n                ],\n                \"color\": \"default\"\n              }\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}"},{"path":"recipes/okr-system.manual.md","type":"registry:file","target":"notion/recipes/okr-system.manual.md","content":"## Automation: flag confidence below 5\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. Key Results → Automations → New automation.\n2. Trigger: Confidence changes, to a value less than 5.\n3. Action: Add a comment @mentioning the Owner and the Objective's Owner.\n4. Action: set the parent Objective's Status to Tracking so it surfaces in the review.\n\n## Recurring template: weekly check-in page\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. Create a database “OKR check-ins” with Date, Attendees (Person) and a linked view of Key Results filtered to Needs an update.\n2. New → ▾ → + New template → body: the three headings above plus an embedded linked view.\n3. Template ••• → Repeat → Every Friday at 09:00.\n"}]}