Skip to content
Product Design

Designing a clearer banking experience through product thinking and systems

Venus is a business-banking platform: accounts, cards, bill pay, invoicing, and payments in one place. Its dashboard showed everything at once, so nothing stood out. I reorganised it around the three questions people actually open the app to answer: How much do I have? What needs my attention? What can I do next? Getting there meant auditing every number on the screen, cutting the clutter down to a small set of reusable components, and adding motion only where it helps you read the data.

Role
Product Designer · Design Engineer
Timeline
5 weeks · 2025
Scope
Visual audit · Components · Motion · Build
The refreshed Venus home dashboard: a left navigation rail, a 'Welcome, Jane' header with quick actions, a balance chart card and an accounts list, then credit card, bill pay and invoicing cards.
colours on the home screen, every one a named token
36 → 22
type sizes on one scale
12 → 6
card shells (now 7 variants of one component)
5 → 1
median time to start a payment
~14s → ~5s
01

The problem

When everything is important, nothing feels important

The dashboard had grown feature by feature. Each addition solved a real problem, but together they turned the home screen into a wall of competing signals.

Every number was on the screen; none of it was ranked. The balance, the thing people open the app to check, carried no more weight than a quick link. Primary actions sat far from the moments you'd reach for them. Status lived in colour alone, and each corner of the screen spoke its own visual language.

So people had to decode the interface before they could act on it.

The design question became:

How do we make the dashboard easier to read without dropping anything people rely on?

02

Before

This is the screen people opened every morning.

Before: the legacy home dashboard (recreated, figures changed).

I walked the screen with the three questions customers bring to it, and marked every place where the design got in the way of an answer.

Eight friction points, mapped to the three questions the dashboard exists to answer.
  • How much do we have?

    Where the old screen answered it

    White text inside a gradient greeting banner

    The friction

    The biggest number was also the lowest-contrast element on the page

  • What needs me?

    Where the old screen answered it

    Colour dots in a table; a grey footnote under Quick Links

    The friction

    A failed payment and 27 overdue bills were easy to miss

  • How do I move money?

    Where the old screen answered it

    “Quick Links”, bottom-right, below the fold on a laptop

    The friction

    The most common task took the longest to reach

03

Visual audit

“It feels messy” doesn't give anyone a brief. A count does.

I pulled every distinct value off the legacy screen onto one board: each colour, type size, button, card treatment, corner radius and status signal. Laid out together, the duplication was hard to argue with: the same decision, made over and over.

The audit board. Every value is measured off the legacy screen.
  • Colours

    Before

    36 raw hex values

    After

    22 named tokens

    What changed

    11 greys become one Greyscale ramp; one Primary ramp; success and error only

  • Type sizes

    Before

    12

    After

    6

    What changed

    12 · 14 · 16 · 18 · 24 · 32, one family (Inter Tight), 2% tracking

  • Button styles

    Before

    9

    After

    5 variants

    What changed

    Primary · secondary · accent · ghost · link, all 40px high with a 12px radius

  • Card shells

    Before

    5

    After

    1

    What changed

    “Card Section” with 7 type variants sharing header, body, divider and footer

  • Corner radii

    Before

    7 (0–20px)

    After

    4 + pill

    What changed

    12 surfaces and controls · 8 key caps · 6 nav and tooltip · 5 chip

  • Status signals

    Before

    Colour only

    After

    Label + colour

    What changed

    “Failed” chip plus a struck-through amount

Before counts come from the audit board. After counts come from the refreshed design.
04

Component mapping

Every legacy pattern got one owner: a single design component, then a single code component.

I mapped each piece of the old screen to the component that would replace it. Where two legacy patterns did the same job, they merged. The KPI tiles, the accounts table and the Quick Links card all became variants of one “Card Section”. The code components carry the same names as the design, so a designer and an engineer can point at the same thing and call it by the same word.

  • Greeting banner + total balance

    Now one component

    <BalanceCard>

  • 4 coloured KPI tiles

    Now one component

    <Card> + <CardHeader> + <Stat>

  • Accounts zebra table

    Now one component

    <ListRow icon>

  • Quick Links card (5 styles)

    Now one component

    <VdButton variant>

  • Colour-dot status

    Now one component

    <Chip>

  • Transactions table

    Now one component

    <Transactions> (semantic <table>)

  • 14-item flat sidebar

    Now one component

    <Nav> · <NavGroup>

  • Header search box

    Now one component

    <SearchInput>

The component map, running

These are the real components the dashboard below is built from. Each tile shows a component and the code it maps to. Hover the nav to see its shared hover state.

Buttons→<VdButton variant>5 variants replace 9 legacy styles. One height (40), one radius (12), one label style (14/semibold).
Nav→<NavGroup> / <NavItem>States: default · active · badge · expandable. Hover pill is shared-layout.

Main menu

Card→<Card> + <CardHeader> + <CardDivider>One shell, seven types. Header · body · divider · footer.

Bill pay

Outstanding

11

Overdue

27

Due soon

-
Inbox3 bills
List row→<ListRow icon>Four leading-icon treatments behind one IconSpec union.
  • Treasurybulk
  • Googlebrand
  • DBDragon bladeinitials
  • Debt Loancustom
Stat→<Stat> + <Dot>Label 14/regular grey-500 over value 18/medium.

Overdue

4$920,00

Paid

2$6k
Progress + trend→<SplitProgress> · <MiniBars>Data-carrying shapes: utilisation and a 3-month trend.
Status chip→<Chip>Status gets words. Colour is the second signal, never the only one.
MHMichael HunFailed$250.00
Search→<SearchInput>Search is the jump-to; ⌘K is advertised in the field itself.
Live components running in-page — not a mockup.

Tokens behind the components

The components read only these tokens.

TokenValueUsage
--vd-grey-700Greyscale/700 · primary text, values
--vd-grey-500Greyscale/500 · labels, axis, meta
--vd-grey-400Greyscale/400 · nav, table headers
--vd-grey-100Greyscale/100 · borders, gridlines
--vd-grey-25Greyscale/25 · nav rail, inputs
--vd-primary-300Primary/300 · chart line, trend caps
--vd-primary-100Primary/100 · accent labels, balance bar
--vd-primary-0Primary/0 · icon badges, count pills
--vd-success-100Alerts/Success/100 · money in
--vd-error-200Alerts/Error/200 · failed chip text
05

Motion

Motion here earns its place by making the data easier to read. On a dashboard this dense, every animation has to explain something, or it gets cut.

Each one maps to something true about the number: the balance counts up to its value, the utilisation bar fills from zero, the chart draws left to right. One easing curve runs through all of it, and under reduced-motion every pattern skips to its end state, so the dashboard works the same without it.

Motion tokens

TokenValueUsage
--vd-dur-fast120msHover, press (scale 0.98)
--vd-dur-base200msMenus, tooltips, list rows, month pager
--vd-dur-slow320msCard entrance (8px rise + fade)
--vd-dur-count800msBalance count-up
--vd-dur-draw900msChart line draw + area reveal
--vd-stagger40 / 60 / 35msActions / cards / rows
--vd-easecubic-bezier(0.16, 1, 0.3, 1)The one easing curve
--vd-followspring 520 / 42Pointer-following: crosshair, nav hover

Motion lab

Each pattern on its own, running on the real components. Press Replay to watch one again, and scrub the chart with a mouse or the arrow keys.

Chart draw + scrub→line 900ms · expo-out · point spring

Saturn Balance

$0.00

$5,000in$3,802out

Line draws left→right in time order, area reveals behind it, then the point and tooltip land. Hover or use ←/→ to scrub.

Balance count-up→800ms · expo-out · tabular figures
Saturn Balance$0.00
Utilisation fill→700ms · main leads sub by 120ms

Credit card

$12,890.00

BalancePending
$21,421 available
AutopayApr 29
List stagger→200ms per row · 35ms stagger · 6px travel

Accounts

  • Credit Card$12,890.00
  • Treasury$200.00
  • Ops / Payroll$16,000.00
  • AP$321.32
  • AR$0.00
Trend bars→600ms · grow from baseline · 80ms stagger
Last 3 month average$42.1k
Menus + nav hover→200ms pop from trigger corner · spring hover pill

Main menu

Jane

Every pattern uses one curve — cubic-bezier(0.16, 1, 0.3, 1) — and collapses to its end state under prefers-reduced-motion.

Live components running in-page — not a mockup.
06

The redesign in use

The old screen made you hunt. Every number landed at once, so the three questions the app is really for got buried: how much do I have, what needs me, what can I do next. This is the same account, grouped around those questions and running live.

The refreshed dashboard, running

Scroll through it and hover the balance. Everything you need to answer those three questions is on one screen now, in priority order. No hunting.

Desktop viewport · scroll to exploreOpen full size ↗
Jane

Welcome, Jane

Saturn Balance

$0.00

$5,000in$3,802out

Accounts

  • Credit Card$12,890.00
  • Treasury$200.00
  • Ops / Payroll$16,000.00
  • AP$321.32
  • AR$0.00

Credit card

$12,890.00

BalancePending
$21,421 available
AutopayApr 29

Bill pay

Outstanding

11

Overdue

27

Due soon

-
Inbox3 bills

Invoicing

Overdue

4$920,00

Paid

2$6k
Open12 invoices$12.3k

Money movement

Apr 2025

Money in

$12,890.00

  • Debt Loan$12,890.00
  • Salary$200.00
  • DBDragon blade$16,000.00
  • Google$321.32
  • AR$0.00
Last 3 month average$42.1k

Money out

-$8,890.00

  • Martin Odegard$12,890.00
  • Dribbble$200.00
  • DBDragon blade$16,000.00
  • Google$321.32
  • Upwork$0.00
Last 3 month average$42.1k

Transactions

DateTo / FormAmountAccountMethod
Apr 24Stripe$500.00ARRequest or Invoice Payment
Apr 24Michael HunFailed$250.00 (not collected)ARWorking Capital Loan Payment
Apr 24Upwork Payment-$1,250.00Credit accountJessica A. ••9914
Apr 24Facebook Charge$310.99Credit accountJane B. ••5555
Apr 24UI8.net-$310.99Credit accountLandon S. ••4929
Apr 24Facebook Charge$310.99Ops / PayrollTransfer
Apr 24Facebook Charge-$310.99ARTransfer
Live components running in-page — not a mockup.
07

Before and after

Same data, same viewport. Left: before. Right: after.

Before

  1. Balance sits inside a greeting banner
  2. Money actions buried in bottom-right Quick Links
  3. Status shown by a colour dot only
  4. Bills and invoices as grey footnotes
  5. 14 flat nav items
  6. 36 colours, 12 type sizes, 9 buttons

After

  1. Balance leads the page, with trend, in/out and a scrubbable history
  2. Send and five quick actions are the first row after the greeting
  3. “Failed” chip plus a struck-through amount
  4. Bill pay and invoicing get their own cards with a clear next action
  5. Nav grouped into Main menu and Workflow
  6. 22 tokens, 6 sizes, 5 button variants, 1 card shell
median time from home to starting a payment
~14s → ~5s
where Send now lives (was bottom-right)
1st row
status signals that carry a text label
0 → 100%
08

Reflection

The audit board was the most useful thing I made here. It turned a question of taste into a question of counting, and a count is much easier to agree on. From there, the component map and the build were mostly bookkeeping: every decision the audit removed was one less to make again in design, in code, and in the next feature.

Building the frame 1:1 earned its keep for the same reason. It tests the system where systems usually break. Anything the existing tokens and components couldn't express pointed to a gap, and I fixed the system rather than hard-coding a value.

Lockedin App case study cover

Next Project

Lockedin App

From feature bloat to focused accountability.