Turn a single company Objective into a weighted tree of Department → Team → Personal KRs/KPIs — with progress that rolls up automatically.
How to define the tree. Use indented text (spaces or tabs). The first non-indented line is the Objective; each deeper indent level is a child node. On each line you can put, separated by |:
Grow ARR to $10M | target: 10000000 | current: 6200000 | unit: USD
Sales dept | weight: 60
Enterprise team | target: 50 | current: 32 | unit: accounts
AE: Alice | target: 20 | current: 14
AE: Bob | target: 30 | current: 18
Marketing | weight: 40 | target: 5000 | current: 3100 | unit: leads
Fields per node (all optional except where noted):
- name (required, first field)
weight — relative weight among siblings (default: equal split). Used to compute the parent's roll-up.
target — the goal value (numeric).
current — the current value (numeric).
unit — free-text unit (USD, %, accounts, leads…) shown for readability.
How progress rolls up. Each leaf node's progress = current / target (0–100%). A parent's progress = the weight-weighted average of its children's progress. Weights within a level are normalized to sum to 100% if they don't already. So the root Objective always shows the live, rolled-up completion percentage.
What you get.
- An interactive HTML tree — expand/collapse, color-coded progress bars (red < 50%, amber 50–80%, green ≥ 80%).
- A Markdown version of the same tree (with progress % per node) you can paste into Notion, Confluence, or a README.
- A CSV export (one row per node with all fields) for spreadsheet import.
Tips.
- Weights are relative within a sibling group. If Sales=60 and Marketing=40, those are the split of the Objective.
- Leave
target/current empty on a pure grouping node (like "Sales dept") — its progress comes from its children.
- The rolled-up % is only as honest as the leaf data. Make sure every leaf has a target and a current value.