Versapay · Design system and reporting UX case study | S2DO Media
ENTERPRISE SAAS · FINTECH

A million users,
one language.

Versapay moves money for finance teams. Two years of it ran through our hands: the platform's move off Ruby onto React, the design system that made that move survivable, and the reporting product that shipped on top of it.

ROLE
Lead Product Designer
YEARS
2022 to 2024
CLIENT
Versapay
SCOPE
System, UX, UI, handoff
Versapay
Acme Distribution Co.
Dashboard Customers Invoices Documents Activities Reports
Customer and payment adoption reporting

With these downloadable reports you can see which customers are using Versapay, and how they use it. Generate a report and we will email you when it is ready.

Get started Adoption Center
Report Date range Requested Status
Customer adoption Jan 1 to Mar 31 Apr 2, 9:14 Ready · .CSV
Payment adoption Feb 1 to Feb 29 Apr 2, 8:02 Generating
Customer adoption Q4 2023 Mar 28, 16:40 Expired
NEW REQUEST
Report type
Customer adoption Payment adoption
Date range
Jan 1, 2024 to Mar 31, 2024
Large ranges take longer. We will email you the moment it is ready.
Generate report
CANNED REPORTS · MVP

RECONSTRUCTED FROM THE PRODUCTION FIGMA FILE · SCROLL SIDEWAYS ON A NARROW SCREEN

THE ROOM WE WERE DESIGNING FOR
10,000+
customers on the platform
5M+
companies transacting
120M
transactions a year
$257B
payments processed annually

Figures published by Versapay. They matter here for one reason: at that volume a design decision is never small. A button that reads wrong becomes a support queue.

01 · THE BRIEF

Move the platform to React without moving the ground under the people using it.

A legacy Ruby product had grown into something no one could describe in a single sentence. Every team had its own version of a table, a date picker, a warning. The engineering plan was React. The design problem was that nobody had written the language down.

Familiarity was a requirement, not a preference

Finance teams work inside these screens every day and month end does not pause for a redesign. Nothing could be relearned.

The system had to speak to engineers first

If a component could not be built exactly as drawn, it was the drawing that was wrong. Variants were specified to match props, not to look tidy in Figma.

Reporting was the proof

Canned Reports became the first product built entirely on the new system. If the system worked, this shipped clean.

02 · HOW IT WAS ACTUALLY MADE

Four hundred wireframes before anyone picked a colour.

394
wireframe frames

Structure argued out in grey boxes, where changing your mind is free.

86
idea explorations

Directions kept on their own page so bad ones stayed visible and reviewable.

37
user test frames

One question tested properly: navbar or dropdown for report selection.

34
MVP screens

Every state of the shipped feature, including the ones nobody likes drawing.

Option A · Navbar SHIPPED
Customer adoption Payment adoption

Both reports visible at once. Testers understood there were two products without opening anything, and switching cost one click instead of three.

Option B · Dropdown CUT
Select a report

Tidier at rest and worse in use. It hid the fact that a second report existed, and people asked for a feature that was already there.

03 · THE FLOW

A report can take minutes. The interface had to be honest about that.

Generation is asynchronous, so the design's real job was waiting. We treated the wait as a state with its own screen, its own copy and its own exit, instead of a spinner and hope.

STEP 01
Choose and scope

Report type, then a date range. Two decisions, no configuration screen.

STEP 02
Generating

A four step load animation and a row you can leave. Closing the tab does not cancel the job.

STEP 03
Email, then download

The notification is the product. The .CSV sits in the table until it expires.

EDGE
No data match

An empty report is not an error. It says what was searched and offers a wider range.

04 · EVERY STATE, DRAWN

The states nobody demos are the ones support hears about.

Get started
Welcome
Jan 1 to Mar 31 ▾
Date range
Generating your report
Loading
Your report is ready
.CSV
Ready to download
No data in this range
Nothing matched Feb 1 to Feb 29. Try a wider range.
No data match
05 · MORE OF THE BUILD

Two reports, one shell, no second interface.

Customer adoption and payment adoption answer different questions but behave identically. Same table, same picker, same download. Learning one taught you the other.

Versapay Payment adoption
Payment adoption, Q1 2024
.CSV
All methods ACH Credit card Cheque
Payment method Payments Volume Share
ACH4,182$11.4M62%
Credit card1,907$3.9M21%
Virtual card640$1.7M9%
Cheque318$1.5M8%
4 of 4 methods
PAYMENT ADOPTION · READY TO DOWNLOAD
Versapay Customer adoption
Select a date range
Jan 1, 2024 to Mar 31, 2024
March 2024
SMTWTFS
252627282912 3456789 10111213141516 17181920212223 24252627282930 31123456
Cancel Apply
DATE RANGE PICKER · 502 INSTANCES IN THE FILE
BEFORE THE PIXELS · WIREFRAME PAGE
v1 · single report
v4 · tabs added
v7 · request panel
+391
more frames on the wireframe page, kept as the record of how the shape was found.
06 · THE SYSTEM

Variants written the way engineers would read them.

Every axis in the library maps to a prop. Size, colour, state, variant. A developer never had to guess which of four almost identical buttons was the real one, because there was one button with 297 legal combinations.

TYPE · INTER
Aa32 / bold
Section heading20 / semi
Navigation and labels16 / medium
Table header14 / bold
Body and table cell copy13 / regular
COLOUR TOKENS
brand
FF8800
ink deep
002233
text
212121
text sub
595959
action
37474F
success
3C7E40
pending
FFA601
warning
AF1616
border
E0E0E0
surface
FAFAFA
ink
131313
plum
443344
LIBRARY · 35 COMPONENT SETS, 57 STANDALONE SYMBOLS
Button
297 variants
size · colour · state · variant
IconButton
216 variants
size · font size · colour · state
Checkbox
186 variants
checked · indeterminate · size
TableCellRow
144 variants
hover · selected · columns · divider
TableHeadRow
36 variants
small · checkbox · columns
Typography
25 variants
13 roles · gutter
Tab
18 variants
active · orientation · icon
Table
16 variants
small · checkbox · small screen
Date picker
closed · calendar · range
502 instances in file
Load animation
4 steps
plus progress bar
Filter pill
5 states
default to applied
Empty state
no data match
plus success banner
07 · WHAT CAME OUT OF IT

The migration stopped being a redesign and became a checklist.

Once the language existed, screens could be rebuilt in React without a fresh design debate each time. Reporting shipped on the new system and became the reference other teams copied from.

Two years of enterprise work leaves a specific habit behind, and it is the reason this studio exists: draw the boring states, write the numbers down, and hand engineering something they can build without calling you.

One library, many teams

Components specified against React props so design and code stayed in step.

Familiar on day one

Structure and vocabulary preserved through the rebuild, so nothing had to be relearned at month end.

Decisions on evidence

Navigation settled by a user test, not by whoever spoke last in the review.

Shipped, not shelved

Canned Reports went out as the first product built entirely on the new system.

Versapay is the client. All product names and trademarks belong to Versapay. Screens here are reconstructions built for this case study, shown to describe the design work rather than to represent current production software.

Got a platform that grew faster than its design?
Let's make a journey.

Start a conversation All work