Skip to content
Adoptiv

Pivot Tables

One dimension down the side, another across the top, and the measure you chose sitting in every cell. Edge totals when you ask for them, a grand total in the corner, and headers that stay put as you scroll.

Postgres groups, JavaScript arranges

6 of 9 triples placed
What came back
3 columns
row_labelcol_labelvalue
Enterprise2025-Q3412K
Growth2025-Q3186K
Starter2025-Q341K
Enterprise2025-Q4508K
Growth2025-Q4204K
Enterprise2026-Q1473K
Starter2026-Q152K
Enterprise2026-Q2561K
Growth2026-Q2231K
grouped on both dimensions at once · both axes are re-sorted as plain text after the query returns, so the order the query asked for is not the order you get
Closed won · tier against quarter
tier \ quarter2025-Q32025-Q42026-Q12026-Q2
Enterprise412K508K473K·
Growth186K204K··
Starter41K·52K·
row edge, column edge and corner, each an opt-in
Budget

A hundred and fifty label pairs by default, three thousand at the ceiling. Past that the grid is trimmed rather than paged.

Exactly one down, one across

The cell holds the widget's primary measure. One dimension down and one across is the shape; arrays of either are not accepted on the config.

Where one gets authored

The drawer's Visualization tab opens on the table shape, so crossing two dimensions is a pair of pickers rather than a definition written by hand. The runtime decides on the presence of a pivot config and the renderer draws it with sticky headers on both edges. Colour rules land per cell through the same evaluator the charts use.

Both axes chunk like a chart dimension, so quarters can run across the top while product bands run down the side · headers stay put on both edges as you scroll
Row Starter, column 2026-Q1. The query returned the pair as text and the value beside it; the runtime is reading the pair and writing to the coordinate it names.
0
dimensions a grid crosses
0
label pairs in the default budget
0
switches, and a corner that follows them

Product figures from the platform’s own defaults - not customer averages

The mechanism

How it works.

01

Postgres groups, JavaScript arranges

The query groups on both dimensions at once and returns flat triples of row label, column label and value. The runtime collects the distinct labels, sorts each axis, and drops each value into its coordinate. A coordinate with no triple stays empty rather than reading zero.

02

Both axes chunk like a chart dimension

Each dimension takes the same banding a chart dimension does, so quarters can run across the top while product bands run down the side. The query orders both axes by their bucket keys and the runtime then re-sorts the labels as plain strings, which is why dated bands read correctly and numeric ones come out in alphabetical order.

03

Totals are added after the fetch

Switching them on sums the matrix in memory. That means they total the window that came back, which is the same window you are looking at, and not a separate pass over the whole table.

04

Where one gets authored

The runtime decides purely on the presence of a pivot config, and the renderer draws it with sticky headers on both edges. The drawer's Visualization tab opens on the table shape, so crossing two dimensions is a pair of pickers rather than a definition somebody has to hand-write.

Where it sits

Two moments in every number.

Every number passes through the same seven. Pivot Tables is the lit ones, and everything either side of it is a different page in this category.

  1. 01
    Query

    what is asked, and of what

  2. 02
    Shape

    the measure and the dimension

  3. 03
    Draw

    the visual chosen for that shape

  4. 04
    Arrange

    where it sits on a dashboard

  5. 05
    Filter

    narrowing it after the fact

  6. 06
    Drill

    going from the number to the rows

  7. 07
    Share

    who else gets to see it

The specifics.

8 facts
Dimensions
Exactly one down and one across. An array on either axis is refused by the config rather than flattened
Cell value
The widget's primary measure. A second measure per cell is not supported
Budget
A hundred and fifty label pairs by default, three thousand at the ceiling. Past that the grid is trimmed, not paged
Empty cell
Drawn as a dash so an absent combination reads differently from a zero
Totals
Two switches, one per edge, computed over the returned window. The corner is derived rather than switched, and it is only painted inside the column-totals row
Colour rules
Applied per cell by the same evaluator the charts use, so a coordinate under target reads like a bar under target
Authoring
The drawer's Visualization tab on the table shape, or an import of a definition written elsewhere
Not the same as
Chart Visuals, where this is one of two names the table shape offers

More in Reporting & Analytics

12 capabilities

Seven data shapes, twenty-two visuals, shareable without the portal.

Dashboard Sharing

Hand a board to a team or a CRM role, at read or at edit, by the person who built it. Roles outlive people, which is why a share points at one, not a mailbox.

Dashboards

Build as many as the floor needs, arrange them on a grid, and give each team the one that answers their question rather than everybody's question.

Cross-Filtering

Click a bar and the rest of the dashboard follows it, so the next question is asked by pointing at the answer instead of rebuilding the filter.

Drill-Through

Wire a chart's clicks to a second dashboard. The value travels on the URL and is read by the board that was named before it paints for the first time.

Conditional Formatting

Colour a number by the rule that matters - under target, over threshold, inside a band - so a dashboard reads correctly from across the room.

Reference Lines

Draw the target on the chart itself, so performance is read against the number that was promised rather than against the shape of the bars.

Comparison Periods

Put a window against the one before it, or against the same window a week, month, quarter or year back, on a card as a difference or a chart as a series.

Filter Trees

Seventeen operators in a nested and-or tree, so the report that needs two exceptions and a date range stays one widget instead of becoming three.

Theme Sets

Six palettes including a print set, pinned per widget, each carrying eight series colours plus the axis, grid, card and tooltip colours drawn around them.

Public Links

Thirty-two bytes of entropy, an expiry you choose, revocation on the spot, and only the hash kept at rest, on a board that draws its figures for a reader.

Embedded Widgets

Name a slot at the call site and one authored widget answers it everywhere inside the product, computed against the records of whoever is signed in.

Call Analytics

Total calls, answered rate, average duration and missed calls, split by direction and outcome, over the call records rather than a sampled export.

Reporting & Analytics

See pivot tables on your own floor.

Thirty minutes, your numbers and your data. We will set pivot tables up live and you can decide from the thing itself rather than from this page.

14-day trial · no card · migration included