Building a KPI dashboard in SharePoint
Last updated:
A KPI tile — “14 open, 3 overdue, 62% on time” — is the single most requested thing that SharePoint's free options cannot do. JSON list formatting styles rows beautifully but cannot aggregate, so counts and totals are exactly where the free route stops.
The fastest way across that line is to describe it to Sharelio, the AI platform for building SharePoint tools: “a KPI panel over the incidents list showing open, overdue and closed this month”. It reads the same list your team already updates and renders the tiles as a native web part on the page.
And the thing that decides whether anyone looks at it twice: a dashboard is not a report. Three or four numbers that trigger an action beat twenty that describe a situation. Most ignored dashboards were over-specified, not under-built.
The three routes
| Route | Cost | Refresh | Best for |
|---|---|---|---|
| List view totals | €0 | Live | A sum or count at the foot of a column. Free, immediate, and you cannot design around it. |
| KPI component over your lists | Free plan, then flat per tenant | Live, on page load | Tiles on the intranet page, next to the list they summarise |
| Power BI embedded | Pro licence per viewer | Scheduled refresh | Multiple data sources, real analysis, history and trends |
The row people skip is the first. If all you need is total budget at the bottom of a column, SharePoint already does that and you should spend nothing. Confirm that is not enough before going further.
When Power BI is genuinely the right answer
Power BI is a serious analytics tool and it is the correct choice when you need what it does:
- Several data sources joined — SharePoint plus finance plus a CRM.
- History and trend, not just the current state. Lists tell you what is true now; they do not remember what was true in March.
- Real analysis: drill-down, slicers, time intelligence, forecasting.
- An audience that already lives in Power BI and has the licences.
What it costs is licensing per viewer, a refresh schedule rather than live data, and an embedded report that visibly is a report rather than part of the page. For “how many are open right now”, that is a lot of machinery for a number that a component reads live from the list.
Designing tiles people act on
- Every tile answers a question someone asks out loud. If you cannot name who asks it, delete the tile.
- Prefer counts that imply an action. Overdue: 3 makes someone do something. Total items: 1,847 does not.
- Put it next to the list it summarises, not on a separate dashboard page. A number you have to navigate to is a number nobody checks.
- Three or four tiles. Beyond that, you have built a report and it will be read like one — which is to say, once.
A practical test before building: ask what someone would do differently if a tile turned red. If the answer is nothing, that tile is decoration, however satisfying it is to look at.
Frequently asked questions
Can JSON list formatting show a count?
No. Formatting is applied per item and has no view of the whole set, so counts, sums and averages are outside what it can express. View totals at the foot of a column exist and are useful, but you cannot design a tile around them or place them where you want on a page. This is the clearest boundary between free formatting and a component.
Do we need Power BI licences for everyone who looks?
For most sharing scenarios, yes — viewers need a Pro licence, or the content lives in a Premium capacity. That per-viewer cost is what makes Power BI expensive for a dashboard whose audience is the whole company, and it is often discovered after the report is built rather than before.
How current are the numbers?
A component that reads the list directly is current as of page load, because it queries the live list with the viewer's own session. Power BI shows the last scheduled refresh, which can be hours old. For an operational dashboard people act on today, live matters more than the analysis depth they were not going to use.
Can we show a trend over time from a SharePoint list?
Only if you are storing history. A list holds the current state: if a status changed last week, the previous value is gone unless something recorded it. Trends need either version history mined deliberately, a snapshot list written by a scheduled flow, or Power BI with a dataset that accumulates. Decide this before promising a trend chart.