KPI detail
The screen for a single KPI: header badges, stat pills, the trend chart and its range switch, today's entries, status changes, history table and actions.
Click any card on the Dashboard and you land on that KPI’s own page at /kpi/<id>. It is the only place in Pulsaria where a single metric is shown in full — and the only place where you can edit, duplicate, move or delete it. A Back to Dashboard link sits above the heading.
The header
The first line holds three things, left to right:
- The KPI name, as the page heading.
- The status badge — On track, At risk, Off track or Broken, coloured green, amber, red or red.
- A source badge for automated KPIs: a small uppercase
CONNECTOR,BASHorHTTPin amber. Manual KPIs get no badge.
The status badge here does not soften the no-data case. A KPI you have never recorded a value for shows a red Off track badge on this page and in the chart header, while its Dashboard card shows a neutral grey dot. The thresholds behind the badge are in Ideal line & status.
On the right of the same line sits the action row, described under Actions further down.
The stat pills
Under the heading sits a row of small pills. There are four, or three when the KPI has no values yet:
| Pill | What it shows |
|---|---|
| Target | The target with its unit, followed by the period: /yr, /mo, /qtr, or — for a custom range — its two dates, e.g. Mar 1 – Jun 30. |
| Direction | Higher is better with a green up arrow, or Lower is better with a red down arrow. |
| ideal today | Today’s value on the ideal line, with an i tooltip carrying the formula: Ideal = target × (days elapsed in period / total days in period). Assumes linear progress from period start at 00:00. |
| current | The newest recorded value with its unit. This pill is left out entirely while the KPI has no history. |
All four numbers are formatted in your app language — 50,000 in English, 50.000 in German — and the number of decimals follows the unit. See Anatomy of a KPI for the rules, and Periods & targets for how period start and end are derived.
The trend chart
Below the pills sits a segmented control with three buttons — 7D, 30D, 90D (7T / 30T / 90T in German) — and under it the chart card. 90D is selected when the page opens, and the choice is not remembered: leave the page and come back and you are on 90D again.
What the range actually selects
The visible window starts at today minus (N − 1) days, but never before the KPI’s period start, and ends at today, or at the period end if that is earlier. Inside that window the chart draws one column per calendar day, whether or not that day has a value.
The two lines
| Line | Meaning |
|---|---|
| Actual — solid, in the KPI’s accent colour, with a filled area underneath | Your recorded values, one point per day that has an entry. |
| Ideal Trend — grey, dashed | Where the value should stand on each day. For a Recurring value KPI the legend entry reads Target instead. |
For a Cumulative goal the dashed line rises in a straight line from 0 at the period start to the target at the end. For a Recurring value it is flat at the target on every day. It is drawn with straight segments on purpose — the underlying model is a straight line, and a smoothed curve would misrepresent it. The dashed line never animates; the solid one fades in over 800 ms, and that animation is skipped when your Mac’s Reduce motion setting is on.
Days without an entry leave a hole in the solid line, but the line is bridged straight across the hole so it stays continuous. A long straight segment therefore means “no data in between”, not “the value stayed flat”.
Hovering anywhere in the plot opens a tooltip with the day, the Actual value and the Ideal (or Target) value, both with the unit. The X axis is labelled day and short month, the Y axis is numeric, and a faint dashed grid runs horizontally.
The chart header
Above the plot, the card repeats some context:
- The KPI name and, under it, the target with its unit.
- A caption reading Last 12 days.
- A gap pill such as
+18% vs ideal, with the same ideal tooltip. - The status badge again.
The Last N days caption counts recorded points, not calendar days. It is the smaller of two numbers: how many days the KPI actually holds a value for, and the range you picked. With 90D selected and 12 days of data it reads Last 12 days, not Last 90 days. With plenty of history it matches the button — and it never goes past Last 90 days, because 90 dates is the hard ceiling on stored history.
The gap pill compares the current value against today’s ideal and prints the difference as a whole-number percentage of the ideal. Green means ahead, red means behind — unlike the Dashboard card and the history table, this pill has no amber near-miss colour. It also has no zero guard: on the first day of a cumulative period, where the ideal is exactly 0, it reads +0% vs ideal. The label becomes vs target for a Recurring value KPI.
There is no zoom, no pan, no custom range and no “all time”. Values recorded outside the KPI’s period are not plotted at all, even though such a value can still be the KPI’s current value.
Today’s entries
If today holds more than one value for this KPI, a block appears under the chart headed Today · 3 entries with a clock icon. Each row shows the time the value was saved on the left and the value with its unit on the right, oldest first.
The block is hidden when today has zero or one entry. It is read-only: single intraday values cannot be edited or deleted from here, and only the newest one counts for the current value, the status and every chart. See Entering values for how same-day entries are stored.
Status changes
Next comes a strip headed Status Changes: a chain of small coloured chips, each carrying a day and a short month, joined by thin connecting lines.
Pulsaria walks the KPI’s history from oldest to newest and grades every point against the ideal of its own day, not today’s. The first recorded day always produces a chip; after that a chip appears only when the status differs from the point before it. The chip’s colour is that new status.
The strip is only rendered when there are at least two chips, so a KPI that has never changed status shows nothing here. The chips are not clickable and carry no value — they mark when something changed, not by how much.
Changing a KPI’s target, period or KPI type re-grades the whole history at once. Past chips can appear, move or disappear as a result; the previous ideal line is not kept anywhere.
The history table
The bottom of the page is a card titled History, one row per recorded date, newest first. It scrolls inside a fixed height with the header row pinned.
| Column | Content |
|---|---|
| Date | The long form of the day in your app language, e.g. Mon, Jan 5, 2026. |
| Value | That day’s value — plain, without the unit. |
| Ideal | The ideal for that specific day, with the formula tooltip in the header. |
| Gap | The signed percentage against that row’s own ideal: green when ahead, amber when behind by less than 10 %, red at 10 % or more. |
One row means one calendar date. When a day holds several entries, the row shows the newest one.
Editing a row
Click the pencil at the end of a row. The quick entry dialog opens, titled Edit value, prefilled with that day’s value and pointed at that day’s date. Saving writes a new record for that date, which then wins because it is newer — the old record stays on disk but is no longer used.
The pencil works on automated KPIs too. It is the only way to correct a fetched value for a past day.
Deleting a row
Click the trash icon. A native macOS dialog titled Delete entry asks: Delete the entry from Mon, Jan 5, 2026? This cannot be undone. Confirm and a toast reports Entry deleted.
Deleting a row removes every entry file that KPI has on that date, including intraday values recorded earlier the same day. There is no undo — only a restore from a backup.
The table has no sorting, filtering, paging or export of its own, and no empty state: a KPI without history renders as a bare header row with nothing under it. Like the chart and the status strip, it can only show dates inside the 90 most recent dates that carry any entry.
Actions
The buttons sit at the top right of the header, in this order:
| Button | Shown for | What it does |
|---|---|---|
| Add value | Manual KPIs only | Opens the quick entry dialog for today. |
| Run now | Connector, Bash and HTTP KPIs, on macOS only | Fetches this one KPI immediately. |
| Edit | Every KPI | Opens the New/Edit KPI dialog. |
| Duplicate | Every KPI | Creates a copy and takes you to it. |
| Move to… | Every KPI | Reassigns the scope. |
| Delete | Every KPI | Deletes the KPI after a confirmation. |
Add value
Opens the small quick entry dialog with a single numeric field, the KPI’s unit next to it and Cancel / Save at the bottom. It always writes today’s date; to write another day, use the pencil in the history table. The field takes German and English number notation — the full rules are in Entering values.
Run now
Runs exactly the same path as a scheduled fetch: the source is queried, the result is written to the fetch log, a value is saved under today’s date, and a status alert can be raised. The button shows a spinner while the fetch runs.
A success shows a KPI updated toast with <name>: <value>. A failure shows an Auto-KPI failed toast with a View details action that opens the fetch log at the recorded stdout, stderr or response body. The button is hidden for manual KPIs and on non-macOS builds. For scheduling the same fetch instead of triggering it by hand, see Schedules & refresh.
Edit
Opens the same dialog used for creating a KPI, but on its configuration step, with a four-way source switcher at the top: Manual, Connector, Bash, HTTP. Everything about a KPI can be changed here, including its target and period — which re-grades its entire history the moment you save.
The URL /kpi/<id>?edit=1 opens this dialog directly. That is the link behind a broken KPI’s red card and behind the Approve action on fetch toasts.
Duplicate
Creates a second KPI with the same target, unit, direction, period, KPI type and data source, and takes you straight to it. Three things to know:
- The copy is named
<Name> (Copy). If that name already exists it counts up:(Copy 2),(Copy 3). - History and fetch log are not copied. The copy starts empty, so it has no current value until you record something.
- A Bash or HTTP copy lands unapproved — the command has to be approved again before the scheduler will run it. The success toast says so: The copy needs re-approval before it fetches automatically. For other sources the toast just repeats the KPI’s name.
Move to…
Opens a small dropdown headed Move to… listing Company-wide first, then every project. The current scope carries a check mark and cannot be clicked. Picking another one writes the change immediately and confirms it with a Moved to Acme toast.
The dropdown closes on Escape, on a click outside it, and when you scroll or resize the window. Moving a KPI changes nothing about its values — the same series simply appears under a different heading on the Dashboard. There is no bulk move. See Projects.
Delete
Opens a dialog titled Delete KPI asking: Delete Revenue and all its historical data? This cannot be undone. Confirm with Delete and Pulsaria removes the KPI definition and every entry file belonging to it, then returns you to the Dashboard with a KPI deleted toast.
Deleting is not recoverable from inside the app. If you might want the numbers back, run an export first — see Backup, export & moving Macs.
Read-only mode
When the trial has expired or a licence was revoked, Pulsaria keeps showing everything and blocks writes. On this page that means Add value, Edit, Duplicate, Move to… and Delete are greyed out, as are the pencil and trash icons in the history table. All of them carry the tooltip Requires a license or active trial.
Run now stays clickable, but the fetch is refused before it starts and you get an Auto-KPI failed toast. The chart, the range switch and the whole page stay readable. See Trial & licence.
What this screen does not do
- No export of this KPI alone — export is all-or-nothing in App Settings.
- No note, tag or comment on an entry, and no editing of a single intraday value.
- No annotations on the chart, no second KPI overlaid, no forecast of where the value will end up.
- No keyboard shortcuts. Escape closes the Move to… dropdown and open dialogs; nothing else is bound.
- No history beyond the 90 most recent dates that carry an entry. Older values stay on disk and stay in the export, but no view on this page can reach them.