Loading

Measures and Dimensions

Analytics separates what you are measuring from how you want it broken down.

Measures

A measure is a number: revenue, units despatched, hours booked, margin. It names the datastore it comes from, the aggregate to apply, and the column to aggregate. A measure can also carry a filter, so Billable Hours and Total Hours are two measures over the same column distinguished by a condition.

Defining a measure once is the point. If revenue is defined centrally, every report using it agrees. If each report defines its own, they will drift, and reconciling two reports that should match is a bad way to spend a week.

Dimensions

A dimension is how you slice a measure: by customer, by product, by month, by entity, by salesperson. The same measure viewed by different dimensions answers different questions without being redefined.

Formatting

A measure declares its format — currency, quantity, percentage — so it displays consistently everywhere rather than depending on each report's settings.

Queries are always parameterised

Every query the engine generates is parameterised: identifiers come from your configuration and are validated against a strict pattern, and values are always bound. Nothing you type into a filter becomes part of a query as raw text.

This is worth knowing because the platform does contain older field types that interpolate raw SQL, and those are genuine footguns. This subsystem deliberately does not repeat them, so analytics can be configured by administrators without that risk.

Naming

Name measures the way the business speaks. A measure called Net Revenue Excluding Intercompany is long but unambiguous; one called Revenue2 will be misused within a month.

Start small

Define the dozen measures the business actually asks about, and add more when a real question needs one. A large catalogue nobody curated is harder to use than a small one, because the work moves from finding a number to working out which of five similar numbers is the right one.