---
title: "Dashboards"
slug: workspace/dashboards
url: https://projectri.com/docs/workspace/dashboards
section: workspace
audience: workspace
app_route: "/[slug]/[user]/dashboards"
permissions: [dashboard.view, dashboard.build, dashboard.share]
mobile: "/dashboards"
updated: 2026-09-08
source: Projectri documentation
---

# Dashboards

Build a board of charts from a catalogue of metrics and datasets, or copy one of the six shipped templates, and choose who can see it.

![Dashboards](https://projectri.com/docs-shots/workspace-dashboards.png)

## What it is

Dashboards answers a question you chose, where the fixed report pages answer ones
we chose. A dashboard is a grid of widgets; each widget names a chart type, one
or more metrics, a dimension to group by and a row cap. Six templates ship with
every workspace and are copied rather than edited, so improving one next quarter
does not rewrite a board somebody has been tuning.

## How to get there

**Dashboards** is in the main navigation, beside Reports, and in the ⌘K page
search. The **New** menu in the header has a **Dashboard** row.

- The nav row is gated on `dashboard.build`, not on `dashboard.view` — every
  member holds view because Home is their landing page, and gating the row on it
  would put the whole template gallery in front of people with no reason to
  assemble one.
- The read routes stay on `dashboard.view`, so a dashboard published to somebody
  still opens from its link.
- `dashboard.share` is what lets you move a dashboard off **Only me**. Without
  it, a dashboard you create lands as personal rather than being refused.

There is no plan gate.

## How to use it

### Open one

1. The rail on the left lists **your** dashboards first and **Templates**
   underneath.
2. Pick one. The board loads and the widgets fill in.
3. **Range** at the top right filters every widget that has a date to filter on:
   All time, or the last 7, 30, 90 or 365 days. The default is 30 days.
4. The range is applied per dataset against that dataset's own date field —
   `startTime` on time entries, `issueDate` on invoices — and is dropped for
   widgets whose data has no such field, so a customer-count tile is not silently
   emptied by a date range that means nothing to it.

### Start from a template

1. Select a template in the rail — it carries a **Template** badge.
2. Press the copy icon in the header.
3. You get your own editable copy, owned by you, visible to **Only me**, with
   every widget in place. The original is untouched.

Templates are read-only to everyone, including admins. The copy button is the way
in, and it is the only way in.

### Create an empty one

1. Press **+** at the top of the rail, or **New dashboard**.
2. Name it. It is created as **Only me** and opens in edit mode.
3. Press **Add widget**.

### Build a widget

1. In edit mode, press **Add widget**, or the gear on an existing one.
2. Choose the kind: **Stat** (one number), **Gauge** (one number against 100%),
   **Bar** (compare across a dimension), **Donut** (share of a whole), **Line**
   (change over time), **Table** (several metrics per row) or **List** (ranked
   rows).
3. Pick the metrics. Bar, donut, line, table and list also need a **group by**
   dimension.
4. Set the row limit — between 1 and 100.
5. Save. The widget is placed in the next free slot on a 12-column grid; drag the
   handle to move it and the corner to resize.

### Rename, duplicate, delete

1. **Rename** — the pencil, on a dashboard you can edit that is not a template.
2. **Duplicate** — the copy icon, available to anyone who may build. A copy of a
   normal dashboard lands as **Only me** and owned by you.
3. **Delete** — the bin, on a dashboard you can edit that is not a template. It
   asks first and cannot be undone.

### Decide who can see it

1. Turn on **Edit**.
2. **Visible to** offers **Only me**, **This workspace** or **Everyone**.
3. Moving off *Only me* needs `dashboard.share` — publishing a board is a
   separate decision from building one.

## What it affects

- **What the numbers can be.** Widgets read from a fixed registry of datasets:
  tasks, time entries, time entries with money on them, tickets, work orders,
  invoices, expenses, projects and customer contacts. There is no free SQL — a
  dashboard that named its own table could not carry the tenant guarantee, and
  the first one saved would be reading another workspace's rows.
- **Permissions are checked twice.** The dashboard's visibility governs the
  *container*; the numbers inside are gated per dataset. A dashboard visible to
  everyone can still contain a margin widget most of them cannot read. When that
  happens the widget says *"N metrics hidden by permissions"* rather than quietly
  showing zero.
- **The gated datasets** are money on time entries (`report.financial`, with the
  cost column additionally behind `report.cost`), invoices
  (`finance.invoice.view`), expenses (`finance.expense.view`) and customer
  contacts (`portal.view`).
- **Three of the six templates carry their own gate.** Executive and
  Profitability require `report.financial`; Resource requires
  `report.utilization`. A copy carries the gate across, and you cannot duplicate
  a template whose gate you do not hold.
- **A shared metric catalogue.** "Billable hours" means the same thing on every
  board, because the metrics are seeded once per workspace rather than per
  template. Two definitions of the same words is how two directors quote
  different numbers in the same meeting.
- **Nothing you build here changes data.** Dashboards read.

## On mobile

The **Dashboards** screen in the Expo app reads the same boards and offers the
same date ranges as a chip strip, but has no builder. Composing a widget means
picking a chart, a set of metrics, a dimension and a row cap and placing it on a
12-column grid, which is a desk job — a phone-sized version produces layouts
someone repairs on a laptop afterwards.

## Limits and gotchas

- **The six templates are Executive, Project delivery, Support, Customer health,
  Profitability and Resource.** They are created on your first visit to this
  page rather than at sign-up.
- **A widget over a very long span is capped** and says *"Showing the first
  20,000 rows"* under its title when it hits the limit.
- **A broken widget fails alone.** A widget whose metric no longer resolves shows
  its own error rather than emptying the page.
- A widget's geometry is clamped on write, so a bad drag cannot store a widget
  400 columns wide.
- Deleting a dataset from the registry would orphan the metrics built on it, so
  dataset keys are permanent once shipped.
- Two saved filters on the same field are combined rather than one overwriting
  the other — a date range cannot quietly become a half-range.

## Related

- [Reports](/docs/workspace/reports) — the fixed readings, which these are the configurable equivalent of.
- [Report builder](/docs/workspace/reports-builder) — row-level reports rather than charts.
- [Home](/docs/workspace/home) — the landing dashboard every member sees.
- [Permissions](/docs/features/permissions-model) — how the per-dataset gates are decided.

## Related

- [Reports](https://projectri.com/docs/workspace/reports.md): The fixed report page — completion, throughput, burndown, team performance and the effort figures, for this week, this sprint, this month or all time.
- [Report builder](https://projectri.com/docs/workspace/reports-builder.md): Build a report the fixed pages do not have — pick the data, group it, measure it, cross-tab it, save it, export it and put it on a schedule.
- [Your dashboard](https://projectri.com/docs/workspace/home.md): The home screen — your own task counts, a briefing Nia writes from your work, today's meetings, the priority queue, the month, your sprint, team load and recent activity.
- [How permissions work](https://projectri.com/docs/features/permissions-model.md): The three tiers Projectri decides "may this person do this" with, how a role default becomes one person's answer, and the two traps that catch every new key.
