Back

Eight columns, one row

How I broke dense tables down into chunks you can read at a glance, on web and mobile.

When I first opened the dashboard, the brief was simple: it looked too complicated. There were too many balances, attention was split across the screen, and every list was a table. That made sense for an MVP, since a table is the quickest way to put data on a screen, but nobody on the team had worked on UX, so it never went further.

One transaction carried eight facts across eight columns: recipient, transaction ID, currency, amount, date, status and more. The same table repeated for recipients and invoices. Everything was there, but none of it could be scanned, and none of it could go to a phone.

Role
UX, component design
Scope
Transactions, recipients, invoices, web & mobile

Where it started

Tables on every screen, even the dashboard.

The old dashboard: recent transactions in a table with a header row, one transfer read cell by cell

The old dashboard, with recent transactions in a six-column table.

The old transactions table, its seven columns numberedThe old recipients table with an accordion open inside a row, pushing the rows below it down

The transactions table, and recipients with details in an accordion that pushed every row below it out of view.

Tables work when someone checks values line by line against another document. Here the same table did every job, including a quick look to see if a payment landed. Reading one transfer meant scanning eight cells in order, and on mobile the only options were scrolling sideways or cutting columns.


First, I tried shrinking it

My first idea was to make the table responsive and drop columns as the screen got smaller. It didn't hold up. Whatever got dropped simply disappeared, and what stayed depended on screen width rather than on what mattered.

So I stopped treating a transaction as a row of cells. Instead of labelling each fact in a column, I started showing it: direction as an arrow, currency as a flag, status as a coloured chip.


Breaking the table apart

Eight columns, sorted into one row.

I took the columns as loose blocks and moved them around until they fit into one row without losing anything. Direction and currency merged into one icon. ID and time moved to a muted second line. Status became a chip under the amount. Every column ended up somewhere.

The old table's columns mapped onto the new row: type, currency, recipient name, transaction ID, date, amount and status each placed, actions moved to the detail page

Where each of the eight columns went.

The finished row measured: padding, icon size, primary and second lines, amount and status chip

The finished row, broken down part by part.


The row

Who, how much, and whether it went through.

Three rows: a USDC wallet deposit, a VND receive and a EUR send, each with its own arrow and currency badge

Deposit, receive and send, each with its own arrow. The flag or token shows the currency.

The new dashboard, with recent transactions as rows and no table header

The dashboard after, with the table header gone.


Deciding what stays on the row

Not everyone agreed at first. Some of the team wanted every detail visible on the row, which would have turned it back into a table in a smaller box. I explained that the row only needs what matters in that moment, and everything else can open in a detailed view when someone clicks it.

That detailed view is where every fact gets its label: the summary, the transaction information, and the card and user details. You glance at the row to find a transaction, and open the page when you need to check it.

A card transaction row opening into its detail page: summary, transaction information, and user and card information

The detail page, with everything the row left out, labelled.


Beyond transactions

Recipients, invoices, cards and mobile.

The same structure worked for every other list: icon, main line, second line, value on the right, status. For recipients, the arrow became an avatar and the amount became their currency. For invoices, it became initials and a due date. For cards, it showed the spend against the card's limit. Nothing else had to change.

An invoice row with initials and a due date, and a card row with spend against its limitA transaction row, and a recipient row with an avatar and their currency

Recipients, invoices and card spend on the same structure.

The mobile home screen, with transactions as rowsThe mobile cards tab, with card spend as rows

The same row in the mobile app.


What shipped

The row replaced tables across transactions, recipients and invoices on the web, and became the default list in the mobile app.

Before: one transfer across seven table cells. After: the same transfer as one row

The founders liked that the information now broke down into chunks that worked on mobile, which also answered the question the team had been stuck on: how tables would ever work on a phone. The full table stayed only where it helps, in full-page views with filters and CSV export for reconciliation.