(CASE 04 · PAYMENTS MARKETPLACE)

A payments marketplace designed from zero.

PaymentX connects merchants who need payment providers with providers competing for that business. There was no product to copy, no research corpus and no second designer. I designed the architecture, both sides and the design system, and every screen on this page is the real product.

The merchant's website room: revenue, providers and payment performance for one site
A provider profile: gateways, potential offers and contact details
A rental in detail: the provider's performance on one website
The Send Rental Offer modal, with the merchant verified by public key

2,392

PROVIDERS IN THE DIRECTORY

ROLE
Sole product designer
SCOPE
Architecture, both sides, design system

OUTCOMES

  • Architecture from zero, no references
  • Two sides running one component system
  • Checkout drop 14% → 0 after the inline refund call

No references existed. That was the brief.

A client arrived over Discord with a marketplace idea: merchants hiring payment providers the way you would hire a freelancer. Nothing comparable existed to steal patterns from, and both sides needed opposite things from the same product. The usual starting points, competitor teardowns and pattern libraries, were worth nothing here.

PAYMENT PROCESSORSFREELANCE MARKETPLACESBANKING APPSPAYMENTX
Merchants accept payments yes — — yes
Providers get hired like freelancers — yes — yes
Providers compete for the work — yes — yes
All of it in one product — — — yes

FIG. 02 · CATEGORY MAP, NOT A FEATURE AUDIT · NOTHING COMBINED ALL FOUR

Two sides, opposed incentives, one designer.

Merchants want leverage over providers, providers want qualified merchants without a race to the bottom, and the product had to serve both without a sales team translating. Add no research budget and a client who communicated in bursts, and every architectural mistake would be mine to find.

DEMAND SIDE Merchants

WHAT THEY WANT

  • Leverage over providers
  • Lower fees, faster settlement

ONE PRODUCT

one component grammar

SUPPLY SIDE Providers

WHAT THEY WANT

  • Qualified merchants
  • No race to the bottom

FIG. 03 · TWO SIDES, OPPOSED WANTS, ONE GRAMMAR BETWEEN THEM

Architecture before pixels. Weeks of it.

I mapped both sides’ jobs, money flows and failure states before opening a single screen file, because with two user types sharing one system, a wrong object model would poison every screen after it. I fixed what a provider is, what a website is and where money changes hands, and I drew every screen out of that model.

SUPPLY SIDE

Provider

Owns processing capacity
Sets limits, fees, payout terms

THE ASSET

Gateway account

Stripe · PayPal · Adyen
Monthly limit, fee %, payout schedule

DEMAND SIDE

Merchant

Needs capacity to
process payments

WHERE MONEY FLOWS

Website

Per-account spend cap
Live spend vs cap

EVERY MOVE RECORDED Transaction ledger status · fee · card mask · destination, filterable across every account and site
Four objects, one chain: providers list gateway accounts, merchants rent them on locked terms and allocate them to websites under hard caps. Once this model existed, the navigation, detail pages and tables fell out of it instead of being invented one by one.

TIER 1 · 55 TOKENS

Primitive ramps

Raw values, no meaning yet. Neutral 0–950 plus Blue, Green, Red, Rose, Orange, Gold, Slate ramps.

Blue/500

TIER 2 · 31 × 2 MODES

Semantic tokens

Meaning, per theme. Each token resolves differently in Light and Dark: bg/canvas, text/primary, brand/default…

brand/default

TIER 3 · 70 TOKENS

Component tokens

One per decision a component makes, aliased to semantics. Buttons, inputs and tables never touch a raw hex.

Button/Primary/bg
ONE REAL CHAIN Blue/500 brand/default Button/Primary/bg flip the mode, everything follows
Three tiers, so one change to a primitive ramp ripples through both themes and every component without anyone re-picking a hex.

THE MODEL, RENDERED

The screen map that fell out of the model: public site, merchant app, provider app, system overlays
The provider object, rendered: profile with reviews
The website object, rendered: add a website, point its DNS

The obvious split got killed.

The obvious build was two separate apps, one per side, and every adjacent marketplace seemed to validate it. I killed it. It doubles every future feature, and trust earned on one side never transfers to the other. I ran both sides on one component grammar instead, so a merchant reading a provider profile sees the same language the provider wrote it in.

The merchant's My Rentals: the same relationship, seen from the demand side
FIG. 06 · MERCHANT SIDE, SAME GRAMMAR
The provider's My Rentals: the same relationship, seen from the supply side
FIG. 07 · PROVIDER SIDE, SAME GRAMMAR

Refunds moved inline. The drop disappeared.

My sharpest single call in the system: a refund behind a modal read as a dead end at the exact moment trust decides, so I moved refunds inline into the checkout flow and the 14% checkout drop went to zero. I made the directory argue the same way, ratings, limits and processor badges first, 2,392 providers listed, price last.

The transaction ledger where every refund lives in flow: accepted and declined, filterable
FIG. 08 · THE INLINE REFUND, IN FLOW
The provider directory: ratings, limits and processor badges first, price last
FIG. 09 · THE DIRECTORY, TRUST FIRST

14% → 0

CHECKOUT DROP, AFTER THE CALL

2,392

PROVIDERS IN THE DIRECTORY

THE MERCHANT SIDE · A

I gave merchants one room for everything they rent: the provider directory, their websites, spend and limits per gateway.

The merchant's providers and accounts room: 43 accounts, spend and limits per gateway, one toggle each
The same website room at 390 wide

THE PROVIDER SIDE · B

Providers compete on the things merchants risk money on, so I made profiles lead with ratings, limits and processor badges.

A provider's gateway account: earnings, capacity, terms and the merchants renting it

I put a provider’s whole offer on one card: gateways, monthly earnings, capacity, and which merchants rent them today.

The provider's statistics: earned, processed, fee and active merchants

Statistics read like a payslip, earned, processed, fee and active merchants, because providers decide with the same numbers merchants see.

THE PUBLIC SITE · C

I wrote the public site to sell both sides the same promise, hire payment providers the way you hire freelancers.

The public landing page, top to bottom: promise, mechanism, security, pricing, proof and FAQ

FIG. 10 · THE PUBLIC SITE, TOP TO BOTTOM · SCROLL INSIDE THE FRAME

MOBILE, BOTH SIDES · D

Both sides run the same grammar at 390 wide, and nothing about trust gets lost on the way down.

The provider directory at 390 wide
The provider's gateways at 390 wide
The merchant's transactions at 390 wide

The client vanished. The lesson stayed.

The client took the files before a public launch and the final payment never arrived, so I have no usage metrics to show you. What I can show is the decision trail on this page. I start every engagement at 50% up front now, which makes this project the cheapest lesson a client ever taught me.

The merchant's website room in dark mode
The merchant's website room at 390 wide
Adding a gateway in dark mode: connect, verify read-only credentials, set terms
The DNS settings modal in dark mode

PaymentX

DESIGNED FROM ZERO · BOTH SIDES

ARCHITECTURE FROM ZEROTWO SIDES, ONE SYSTEMCHECKOUT DROP 14% → 0
Docket cover

NEXT CASE

Docket. AI can draft the decision. It can’t be accountable for it.