Devprimo

Building an internal dashboard people actually use

7 min readDashboardsInternal toolsUI/UX

Almost every company has a dashboard someone was proud of and nobody opens. It usually isn't ugly and the data usually isn't wrong. It was built around what could be measured rather than what someone was going to do about it.

The way internal dashboards fail

The pattern is consistent enough to predict. A manager asks for visibility. Someone builds a page with every metric the database can produce. It demos well, because in a demo the numbers are the point. Then it goes to the team who were supposed to use it, and they keep using their spreadsheet.

The reason is almost never the charts. It's that the dashboard answers questions nobody had, at a moment when nothing can be done about them, in a place people don't already work. A tool that requires a detour to a URL you have to remember loses to a spreadsheet that's already open.

Start from the decision, not the data

The single most useful reframing: a dashboard exists so that someone does something differently. Everything else is decoration.

Name the decision and the person

Before designing anything, write the sentence: "every morning, the dispatch supervisor decides which jobs to reassign." That sentence tells you the audience, the frequency, and the scope. It also tells you what to leave out, which is the harder half — total revenue this quarter is interesting to somebody, but not to the person making that decision at that moment.

If nobody can produce that sentence, the request is for reassurance rather than a tool. That's a legitimate need, but it's met by a weekly emailed summary, not by software someone has to maintain.

Put the action next to the number

The gap between seeing a problem and fixing it is where dashboards lose people. If the supervisor spots a stalled job, they should be able to reassign it from that row — not copy the id, open another system, and search for it.

This is what separates an internal tool from a report. It's also why generic BI tools plateau: they're excellent at showing you the number and structurally unable to let you act on it.

The numbers have to be trustworthy, not just correct

A dashboard loses its audience permanently the first time someone finds a figure they can't reconcile. It rarely recovers, because the failure isn't arithmetic — it's that people no longer know whether to believe it.

Three things prevent it. Define every metric in writing, in the interface, where the metric appears: does "active user" mean signed in this month, or performed an action? Two reasonable people will assume differently and both will think the dashboard is broken. Show the data's age explicitly — "as of 09:15" — because a stale number presented as live is worse than no number. And make each figure traceable to the rows behind it, so a disagreement can be settled in a click rather than by an engineer with database access.

Speed is a feature here, more than elsewhere

An internal dashboard is opened dozens of times a day by the same handful of people. A four-second load that would be tolerable on a marketing page is, at that frequency, the reason someone goes back to the spreadsheet.

The usual culprit is querying raw transactional tables live for aggregates across a long window. The usual fix is unglamorous: pre-aggregate on a schedule into a table shaped like the question, index for the filters people actually use, and default the view to a range that doesn't scan everything. Rolling up overnight is fine for most operational reporting, provided the interface is honest about when the data is from.

Where the underlying data model makes this hard, that's usually a symptom rather than the problem — the same modelling decisions that make reporting expensive tend to be the ones we go through in choosing the right backend for a new SaaS build.

Permissions and the audit trail

Internal tools accumulate access quietly. The dashboard that started as three operations people reading job statuses becomes the place where refunds are issued and customer records are edited, and the permission model never caught up.

Decide early what each role can see and do, and enforce it server-side rather than by hiding buttons — a hidden button is a UI convenience, not a control. Log who changed what and when, on anything that writes. Nobody regrets having that log the first time a customer disputes a change, and it cannot be reconstructed retroactively.

Build the boring parts properly

Most of the value in an internal tool is in a small set of unremarkable capabilities, done well. A table that sorts and filters the way people actually think about the work. Filters that survive a page refresh and can be shared as a URL, because half of internal comms is "look at this view". Export to CSV, because someone will always need to do something you didn't anticipate, and blocking that just moves the work into a screenshot.

Empty and error states matter more here than on a public site, since operational users hit them routinely — an empty state that says "no jobs match these filters" with a way to clear them prevents a support message every week.

None of it is exciting, and it's the difference between a tool that gets used and one that gets tolerated. It's the bulk of what dashboard and admin panel development actually consists of — and the same reasoning about building the components people reach for rather than a complete inventory applies, which we cover in shipping a design system your whole team can use.

When a dashboard is the wrong answer

If the response to a number is always the same, that's an alert, not a dashboard. Nobody should be employed to watch a screen waiting for a threshold — send the notification and skip the vigil.

If it's read once a week and discussed, that's a scheduled report, and email or Slack will beat a login. And if the goal is for a number to stop happening, the fix is usually a change to the process that produces it, not better visibility of it. A dashboard is worth building when a person makes a judgement call regularly, needs current context to make it, and can act on the result.

SYS — Common questions

Should we build a custom dashboard or use a BI tool?

Use a BI tool when the job is genuinely analysis — exploring data, slicing it in ways you can't specify in advance, and producing charts for people to read. Build custom when the user needs to act on what they see, when the workflow is specific to how your team works, or when it has to sit inside an existing product. The dividing line is whether the tool is for looking or for doing.

How long does an internal dashboard take to build?

A focused first version around one clearly named decision is typically a few weeks, including the data work behind it. What extends timelines is scope framed as "visibility into operations" rather than a specific decision, and data that needs reconciling across systems before any number can be trusted. That reconciliation is usually the real project.

How do we stop internal dashboards multiplying?

Give each one a named owner and a stated decision it supports, and review them periodically against actual usage. Dashboards proliferate because creating one is easy and retiring one feels rude. If nobody has opened a view in a quarter, remove it — every unused dashboard adds maintenance cost and dilutes trust in the ones that matter.

SYS — Keep reading

Ready to ship something great?

Tell us about your product and we'll reply within one business day — no sales deck, just a straight answer on scope and timeline.