Enterprise UX · Reporting

Shipping primitives instead of reports

Designing a dashboard system where users compose their own views from a small set of building blocks — because every organisation asks different questions, and the vendor only guesses at a few of them.

GegoSoft designs and builds the interface layer of this platform — the Angular web application and the Android app. Backend services, architecture and product direction belong to the client. What follows describes the interface design and the reasoning behind it.

CLIENT
Australian MSP
MODEL
User-composed
PRIMITIVES
Five widget types
STACK
Angular, Android
OUR SCOPE
UI/UX, web and mobile

Every fixed dashboard is a guess

A vendor building reporting has to decide in advance what its customers will want to know. Ticket volume by day. Open items by team. Average resolution time. All reasonable, all correct for somebody, and wrong for most people on the day they start using the product.

What follows is familiar. The backlog fills with requests for one more chart. Each is individually sensible and none is worth a release on its own. The reporting section slowly accumulates views that made sense to one customer three years ago, and the product gets heavier without getting more useful.

The alternative is to stop guessing. Ship the parts, let people assemble the view they actually need, and spend the design effort on making sure what they assemble is readable.

That is harder to design than a fixed dashboard, because the person composing is a supervisor or an operations manager, not a designer. The system has to produce acceptable results from people who are not thinking about layout at all.

SCREENSHOT 1 — A composed dashboard
A dashboard assembled by the person who needs it, from the same widget types available to everyone.

Five shapes, not fifty widgets

The temptation with a widget library is to keep adding specific ones — a ticket volume widget, an SLA breach widget, an agent status widget. That is the fixed dashboard problem again, one level down.

Instead the system offers a small set of display shapes, each answering a different kind of question.

01 Single value One number that matters. Open tickets, breaches today, calls waiting.
02 Multi-column list Records with several attributes. A queue, a set of assets, a work list.
03 Multi-row list The same data arranged for a different reading pattern.
04 Text list Sequences without structure — notices, recent activity, notes.
05 External page Something the platform does not hold, embedded where it is needed.

Five shapes cover most of what an operations team asks, because most operational questions reduce to a count, a list, or a sequence. Adding a sixth would need a genuinely different reading pattern to justify it, not a different data source.

Fixed size, movable position

When a widget is created its dimensions are set. In edit mode the person arranging the dashboard can drag things into a different order, but not resize them.

This is the constraint the whole thing depends on. Free resizing sounds generous and produces unreadable results — a chart squeezed to a third of its useful width, a list stretched until it holds four rows and a lot of nothing. Give a hundred non-designers unrestricted layout control and you get a hundred dashboards that look broken, and a product that appears to be at fault.

Fixing dimensions guarantees every dashboard looks deliberate, while movable position leaves people the decision they actually care about: what belongs at the top. Constraint here is a kindness, not a limitation.

Composed dashboards are shared with the team

A dashboard someone builds for their own role is usually right for everyone doing that role. Sharing within a team means the person who thought hardest about which numbers matter does that work once.

SCREENSHOT 2 — Choosing a widget type
Composition starts with the shape of the question, not with a data source.

Staying current without churning

Widgets refresh on an interval, or fetch when a push signal tells them something has changed.

That hybrid is deliberate. Pure polling wastes requests on data that has not moved — a dashboard checking a quiet queue every ten seconds, all day, for nothing. Pure push means streaming full payloads and handling reconnection, ordering and replay for every widget on every screen, which is a great deal of machinery for a number in a box.

Signalling that something changed and letting the widget fetch keeps the transport simple and the screen accurate. The interface cost is that refreshes must not disturb someone mid-read: values update in place, the layout does not reflow, and nothing jumps under the cursor.

Internal data

Tickets, interactions, assets, activity — the platform's own records, filtered to what the widget is asking about.

External endpoints

Widgets can read from APIs outside the platform, so an operations team can surface data the product does not own alongside data it does.

Admitting the primitives will not cover everything

Five shapes and two data sources still will not answer every question a business has. The honest response is to say so in the design rather than pretend otherwise.

External page embeds something the platform does not hold. External endpoints let widgets read data it does not own. Both are escape hatches, and both exist because the alternative — a customer asking for something the widget set cannot express, and waiting for a release — is worse than a slightly less pure product.

Pre-built dashboards sit alongside composition for the same reason in reverse. Some questions genuinely are universal, and making every customer assemble them from scratch would be dogma rather than design.

Design decisions

Part of a long-running engagement, delivered as the interface team inside the client's own distributed process.

SCOPE

Shapes, not subjects

Widgets are defined by how they display, not by what they display. A single-value widget does not care whether the number is tickets or calls, which is what stops the library growing forever.

CONSTRAINT

Remove the decision that goes wrong

People composing dashboards want to choose what appears and in what order. Sizing is where non-designers produce results they are unhappy with, so sizing is the decision the system makes.

BEHAVIOUR

Update without disturbing

Refresh has to be invisible. A dashboard that reflows while someone is reading it trains them to distrust what they see.

ACCESS

Permission-gated like everything else

Dashboards are a module in their own right within the platform's role model, so composing and viewing are governed the same way every other capability is.

Common questions

Can GegoSoft build a custom dashboard system for our product?

Yes. We design and build a user-composable dashboard module inside an enterprise platform, in Angular for web and native Android for mobile. The design work is mostly in choosing the right small set of widget types and the constraints around composition, rather than in the widgets themselves.

Should dashboards be fixed or user-composable?

Composable, if your customers differ from one another. Fixed dashboards encode the vendor's guess about what matters and generate a permanent backlog of requests for one more chart. Composable dashboards move that decision to the person who actually has the question.

How many widget types does a dashboard system need?

Fewer than most products offer. Widgets should be defined by display shape rather than by subject — a count, a list, a sequence — because a widget tied to a specific data type multiplies with every new data type. Most operational questions reduce to a handful of shapes.

Should users be able to resize dashboard widgets?

Often not. People composing dashboards are rarely designers, and free resizing reliably produces unreadable layouts that reflect badly on the product. Fixing widget dimensions while allowing repositioning keeps every dashboard legible and still lets people prioritise what appears first.

How should dashboard widgets stay up to date?

A hybrid works best: refresh on an interval, and fetch immediately when a push signal indicates something changed. Pure polling wastes requests on static data; pure push adds streaming machinery disproportionate to displaying a number. Either way, updates must not reflow the layout while someone is reading.

Can dashboard widgets show data from outside the platform?

In this system, yes — widgets can read from external API endpoints, and an embed widget can surface a page the platform does not hold. Escape hatches like these are worth including, because the alternative is customers waiting for a release every time their question falls outside the widget set.

Backlog full of requests for one more chart?

Tell us what your customers keep asking reporting to do. If the requests are all different, the answer is usually a smaller set of parts rather than a longer list of reports.

Start a conversation See all case studies