Roll-ups
A roll-up column totals up rows from a related table and shows the result on the parent row. Give a Customers table a "Total Invoiced" that sums every linked invoice; give a Projects table an "Open Tasks" count. The value recomputes automatically as the child rows change.
In the app this column type is labelled Linked Summary.
The classic shape is invoice → line items → SUM: line items live in their own table, each links back to its invoice, and a roll-up on the invoice sums their amounts into an invoice total.
Roll-up vs. formula
Roll-ups and formulas both produce a computed, read-only value — but they work along different axes.
| Roll-up (Linked Summary) | Formula | |
|---|---|---|
| Direction | Vertical — across many linked rows | Horizontal — across columns on the same row |
| Combines | One column, aggregated over child rows | Many columns of a single row |
| Needs | A related table with a link back to this one | Nothing but this row's own columns |
| Example | Sum every invoice linked to this customer | {Price} * {Quantity} on this line |
Rule of thumb: "sum one column across linked rows" is a roll-up; "combine several columns on the same row" is a formula. MIN / MAX exist in both, but they mean different things — the roll-up minimum is the smallest value found across the child rows, the formula minimum is the smallest of a few columns on one row.
What you configure
A roll-up needs four things (the setup wizard walks you through them):
- Source table — the child table that holds the rows to aggregate (e.g. Invoices, Line Items, Tasks). The picker only lists tables that already have a link column pointing at this table — those are the only ones that can be rolled up.
- Back-relation column — which link on the source points back here. Auto-selected when the source has only one link to this table; you pick it explicitly when there are several (e.g. an invoice with both a "Customer" and a "Billing Contact" link).
- Aggregation — what to compute (sum, count, average, …).
- Value column — the column on the source table to aggregate. Hidden for Count, which just counts rows.
You add a roll-up like any other column: add a column on the parent table and choose type Linked Summary. If no table links back to this one yet, the wizard offers to either link an existing table (it adds the back-link column for you) or spin up a new related table — so you can set up the whole relationship without leaving the dialog.
If the wizard warns that the summary "belongs on the other table," you're on the child side of the link. A total like Total Invoices per Customer lives on Customers (the parent), not on Invoices.
Aggregations
| Aggregation | In-app label | Needs a value column? | What it returns |
|---|---|---|---|
| Sum | Sum | Yes | The values added together |
| Count | Count | No | Number of linked rows |
| Average | Average | Yes | Mean of the values |
| Minimum | Minimum | Yes | Smallest value |
| Maximum | Maximum | Yes | Largest value |
| First | First | Yes | Value from the oldest row (by creation time) |
| Last | Last | Yes | Value from the newest row (by creation time) |
| Distinct count | Distinct count | Yes | Count of unique values |
| Joined list | Joined list | Yes | All values, comma-separated |
Value column type. Numeric columns are the natural fit for Sum / Average / Minimum / Maximum, but text columns that hold numbers work too — Konduit converts the values to a number before aggregating. That's why the value picker doesn't restrict you to number columns.
Empty results. When there are no linked rows to summarize, Sum / Average / Minimum / Maximum show an em-dash (—), while Count and Distinct count show 0 — matching how those aggregations behave over an empty set.
(Median is intentionally not offered.)
Filtering which rows count
By default a roll-up aggregates every linked child row. You can add one filter to narrow it — total only overdue invoices, count only open tickets:
Pick a column on the source table, an operator, and (for most operators) a value. Supported operators depend on the column type — equals / does not equal, greater/less-than comparisons, contains for text, is empty / is not empty, and is checked / is not checked for checkboxes. The filter only restricts which rows are included; it doesn't change the aggregation itself. The setup wizard supports a single filter condition.
Compute-then-roll-up
The value column can itself be a formula column. This is the pattern for anything where each child row needs a per-row calculation before it's totaled:
- Line totals — give Line Items a formula column
Line Total = {Qty} * {Unit Price}, then roll it up with Sum on the invoice. - Credit notes — give the child rows
Credited = {Original} - {Credit Note}, then Sum that on the customer. - Margins — compute the per-row margin, then average or sum it on the parent.
There's no type restriction on the value column, so "formula per row, then roll it up" is a first-class pattern rather than a workaround.
Roll-ups feeding formulas
The reverse chains too: a formula on the parent can reference a roll-up column's value. When a child row changes, the parent's roll-up recomputes and the parent's formulas re-run in the same pass, so both stay consistent.
The worked example is a Customers table with three roll-ups — Total Invoiced, Total Credited, Total Paid — and a formula:
Net Outstanding = {Total Invoiced} - {Total Credited} - {Total Paid}
Add a credit note and the whole chain updates in one write: the line's formula → the customer's Total Credited roll-up → the Net Outstanding formula.
How it updates
Roll-ups are computed on the server and are read-only — you can't type over the value or set it through the API. They recompute automatically when the child rows they summarize are added, edited, or removed.
Cells show one of three states:
- A value — the current total, formatted per the column's display settings (currency, decimal places, or a plain number; counts always render as whole numbers).
- Computing… — a brief spinner right after you create the column while Konduit fills in the values for existing rows.
- — — no linked rows to summarize yet (or a sum-of-nothing).
Relationship to line items
Roll-ups are the read-out side of Konduit's line-items model. The same relationship gives you two things:
- Edit the child rows — inline on a task with an items-mode datatable-link field, or directly in their own table.
- Total them — with a roll-up column on the parent.
They're complementary: the roll-up summarizes; it doesn't replace the itemized rows you edit and (optionally) print onto a document.
Rules & limits
- No self-reference. A roll-up must aggregate from a different table.
- The back-link is a relation column. It must be a link column on the source table that points back at this table.
- No direct loops. You can't create a roll-up if the source table already has a roll-up aggregating straight back from this table (a direct A↔B cycle). Longer chains are allowed; a runaway chain of recalculations is capped for safety rather than blocked up front.
- Value column required for every aggregation except Count.
- One filter condition in the setup wizard.
Next
- DataTables
- Formulas — for same-row calculations, and as roll-up value columns
- Datatable-link Fields — link tasks to child rows and edit them inline