Concepts

Dimensions

A dimension is a named hierarchy — regions, products, months — that your figures vary over. Define it once, and every series connected to it is organised the same way, from the finest detail up to the top of the tree.

In a spreadsheet, structure is layout. Months run across the top, products down the side, one tab per country. The structure is real — you can see it — but it exists only as an arrangement of cells, and it has to be maintained by hand in every formula that crosses it.

In Axmo you declare the structure once, and it stops being layout. A dimension is a named hierarchy of categories that your figures vary over: Region, Product, Cost Centre, Time. Once it exists, you refer to what things are rather than to where they sit.

Layers and elements

A dimension is a tree. Each level of the tree is a layer, and each item within a layer is an element. A Time dimension with three layers looks like this:

Time
├── 2026                         ← Year layer
│   ├── 2026-Q1                  ← Quarter layer
│   │   ├── 2026-01              ← Month layer
│   │   ├── 2026-02
│   │   └── 2026-03
│   ├── 2026-Q2 ...
│   └── 2026-Q4 ...
└── 2027 ...

An element with no children is a leaf. Leaves are where your detail lives; everything above them is a total.

That is nearly the whole model. Each element carries exactly three things: which layer it sits on, its position in that layer's order, and its parent above — if it has one. Everything a dimension can do follows from those three, which is why the same operations work on a hierarchy of countries and a hierarchy of months.

A dimension does not have to be a single tree. It can be a set of independent trees, and a new categorical dimension arrives with one root element already in it, named after the dimension — All Products, All Regions — which you can rename or delete.

Two kinds

A dimension is one of two kinds. Categorical dimensions hold elements in an order you set: Region, Product, Cost Centre, Department. Sequential dimensions hold elements a defined distance apart: Time, Project Year, Asset Age — one month to the next is a step of known size.

Sequential dimensions are generated rather than typed. You give a start, an end and the layers you want, and the elements come out already ordered, already parented, already spaced. Time elements have a canonical form the engine uses everywhere: 2026, 2026-Q1, 2026-03.

Time is the most common sequential dimension, not a different kind of thing. Asset age in years, months since acquisition, a project stage that advances a step at a time — each of these is a sequential dimension, and none of them is a calendar.

The position before the first period

A sequential dimension can carry a boundary element — a position immediately before the first period, called BEFORE, and one immediately after the last, called AFTER.

A boundary is an ordinary element with one deliberate difference: it has no parent. That single fact produces all of its behaviour. Because it belongs to no parent, no total ever includes it — it sits outside every roll-up in the dimension. But it is still an element in the layer's order, so anything that walks the layer can reach it.

This is where an opening balance belongs: the closing position you carried in, sitting just ahead of the first period you are modelling, contributing to the calculation without contributing to the year's totals. Recurrence shows one at work.

Where totals come from

This is the part that most often surprises people, and it is worth getting right early.

A dimension is structure and nothing else. It carries no arithmetic. How values combine as you move up the tree is a property of each series, set separately for each dimension that series is connected to.

That is not a technicality — it is the reason one model can hold both of these at once, over the same Time dimension:

  • Revenue rolls up by sum. A quarter is the sum of its months.
  • Closing balance rolls up by last. A quarter's closing balance is its last month's, not the sum of three of them.

Sum, average, weighted average, first, last, minimum, maximum, a formula evaluated at each total, or nothing at all — each series chooses, per dimension. A dimension with two series connected to it can and often should produce two different kinds of total.

The same holds in the other direction. A figure entered above the leaf level — a quarterly budget where the model works in months — can be distributed down to the children, equally, in proportion to a driver, or copied. By default it is not distributed at all: it stays where you put it, because the engine never invents a distribution on your behalf.

Names

Names are case-insensitive. Type revenue in a formula and it will match the series you created as Revenue, and display it the way you registered it.

Two rules govern the rest, and both exist so that a bare name in a formula resolves to exactly one thing:

  • Dimension names are unique across the whole model — no dimension, series, layer or element may share a name with a dimension.
  • Within one dimension, layers and elements share a single pool of names. No two elements, no two layers, and no layer named after an element of the same dimension. The same element name may appear in two different dimensions; which one you mean is settled by context — a formula reads the name against the dimensions its own series is connected to, and only when two of those hold the same name do you have to say which.

Six characters are reserved and rejected in any name: ; / [ ] { }. Everything else you would reasonably use is allowed — spaces, hyphens, underscores, commas, percent signs, round brackets, apostrophes, accents and non-Latin scripts. Profit Contribution, %, Gross Margin (LTM), O'Brien Fleet and Café Nord are all legal names.

Next

A dimension on its own holds no figures. Dataseries are what varies over it, and where the totals are actually decided. Dimensional expressions are how you select elements of a dimension in an Axmo formula — names, paths, positions, offsets, ranges and set operations.