Skip to content
CodePay · B2B Platform & Design System

Designing decision infrastructure in high-risk payments.

Founding designer building a cross-product design system, refactoring high-trust workflows, and shipping a fast feedback-to-release loop across two payment products.

Design SystemRisk-aware UXInformation architectureDual-track deliveryAI prototypeAI workflow
Role
Founding Designer + PM
Scope
Design System · Risk-aware UX · End-to-End Ownership
Tools
Figma · Figma Make · AI-assisted workflow
Timeline
Jul 2025 – Present
0Section

Overview

One founding designer, two live products: patch what's breaking, rebuild what won't scale.

CodePay live on a café counter: the merchant management dashboard, a POS terminal, a customer tapping a card to pay, and the transaction receipt detail.
Partner platform

Onboarding rebuild

IA & UX

The platform partners use to bring a new merchant onto payment solutions. I restructured the onboarding workflow to strip friction out of a complex setup, cutting effort for the merchant and ops cost for us.

~30%

less setup effort

jump
In-person payment app

Payment app rebuild

UI/UX

The app staff run every sale on. I rebuilt the payment workflow and its UX on one shared component system, so the busiest moment at the counter stays fast and clear across 100+ screens.

~2,000

terminals on the new UI

jump
1Section

Challenge → Strategy

The flexibility we sell, and the complexity it creates.

The complexity we can't design away

Flexibility is the whole pitch: one app for a coffee cart, a busy bar, a furniture showroom. But every choice a merchant gets at the counter is a setting someone configured in the back office, so the flexibility we sell and the complexity it costs are two sides of one coin. The work was never to delete that complexity, only to absorb it, so each step stays legible and hard to get wrong.

auto
Flexibility
the pay app
9:24 am
Sale Amount$31.75
Tax(8%)$1.59
Service Charge(4%)
Surcharge(3.5%)$0.95
Server ID01
Credit$26.68
Debit$25.68
EBT$25.68
Cash$25.07
WPYB0023290000712025-09-25 / v2.1.6.706(706)
Complexity
the operations platform
Register/Payment methods

Select which payment methods are enabled for this register

Enabled Payment Methods

Charge method
Debit Card
Credit Card
Cash
EBT Card
Gift Card
Card
Scan QR
Present QR Code

Payment methods. Each way to pay is a checkbox in back — only the ones turned on become buttons on this screen.

Three pressures, three tracks

The same trade showed up on my side of the desk: one designer, two products already live, and a backlog split between what was breaking today and what wouldn't scale tomorrow. I read it as three pressures and gave each its own track.

01The pressure

In payments, one wrong tap moves real money, and real trust.

Patch Track

Rank every fix by the damage it prevents, and add guardrails and second-checks to the most dangerous steps first.

02The pressure

Two products had drifted apart: the same idea, built a little differently on every screen.

Platform Track

Rebuild one shared design system, then move both products onto it gradually so nothing live has to break.

03The pressure

One designer against two live products, speed was the real limit.

Prototype + AI

Fast clickable prototypes and AI-assisted iteration to align the team, test with real merchants, and ship in tight loops.

2Section

Patch Track

I turned noisy requests into high-leverage fixes with guardrails and consistent state patterns.

Real customer complaints, grouped into four recurring themes.
The requirement pool: every complaint logged and risk-ranked in the tracker.

03Out as small, shipped fixesonto both products, in fast iterations

Four design principles

Far too many to show, so the four below are the throughline, each one a representative fix.

docs / design-principlesauto
01-state-visibility.md01

#Make system state always visible

Showing the right state at the right moment is the cheapest form of error prevention.

## Problem

The system only supported full refunds. Adding partial refunds meant staff had to decide with no feedback on what they'd selected or how much was left.

## Decision

The refund screen now updates live as selections change: remaining refundable amount, per-item breakdown, and running total all reflect the current state instantly.

Refund UI before and after

What patches couldn’t reachsystemic gaps no patch could touch, so the rebuild ran in parallel from day one

Patches kept trust today. The only path forward was a rebuild.

3Section

Platform Track

Rebuild the foundation once, then rebuild both products on top of it.

Patches bought time. The platform track is the rebuild for tomorrow: one shared foundation, then the two products on top of it. The payment app on the counter, and the partner platform behind it.

01

Design system

Build the thing that makes design scalable, before designing anything.

A cross-product foundation on an open-source base, reskinned with brand tokens. One source of truth for color, type, and spacing across every product.

Color

Brandreskinprimary, interactive
#EAF0FF
#CCDCFF
#97B8FF
#427EFF
#0051FF
#C1FF72
Neutraltext, surfaces
#FAFAFA
#F5F5F5
#E9EAEB
#D5D7DA
#A4A7AE
#717680
#535862
#414651
#252B37
#181D27
Errordestructive
#FEF3F2
#FEE4E2
#FECDCA
#FDA29B
#F97066
#F04438
#D92D20
#B42318
#912018
#7A271A
Warningholds
#FFFAEB
#FEF0C7
#FEDF89
#FEC84B
#FDB022
#F79009
#DC6803
#B54708
#93370D
#7A2E0E
Successsettled
#ECFDF3
#D1FADF
#A6F4C5
#6CE9A6
#32D583
#12B76A
#039855
#027A48
#05603A
#054F31

Typography

Inter · one family

Display lg48/60 · 600
Display md36/44 · 600
Display sm30/38 · 600
Display xs24/32 · 600
Text xl20/30 · 500
Text lg18/28 · 500
Text md16/24 · 400
Text sm14/20 · 400
Text xs12/18 · 400
weightsAaRegularAaMediumAaSemiboldAaBold
02

Payment app

UI/UX rebuild

Fast enough for a rushed cashier, learnable without training, consistent enough to scale.

v3.0 UI/UX rebuild, as design lead with the PM. Transaction and payment logic could not change, so the tools were clarity, hierarchy, and sequence.

0+

Active terminals

0K+

Weekly transactions

Payment terminals on real cafe and bar counters

The component system

An app-specific library on top of the design system. Every fix goes back into the component, not the screen, which kept 100+ screens consistent under constant iteration.

Payment app component library

Same components, same rules, grouped by flow.

CodePay terminal

Designed for the unhappy pathState VisibilityReversibility

In payments, the unhappy path is the product. Every hard state lives in the shared component, not the screen, so each one stays explicit and recoverable.

Declined, timeout, read failure, out of paper: a clear state and a way forward, never a dead end.

Declined
Declined
Result timeout
Result timeout
Read-card failed
Read-card failed
Out of paper
Out of paper

Same flow, before and after

Two decisions shaped the rebuild. The same tasks at the counter, redrawn so each one is harder to get wrong.

01

Split one screen into twoCognitive Load

The fix was separation of concerns, not simplification.

Sale flow v2 — fees and the tip input share one staff screenSale flow v3 — tip split out into its own customer-facing step
02

Let state drive the interfaceState Visibility

The result should read before anyone acts.

Transaction detail, before and after — status moves from buried fields to a status-first chip

Post-launch

~2,000

Terminals on the new v3.0 UI/UX

Feedback pointed the same way: streamlined staff workflows, and fewer errors at the counter.

03

Operations platform

IA & UX rebuild

A rebuild of the merchant onboarding flow. The platform created and managed merchants in one place, so I split the two jobs.

An information-architecture rework, not a UI redesign. The screens reuse the existing components on purpose. What changed is structure and hierarchy, which is where it broke.

Partners and ops kept describing the same root cause.

Nobody could use it without training. The onboarding workflow was complex enough that partners leaned on our ops team to finish it, instead of completing it on their own.

The old register-configuration surface: charge methods, transaction types, and a POS preview crammed onto one dense screen

Discovery · partner + ops interviews

Too much, all at once

Too many fields up front
ML
Half of these fields are never used
Terminal assignment? No idea how it works
P1
Charge methods + transaction types need a clearer UI

What do I actually need?

Which fields are required to go live?
Time zone, what is it even for?
Where do I get the TID?
P0
What's an FCS ID for an EBT card?

Did it actually work?

No activation status, is it pending or failed?
P1
Can't validate terminal SNs
MLP0
What does “Not set” mean?
The active-check rules are a mystery

Onboarding wore management's clothes

A first-timer saw every tool at once.

No line between required and optional

Nothing marked what you needed to go live.

No signal you were done

A setup could look finished while it wasn't.

Too tangled for a doc to settle, so I prototyped the structure with AI.

Figma Make turned the IA into clickable frames, one fix per problem, so the team argued with the real flow instead of a spec.

2 days

to a clickable prototype in front of the team

100+

versions iterated before export

Workable flow

to align the team on the real thing, not a doc

Onboarding, split from management

A first-timer no longer lands in the full management surface; the two became separate places.

Cognitive Load
Prototype: the merchant management terminal list, separated from the lean onboarding terminal-binding step

A guided stepper, required fields marked

Only what's needed to go live, in order, with required fields flagged as you fill them in.

Error Prevention
Prototype: the guided onboarding stepper with required fields marked on the new-merchant form

Explicit completion states

A clear done state, or exactly what is left, with the merchant list as the hub.

State Visibility
Prototype: onboarding success and incomplete states beside the merchant list with its status column

Built, shipped, and in use.

Two jobs, two places: onboarding to create a merchant, management once it is live. The merchant list ties them together.

30+

partners live on the new platform

~30%

less setup effort, internal test

Onboarding, just enough to go live

The guided stepper, end to end: merchant and store, payment channel, terminal, then the app on the terminal.

Screen recording of the shipped onboarding stepper, from the merchant list through every step to a live merchant

Management, the full surface

Once a merchant is live, the full configuration sits one place away: basic information, terminals, settings, and employees.

Screen recording of the live-merchant management surface, moving across its configuration tabs

When one screen serves two intents, split the screen, not the user’s attention.

4Section

Takeaways

In high-risk payments, trust is the product.

01

Payments UX = trust & risk management

Status visibility, error prevention, and reversibility matter more than visual polish. In high-risk payments, trust is the product.
02

Data truth is a product surface

Semantic rigor, time ranges, definitions, consistent terminology, is what makes dashboards believable and decisions possible.
03

Dual-track delivery is a founding designer's real job

Patch keeps trust today; platform rebuild enables scale tomorrow. The skill is knowing which to prioritize at every moment.
04

AI should be an acceleration layer for decision loops

But only with guardrails, confirmation, and traceability. AI accelerated the decisions, not the craft.
Also · GTM

Interactive AI prototypes

Vibe-coded to align stakeholders on value, risk controls, and the roadmap for external pitching.

Website & pitch assets

Standardized the messaging and cut the sales team’s “explain cost.”