Data Tables in B2B SaaS: Patterns That Hold Up

An elephant standing calmly on a sturdy wooden table, the tip of its trunk on the keyboard of a small old computer, in black ink over a light blue brush stroke.

We went looking for a usability study on tables in B2B software, one that tested filters, bulk actions, saved views, row height or sticky headers with real users. We did not find one.

What exists is guidance from design systems (a design system is a company's published rule book and parts kit for its screens), one expert review from Nielsen Norman Group, and practitioner blog posts. Of the top five search results we got for "saas data table ux" on Nov 10, 2026, we read two, and neither cites any research.

So this guide grades its own advice. For each pattern it says whether we read the source page, saw only a search summary of it, or are giving our own view. It is about the tables people use on a screen, not database tables. None of it is a client story. The pictures are drawn in the look of a table component kit in Figma.

Why tables decide B2B products

Nielsen Norman Group's 2022 article on data tables names four things people do in one: find records that fit some criteria, compare data, view or edit a single row, and take action on records. Filters serve the first job. Columns and density serve the second. Edit patterns serve the third, and bulk actions the fourth. This guide follows that order.

Our reading of why this matters so much in B2B: in a product built around records, such as invoices, vendors, tickets or flagged payments, those four jobs are most of what a user comes to do. That sentence is ours. The article is an expert review that reports no test of its own, and it looks at desktop only.

An invoices table with a search box and a New invoice button above it, seven rows with checkboxes, columns for vendor, invoice, due date, amount and status, a menu on each row and page numbers below
The parts of a working B2B table: toolbar, header, rows, status, row actions and pagination.

What the studies say

The research that exists is old and narrow. It compares tables with charts, and it supports one sentence: whether a table or a graph works better depends on the task.

Schonlau and Peters (2012) found graphs better for estimating differences, and tables better for estimating equality and sums. Meyer, Shamo and Gopher (1999) found that the edge graphs had over tables depended on whether the data had a structure the task relied on. Dickson, DeSanctis and McBride (1986) ran three experiments with business students and concluded that the best format depends on the task.

We read all three as abstracts only (the short summary at the top of a paper), and none is about software tables. On sorting, filtering, bulk actions, saved views, density, sticky headers and column resizing in B2B tables, we found no usability study at all.

How we mark the evidence

Read means we read the page itself on Nov 10, 2026. Summary only means we saw the short summary a search engine shows under a result and did not read the page. Our view means our own reading, which no source states.

The read pages are one guidance page each from four design systems (IBM Carbon, Ant Design, GitHub Primer and Atlassian), the W3C's grid pattern and its page on what is new in WCAG 2.2, the web accessibility standard, the Nielsen Norman Group article, two SaaSUI articles by Rakesh Mondal, and Lollypop's guide, which cites no sources. Each design system is one company's position on its own product. None of it is research. We could not read Shopify Polaris, Salesforce Lightning or Material Design, so they are missing here.

When a table is the wrong choice

Carbon says not to use a data table for complex displays, as a replacement for a spreadsheet, for nesting, or in small containers. Primer says not to use one for hierarchical data, for columns whose cells are usually empty, or for long text. SaaSUI is blunter: a table with 20 columns of equal weight has become a spreadsheet and stopped being a product screen.

Column basics the read sources agree on

Nielsen Norman Group says the first column should be something a person can read, such as a name, and not a generated code, and that related columns should sit next to each other. Primer says to right-align numbers and use tabular figures, which are digits of equal width, so amounts line up down a column. It also says to leave empty cells empty and not fill them with a placeholder character. SaaSUI agrees on alignment, with text to the left and numbers to the right, and says to choose columns for how people scan a row, not to show every field you store.

Filtering and saved views

Sorting is the best documented control. Carbon shows a sort arrow only on the column that is sorted, and the others show theirs on hover. Primer makes each header a button that sorts up or down. The W3C grid pattern asks for the aria-sort attribute on the sorted header. An aria attribute is a label in the code that a screen reader, software that reads the screen aloud, can announce.

Filters

Nielsen Norman Group says filters "need to be discoverable, quick, and powerful". It adds that a user should be able to see plainly what a filter is doing, and that active filters need a clear visual sign. SaaSUI's June article adds that filters should be worded in the team's own terms, and that the header row, the active filters and the bulk action bar should stay in view while the user scrolls.

One decision hides in a default. Ant Design sends the table back to page 1 after a filter is applied, and a product has to decide whether to keep that. Our view is to keep it, because page 7 of the old results means nothing in the new ones.

An invoices table with saved view tabs above it, three filter chips for status, due date and amount, a line saying 42 of 1,280 invoices match, and links to clear the filters or save the view
Saved views as tabs, active filters as chips, and a count of what matched.

Chips are small tags that each name one active filter, and they are a common way to keep active filters visible. The article that describes them, a SaaSUI piece on filtering, is one we saw as a summary only. The same summary names a second choice: filters that apply as you pick them, or filters that wait for an Apply button. Our view is that live filtering suits a table that answers quickly, and an Apply button suits one where each query is slow.

Three states that should look different

SaaSUI's July article separates a table with no records yet, a table where the filter matched nothing, and a table that is still loading. The no-results state should offer to clear the filter. Its June article says the empty state should guide the user to add the first row. For loading, Carbon and SaaSUI both say to show skeleton rows: placeholder rows in the shape of the table, used in place of a spinner.

Saved views

A saved view is a named setup of a table that a user can return to. This is the weakest evidence in the guide. The only line we read is from SaaSUI: keep the user's last view and let them come back to it. Everything else is product help pages that we saw as summaries only, and they disagree with each other.

Saved views
ProductWhat a view savesWho can see it
BasisSort order, column widths, custom columnsNot in the summary
ForerunnerColumns, filters, sort rulesInternal or public
PostHogWhich columns show and their order, with filtersPrivate, or shared with the project
ProcoreNot in the summaryOne user, who can share it
OccupierFilters onlyEveryone in the account
CoralogixQuery, filters and table settings, carried in the page linkA teammate who is sent the link
SmartsheetFiltersNot in the summary

There is no standard to copy. That leaves two choices to make on purpose. The first is what a view saves: filters only, or the whole layout with columns, widths and sort. The second is who sees it by default: only the person who made it, the people it is shared with, or the whole account.

Our view on the trade-off, with no source behind it. A filters-only view is easy to explain, but two people opening it can still see different columns. A whole-layout view shows a colleague exactly what you saw, and gives you more to keep working when columns change. Sharing by default helps a team talk about the same list, and fills the list of views quickly.

Bulk actions and selection

This is where the read sources agree most closely.

Carbon puts a checkbox on each row for selecting many rows, and a radio button when only one row can be chosen. The header checkbox can show a partly ticked state when only some rows are selected. Once rows are selected, a bar of bulk actions appears above the table. While that bar is open, the action icons and menus on single rows are switched off.

Nielsen Norman Group describes the same shape: row checkboxes, action buttons or menus above or below the table, and a Select All when bulk actions are common.

A table with three rows ticked and a bulk action bar that says 3 of 42 selected, with a link to select all 42 and buttons to approve, assign, export and delete
The bulk bar says how many rows are selected and offers to select every match.

Show selection in more than one way

Lollypop says selected rows need a background highlight, not only a ticked box. Atlassian comes at it from the other side: selection or focus must not rely on a highlighted row alone. Put together, a selected row gets both a tick and a highlight. Atlassian also asks for a unique label on each row's edit button, one that names the row.

For the keyboard, the W3C grid pattern lists the usual keys. Shift+Space selects a row, Ctrl+Space a column and Ctrl+A everything.

What Select All covers

None of the pages we read says whether Select All means the rows on this page or every row that matches the filter. On a table with 42 matches and 10 rows a page, those are different actions. Our view, with no source behind it: say the count in the bar, and make selecting every match a separate step the user takes knowingly.

Guard rails

Two come from pages we read. SaaSUI says destructive bulk actions need a confirmation step; that is one vendor's line. Nielsen Norman Group warns about the single-row side: once a row carries more than one or two actions, they get crowded, lose their labels, or hide behind hover and menus, and become harder to find.

The rest comes from pages we saw as summaries only. A Nielsen Norman Group video on bulk actions is summarised as recommending Select All, an action bar that appears in context, and clear feedback with undo. Eleken reports that hiding checkboxes until hover cut clutter but made selection harder to discover. It also names a common failure: a bulk action that changes some of the selected rows and not others, and does not say why.

The hover finding is the trade-off in small. Always-visible checkboxes cost a column, and hidden ones look cleaner and are easier to miss. Our view is that where bulk work is routine, the checkboxes stay visible.

WCAG 2.2 has a target size rule (2.5.8, level AA) that applies to row checkboxes and row action buttons: a target for a pointer is at least 24 by 24 CSS pixels, with five named exceptions, spacing among them. That is what can be said on bulk actions UX with a source behind it.

Inline edit, drawer or full page

There are three common places to edit a record from a table. In the cell itself, which is inline edit. In a drawer, a panel that slides in from the side while the table stays on screen. Or on a page of its own. A fourth, the modal, is a pop-up window that blocks the page behind it.

No source we read gives a rule for choosing between them. The read sources give pieces.

Nielsen Norman Group says editing in place only works when the table is narrow, and that edit mode must look visibly different so people do not change values by accident. A modal covers the neighbouring records and is discouraged for deep editing. A side panel that does not block the page keeps the table in view. An accordion, where the row expands in place, gets cluttered when users leave several open.

Atlassian says that in more complex tables, with several kinds of editable content, an edit link should sit in the row's more-actions menu and open a modal or a dedicated page, not input fields. The W3C grid pattern gives the usual keys: Enter or F2 moves into a cell to edit it, and Escape goes back to moving around the grid.

Three small screens side by side: a cell being edited in the table, a side drawer open over the table, and a full page for one record
Three places to edit a record: in the cell, in a drawer, on its own page.

Where two read sources disagree

Nielsen Norman Group discourages modals for deep editing. Atlassian names a modal as one of its two routes for complex tables. One is an expert's position and the other a vendor's, and neither cites a study for it.

Pieces we saw as summaries only

PatternFly is summarised as sending an edit of many fields at once to a full edit page. A SaaSUI article on drawers is summarised as warning about drawers stacked on drawers, and about a drawer that closes on an outside click or the Escape key and loses what the user typed. The summary adds that a drawer that covers everything may be better as a page.

Our working rule

Putting those pieces together gives a rule of thumb. No source states it and no controlled study compares the three options, so treat it as our view.

Our working rule
WhereUse it whenWhat you give up
In the cellOne field, low stakes, a narrow tableRoom for help text and checks, and some safety against accidental changes
In a drawerThe user needs the list in view while editingWidth for the form, and typed input if the drawer closes too easily
On its own pageMany fields, several steps, or a change that is costly to get wrongSight of the list, so the user has to find their place again

The right-hand column is why we would not pick one pattern for a whole product.

When a save fails

The only rule on error states that we read is Atlassian's: mark the affected row or input with an error icon and explain how to fix it. Its example message tells the user the row could not be added and asks them to try again.

Two summaries we saw go another way. Semrush keeps an error state for back-end failures that stop data from showing, and Dynatrace folds errors into its empty state. We lean on Atlassian's rule only because it is the one we read.

Density and column control

Density is how tall the rows are, and so how many fit on a screen.

Density and column control
SourceRow heightsDefault or preference
IBM Carbon24, 32, 40, 48 and 64px40px
Ant DesignSmall, medium and largeLarge
Lollypop40, 48 and 56px48 or 56px, with no test cited

In Carbon, the header row, toolbar and pagination match the row height, and 64px is kept for rows with two lines of content.

This is the first of two open conflicts in this guide. Carbon's documented default is 40px, and Lollypop prefers 48px or 56px without citing a test. We found no controlled study on density, so nobody, us included, can say which default is right.

SaaSUI's July article argues for a density toggle and user-controlled columns in place of one fixed setting, which hands the choice to the user. Our case study on Drivetrain, a planning platform for finance teams, describes the same pull: the product leaned on pivot tables and dense grids, which pull data richness and visual calm in opposite directions.

The same table shown twice, with comfortable 48 pixel rows and compact 40 pixel rows, and a column menu with ticks for shown columns
Comfortable and compact rows, and a menu to show, hide and pin columns.

Hiding and reordering columns

Nielsen Norman Group says hiding and reordering columns must be easy and must not depend on drag and drop alone. Dragging a header is quick once learned, hard to discover, and poor for accessibility. It recommends a menu as the other route, and a visible sign that columns are hidden. The example menu in its article notes 15 hidden columns. WCAG 2.2 has a rule to match, on dragging movements (2.5.7, level AA): anything done by dragging must also be possible with a single pointer and no drag, unless the drag is essential.

Column resizing has almost no guidance

We found no design system rule for column resizing. Carbon's page does not cover it, Ant Design offers only width and minimum-width settings, Atlassian says nothing, and we have nothing recorded for Primer. SaaSUI's July article says to let users resize columns and remember the choice, and says nothing on how.

The only other guidance we saw is build notes from TanStack, a code library, as a summary: show a handle only on columns that can be resized, and apply the new width when the drag ends, because live updates can lag on complex tables. That helps engineers more than designers.

Keeping headers in place

Nielsen Norman Group says to freeze the header row and the header column when a table is larger than the screen, with a subtle drop shadow so the frozen parts read as floating. It also suggests light borders, zebra stripes and a hover state on rows to help the eye track across.

There is a cost for keyboard users. A sticky header can sit on top of the cell that has focus. WCAG 2.2 has a rule for this, 2.4.11 Focus Not Obscured (Minimum), at level AA: the item that has keyboard focus must not be entirely hidden by content the author added. The rule does not say how to fix it. Our view is to leave room at the top of the scroll area equal to the height of the header, so a focused row never sits under it.

Pages or endless scroll

Carbon puts pagination at the bottom of the table. Primer suggests 20 rows as a starting page length, with the user's position shown against the total. Ant Design also offers virtual scrolling, where only the rows on screen are drawn.

Here is the second open conflict.

Nielsen Norman Group, in two pages we saw as summaries only, says infinite scroll is not the answer for most websites and suits goal-driven visits poorly. It says pagination is usually better for long lists. Those pages are about websites and online shops, not B2B apps.

Lollypop, which we read, prefers a load-more button or infinite scroll for smoother browsing. It admits that with infinite scroll, users may find it harder to get back to earlier rows, and the total may not be clear. It cites nothing.

SaaSUI, also read, splits by task: pagination for reference and audit work, virtual scroll for continuous monitoring.

So the bigger name is unread and about a different kind of product, and the read source has no evidence behind it. If you have to choose today, SaaSUI's split at least ties the choice to the job. That is our view.

Audit trails and history

Except for two side notes marked below, the audit advice here rests on pages we saw as search summaries only, most of them product help pages. No design system page we read covers audit tables, and we found no research on them.

The summaries agree on a rough shape.

  • Nutrient's changelog records who made each change, when, and what it affected. It colours each type of operation, green for inserts and blue for updates.
  • The PASIprep audit grid has no row actions: no checkbox, view or edit column.
  • SaaSFrame's pattern page says to state up front what the log is for and what it covers, and not to imply it is more complete than it is.
A history panel for one row listing who changed which field, the old value, the new value and the time
Row history: who changed what, from which value to which, and when.

Two read sources touch the topic from the side. SaaSUI groups audit work with pagination, and the W3C grid pattern has an aria-readonly attribute that tells assistive technology a grid cannot be edited, which fits a log.

A starting shape, marked as ours

From those pieces, our suggested minimum for an audit table is short. Columns for who made the change, when, what changed and which record it touched. Filters and an export. No row actions. A line on the screen saying what the log covers. The filters and export are our own addition, the rest is our inference from the summaries, and no industry rule says it.

A row history panel is the same idea for a single record. Showing the old value beside the new one for each change is also our suggestion. The summaries say only that a trail records what a change affected.

Audit trails also matter when software acts for people. On Spendflo, a procure-to-pay platform where turingLabs runs design as a fractional team, the agent features sit beside versioning, an audit trail of every run, and permissions that follow the roles the company already has. Our guide to agentic AI product design covers that side.

A checklist before a table ships

Each line carries its mark, so you can see which ones to treat as settled.

A checklist before a table ships
CheckBacking
The first column is a name a person can read, and related columns sit togetherRead: Nielsen Norman Group, SaaSUI
Numbers are right-aligned with equal-width digits; text is left-alignedRead: Primer, SaaSUI
Active filters are visible and worded in the team's own termsRead: Nielsen Norman Group, SaaSUI
The table remembers the user's last viewRead, one source: SaaSUI
What a saved view saves, and who sees it by default, is decided on purposeOur view, from seven product help pages seen as summaries only
Rows have checkboxes, there is a Select All, and a bulk bar appears above the tableRead: Carbon, Nielsen Norman Group
Destructive bulk actions ask for confirmationRead, one source: SaaSUI
A bulk action gives feedback with undo, and a partial failure is explainedSummary only: Nielsen Norman Group video, Eleken
Edit mode looks different; Enter or F2 starts an edit and Escape leaves itRead: Nielsen Norman Group, W3C
One field inline, a drawer to keep the list in view, a page for long or risky editsOur view
Columns can be hidden and reordered from a menu, and the table shows how many are hiddenRead: Nielsen Norman Group
Row height is chosen on purpose, with a toggle if your users differRead, sources disagree: Carbon, Lollypop, SaaSUI
Pagination for reference and audit work, virtual scroll for monitoringRead, one source: SaaSUI
Skeleton rows show while loading; an empty table guides the first row; a no-results table offers to clear the filterRead: Carbon, SaaSUI
An error shows on the affected row or field, with a way to fix itRead, one source: Atlassian
The audit table shows who, when, what and which record, with filters, export and no row actionsOur view, built on summaries only

Column resizing is missing on purpose. One read source says to offer it, and we found no rule on how it should work.

FAQ

What makes good SaaS data table UX?

A table that does four jobs well: finding records, comparing them, opening or editing one, and acting on many. Those are the four tasks Nielsen Norman Group names. In practice that means visible filters, columns chosen for scanning, a clear edit mode and a bulk action bar. Past those basics the published sources stop agreeing.

Which table design best practices have real backing?

For tables on a screen, the ones several read sources repeat: a readable first column, right-aligned numbers, visible active filters, row checkboxes with a bulk bar, and skeleton rows while loading. Backing here means design system guidance and one expert review. We found no usability study on any of them in B2B tables.

How should bulk actions work in a table?

Put a checkbox on each row and one in the header, and show a bar of actions above the table once something is selected. That is IBM Carbon's pattern, and Nielsen Norman Group describes the same shape. Say how many rows are selected and confirm anything destructive.

Should a B2B table use pagination or infinite scroll?

The sources disagree. Nielsen Norman Group's caution about infinite scroll is about websites, and we saw it as summaries only. Lollypop prefers load-more or infinite scroll and cites no evidence. SaaSUI splits by task, with pagination for reference and audit work and virtual scroll for monitoring. We would start from that split.

What row height should an enterprise table use?

Enterprise table design has no agreed default. IBM Carbon defaults to 40px out of five heights from 24px to 64px. Lollypop prefers 48px or 56px and cites no test. With no study to settle it, a density toggle lets users choose.

Working on a table-heavy product?

Tell us which table your users spend the most time in and where they get stuck. We have designed B2B products in finance planning (Drivetrain), fraud detection (Effectiv) and procurement (Spendflo). Book a call.

Sources

Every page below was read or searched on Nov 10, 2026.

Pages we read: IBM Carbon's data table usage page, dated Sep 30, 2026 (carbondesignsystem.com); Ant Design's Table page (ant.design); GitHub Primer's DataTable guidelines (primer.style); Atlassian's Dynamic table usage page (atlassian.design); the W3C's grid pattern (w3.org) and its page on what is new in WCAG 2.2, dated Oct 5, 2023 (w3.org); Nielsen Norman Group's Data Tables: Four Major User Tasks, Apr 3, 2022 (nngroup.com); Rakesh Mondal's two SaaSUI articles, of Jun 6, 2026 (saasui.design) and Jul 2, 2026 (saasui.design); and Lollypop's guide to data tables, posted Mar 20, 2026 and updated Nov 3, 2026 (lollypop.design).

Studies, read as abstracts only: Schonlau and Peters, 2012 (ideas.repec.org); Meyer, Shamo and Gopher, 1999 (doi.org); and Dickson, DeSanctis and McBride, 1986 (doi.org).

Pages we saw as search summaries only and did not read. On filters, drawers, bulk actions, scrolling and resizing: SaaSUI on filtering and sorting (saasui.design) and on drawers (saasui.design); Nielsen Norman Group's video on bulk actions (nngroup.com) and its two pages on infinite scrolling (nngroup.com, nngroup.com); Eleken on bulk actions (eleken.co); PatternFly on inline edit (patternfly.org); and TanStack Table on column resizing (tanstack.com). On saved views: design.basis.com, withforerunner.com, posthog.com, support.procore.com, help.occupier.com, coralogix.com and smartsheet.com. On audit trails: nutrient.io, extranet.education.alberta.ca and saasframe.io. On error states: developer.semrush.com and developer.dynatrace.com.

Our own facts come from turinglabs.in.

turingLabs

Product design studio

turingLabs is a product design studio for B2B SaaS teams, working inside product teams at Series A and B companies.