Airtable rollup fields are the single most useful aggregation tool in the product. They are also the field type most people configure once, accept the default, and never touch again — which is why so many bases have rollups that quietly return the wrong number for months.
This guide is a deep dive into Airtable rollup fields with real formula examples. We will cover the aggregation functions you will actually use (SUM, COUNT, AVERAGE, ARRAYUNIQUE, CONCATENATE), the conditional filters that turn a rollup into a business metric, the gotchas that produce silent bad data, and the rollup patterns we ship on real client builds. If you are still fuzzy on how linked records, lookups, and rollups fit together, start with Airtable Linked Records Explained and come back.
What This Guide Covers
- How rollup fields actually work (the
valuesarray) - Every aggregation function with real examples
- Conditional rollups and inline IF logic
- Rollup vs Lookup vs Count vs Formula — pick the right one
- Five business patterns: revenue, capacity, ratings, status, hours
- Common mistakes and troubleshooting
- Performance tips for large linked sets
How Rollup Fields Actually Work
A rollup is a field that lives on the "one" side of a relationship and reaches across a linked-record field to do something with the values it finds. Under the hood, every rollup builds an array called values from a specific field on the linked records, then applies an aggregation formula to that array.
That is the entire model. Once you internalise it, the formula syntax stops feeling magic — you are writing a normal Airtable formula that happens to have one extra variable available called values.
To create a rollup:
- On the table where you want the result, click + to add a field.
- Choose Rollup as the field type.
- Pick the linked-record field that connects to the other table.
- Pick the field on that other table you want to aggregate.
- Write or pick the aggregation formula.
- Optionally set conditions to filter which linked records are included.
The aggregation formula box is a full formula editor. You can use any function from the Airtable formulas cheat sheet — not just the presets in the dropdown.
Rollup vs Lookup vs Count vs Formula
This is the question that comes up most often, and the answer matters because picking the wrong field type produces a base that works but is impossible to maintain.
| Field Type | What It Does | Returns | When to Use |
|---|---|---|---|
| Lookup | Displays raw values from linked records | Array/values | You need to see the data inline (client industry on a project) |
| Rollup | Aggregates values from linked records via formula | Number/text | You need a calculation across many linked records |
| Count | Counts how many linked records exist in the link | Number | You only need "how many?" — no aggregation needed |
| Formula | Computes from fields on the same record | Any type | All inputs live on the current record, no relationship traversal |
Count is essentially a rollup with COUNTA(values) and one fewer click — it exists because counting linked records is so common. Use Count when you literally just need the number; reach for Rollup the moment you need to sum, average, filter, or join.
SUM — Totalling Linked Values
The most common rollup. Use it whenever you need to total numeric values from linked records on the parent record.
Aggregation formula:
SUM(values)
Real example: Total revenue per client. On a Clients table, each client links to many Invoices. Each Invoice has an Amount field. The rollup on the Client called Total Revenue sums Invoice Amount across the link.
Real example: Project budget from line items. A Project links to many Budget Line Items, each with a Cost field. The rollup Project Budget is SUM(values) over Cost.
You can also do math inside the SUM. For a contract with multiple deliverables, where each deliverable has Hours and Rate but no stored total:
SUM(values)
But where each linked Deliverable has its own formula field Line Total = {Hours} * {Rate}, the rollup sums those line totals — push the multiplication onto the child record where possible, because rollups cannot multiply two fields from the linked record together. They can only aggregate one field at a time.
COUNT and COUNTA — Counting Linked Records
COUNT(values) returns the count of numeric values. COUNTA(values) returns the count of non-empty values — what most people actually want. COUNTALL(values) counts everything including empty.
Aggregation formula for "how many open tasks":
COUNTA(values)
With a condition: Status is not Done. The aggregated field can be any non-empty field — Task Name works.
Real example: Tasks remaining per project. Project links to Tasks. The rollup Open Tasks counts Task Name with condition Status != 'Done'. Add a second rollup Total Tasks with no condition. Add a formula field for percent complete:
IF({Total Tasks} = 0, 0, ({Total Tasks} - {Open Tasks}) / {Total Tasks})
Format that formula as a percentage and you have project completion in one row.
You can also do a Count field — it is faster to configure but it cannot apply conditions. Whenever the count needs to filter, use a rollup.
AVERAGE — Mean Across Linked Records
AVERAGE(values)
Real example: Average customer rating. Products link to many Reviews, each with a Rating 1–5. Rollup on Product = AVERAGE(values) over Rating. Round it for display:
ROUND(AVERAGE(values), 1)
Gotcha: AVERAGE on an empty linked set returns blank, not zero. If you display the average alongside a count, guard with an IF wrapper to avoid awkward empties.
MIN and MAX — Earliest, Latest, Cheapest, Highest
MIN(values) returns the smallest value, MAX(values) the largest. They work on numbers and dates.
Real example: Project final deadline. A Project links to many Phases, each with a Due Date. Rollup Project Deadline = MAX(values) over Due Date — gives the latest phase end.
Real example: First contact date. A Contact links to many Activities. Rollup First Contacted = MIN(values) over Activity Date.
Real example: Lowest quoted price. A Purchase Request links to many Vendor Quotes. Rollup Best Quote = MIN(values) over Quote Amount.
For more on date math in these contexts, see the Airtable date formulas guide.
ARRAYUNIQUE — Distinct Values from Linked Records
ARRAYUNIQUE(values) returns an array of the distinct values in the linked records. It is the workhorse rollup for surfacing categorical data from related rows.
Real example: Industries served by an account manager. Account Managers link to Clients. Each Client has an Industry single-select. Rollup on Account Manager = ARRAYUNIQUE(values) over Industry. Output: a deduped list of the industries that account manager works in.
Real example: Skills required across a project's tasks. Project links to Tasks. Each Task has a Required Skills multi-select. Rollup on Project = ARRAYUNIQUE(values). You now see every distinct skill needed across the project, deduped.
Combine with ARRAYJOIN to render as a comma-separated string:
ARRAYJOIN(ARRAYUNIQUE(values), ", ")
ARRAYCOMPACT(values) strips empty entries — useful when some linked records have not yet filled in the field. ARRAYJOIN(values, separator) flattens directly with no dedupe.
CONCATENATE — Joining Linked Text
CONCATENATE(values)
CONCATENATE jams all the values together without a separator, which is rarely what you want. ARRAYJOIN is almost always the right call:
ARRAYJOIN(values, " | ")
Real example: One-line summary of order items. Order links to Line Items. Rollup on Order = ARRAYJOIN(values, ", ") over Item Name. Result: "Widget, Gizmo, Sprocket" on the order record. Useful for email merge templates.
For more text manipulation patterns, see the Airtable text formulas guide.
Conditional Rollups — Filter the Linked Set
The "Only include linked records that meet conditions" toggle is where rollups become real business metrics. You can chain multiple conditions with AND or OR. Each condition references a field on the linked table, not the current table.
Real examples:
Total Paid Revenue— SUM Amount, conditionStatus is PaidOutstanding Balance— SUM Amount, conditionStatus is Sent OR OverdueTasks Due This Week— COUNTA on Task Name, conditionDue Date is within next 7 daysActive Subscribers— COUNTA on Member ID, conditionCancelled At is empty
For OR logic that the condition UI cannot express, push the logic into the aggregation formula with IF:
SUM(IF({Status}='Paid', values, 0))
This evaluates IF per linked record, returning the Amount when status is Paid and 0 otherwise. You can build arbitrarily complex conditions this way, though readability suffers — use the condition UI when you can.
Rollups Inside Rollups (and Why the Direct Version Fails)
You cannot roll up a rollup on the same relationship — Airtable blocks the configuration to prevent circular evaluation. But you can roll up a rollup that lives on a deeper level.
Pattern. A Client links to Projects. Each Project has a rollup Project Hours summing Task Hours from a linked Tasks table. On the Client, a new rollup Total Hours sums the Project Hours rollup across all the client's projects. This works because the Project Hours rollup is computed on the Project record (one level deeper) before the Client rollup reads it.
The mental model: rollups compute bottom-up. A rollup on level N can read a rollup on level N+1 because Airtable evaluates from the leaves of the relationship tree inward.
Five Real-World Rollup Patterns
1. Client lifetime value
| Field | Type | Configuration |
|---|---|---|
| Total Revenue | Rollup | Linked Invoices, field = Amount, condition Status is Paid, SUM(values) |
| Open AR | Rollup | Linked Invoices, field = Amount, condition Status is Sent, SUM(values) |
| First Invoice | Rollup | Linked Invoices, field = Invoice Date, MIN(values) |
| Last Invoice | Rollup | Linked Invoices, field = Invoice Date, MAX(values) |
2. Project health
| Field | Type | Configuration |
|---|---|---|
| Total Tasks | Rollup | Linked Tasks, field = Task Name, COUNTA(values) |
| Open Tasks | Rollup | Linked Tasks, field = Task Name, condition Status not Done, COUNTA(values) |
| % Complete | Formula | IF({Total Tasks}=0,0,({Total Tasks}-{Open Tasks})/{Total Tasks}) formatted as % |
| Final Deadline | Rollup | Linked Tasks, field = Due Date, MAX(values) |
3. Inventory snapshot
Current Stock = SUM(values)
Rollup on Product over linked Stock Movements where Movement Type is In, minus a second rollup where Movement Type is Out (or use IF inside SUM to do both in one rollup):
SUM(IF({Type}='In', values, -values))
4. Event attendance summary
| Field | Type | Configuration |
|---|---|---|
| Attendee Count | Rollup | Linked Registrations, field = Name, condition Status is Confirmed |
| Companies | Rollup | Linked Registrations, field = Company, ARRAYUNIQUE(values) |
| Diet Notes | Rollup | Linked Registrations, field = Diet, ARRAYJOIN(ARRAYCOMPACT(values), "; ") |
5. Sales pipeline
Push deal value totals per stage onto each Account record with multiple rollups that share the same linked field (Deals) but apply different conditions per stage. Five rollups for Lead Value, Qualified Value, Proposal Value, Negotiation Value, Closed Won Value. Each is a SUM over Deal Amount with a single Stage condition.
Rollups in IF and Other Formulas
Rollup fields can be referenced in other formulas like any other numeric or text field — that is where they earn their keep.
Tier classification example:
IF({Total Revenue} >= 100000, "Enterprise",
IF({Total Revenue} >= 25000, "Growth", "Starter"))
This is a classic nested IF pattern over a rollup. For three or more buckets, SWITCH is cleaner.
At-risk flag:
IF(AND({Open Tasks} > 0, IS_BEFORE({Final Deadline}, TODAY())), "Overdue", "On Track")
Common Mistakes
Aggregating the primary field instead of a value field. When the dropdown shows "Name" and you accept it, SUM returns 0 because Name is text. Always confirm the source field type matches the aggregation.
Using the Count field when you need conditions. Count is a one-click rollup with no condition support. The moment you want "Count of open tasks" instead of "Count of all tasks", switch to a real Rollup with COUNTA.
Confusing COUNT and COUNTA. COUNT counts numeric values only. If you point COUNT at a text field, you get 0. Use COUNTA for "how many non-empty linked records do I have on this field?"
Rollups over many thousands of linked records. A rollup on an Account linked to 50,000 Activity records recalculates on every base load. Either add a strict condition (Activity Date in last 90 days) or, for very large sets, compute the value periodically with an Airtable script into a number field.
Forgetting that ARRAYJOIN of numbers returns a string. If a downstream formula expects a number, wrap with VALUE() — but better, do the aggregation as SUM and only ARRAYJOIN when you actually want text.
Troubleshooting Rollups
My rollup is blank. No linked records, or all linked records have an empty source field, or all linked records are excluded by your conditions. Open one of the linked records and confirm the source field has a value.
My SUM is 0. The source field is text. Convert the source to a number, or wrap with VALUE() in the aggregation formula: SUM(VALUE(values)) — though this only works if every value parses cleanly.
My AVERAGE shows weird decimals. Round it: ROUND(AVERAGE(values), 2).
My ARRAYJOIN shows commas inside the values. The source field contains commas. Use a different separator that does not appear in the data, like " | " or " — ".
Conditions are ignoring blank fields the way I want, but counting blanks the way I do not. Conditions match by what is in the field. If you want "field is filled in", use is not empty explicitly.
Where Rollups Fit in the Bigger Picture
Rollups are one third of Airtable's relational toolkit. The full set:
- Linked records — define the relationship
- Lookup fields — display raw linked values inline
- Rollup fields — aggregate linked values
Once you can write a rollup with the right conditions and the right aggregation function, every business metric becomes a few clicks and a formula. Revenue per client, hours per project, tasks per sprint, registrations per event — same pattern, same shape, different field names.
For deeper formula work that gets referenced inside rollups, the Airtable formulas cheat sheet and the IF statements guide are the next two stops. The official Airtable Rollup field documentation covers every aggregation function reference if you want the authoritative list.