DECLAN MALONE

PRODUCT / UX DESIGNER

0

← All projects

Cardconomy

92

Screens designed and built

3

User types

54

Design decisions logged

15

Cited research sources

Designed a three-sided UK trading card marketplace — then built it, and found out how far design and production drift apart when you own both. 92 screens, three purpose-built dashboards, and one vendor conversation that broke the original strategy.

The problem

  • UK collectors buy and sell on platforms that were not built for them. eBay UK takes roughly 12–15% all-in once you add the final value fee, per-order fee, regulatory operating fee and VAT. Cardmarket is cheaper at 5% for private sellers — but it is a German platform, and since Brexit that matters.
  • Cross-border purchases now carry customs handling, import VAT and delivery delays that did not exist in 2019. The cheapest listing in Europe is frequently not the cheapest card to actually receive.
  • Local game shops are being squeezed out. Price visibility from the big platforms compressed the margin on singles — the product that, industry-wide, keeps shops solvent.
  • And bulk is nobody's priority: listing 400 commons individually is not worth anyone's evening, so most collections sit in boxes. The gap was not another marketplace. It was one where the UK is the default rather than a shipping option.
The positioning, stated on the home page: every seller is in the UK, so post is next-day and there is nothing to pay at customs.

How I approached it

  1. 1

    Verified the market before designing anything

    239 lines of desk research, 15 cited sources, one rule: every number carries a link or it does not get used. Market sizing, a fee-by-fee teardown of eBay UK, Cardmarket, Whatnot and TCGplayer, and four evidenced market problems. Where public data did not exist — there is no clean UK-only TCG revenue figure — I wrote that constraint down rather than estimating, so no later deck could quietly inflate it.

  2. 2

    Modelled three users, not one

    A collector wants the right card at a fair price without customs roulette. A seller wants inventory to move without an evening of data entry. A local game shop wants footfall and a buylist that does not eat staff time. These are genuinely different jobs, so each got a purpose-built dashboard rather than one dashboard with role flags.

  3. 3

    Talked to a shop — and let it break the strategy

    The original bet was local game shops as a supply channel. One shop owner told me it was the wrong problem: "a lot of these brands main issues aren't selling, its sourcing." I did not accept it and did not dismiss it — I checked all three of his claims against sourced industry data. Two were partly true, one was inverted, and together they killed the pitch.

  4. 4

    Designed the system before the screens

    30 shared components, one token set, and a geometry contract enforced in code rather than described in a document. The goal was that screen 61 would cost less to design than screen 6.

  5. 5

    Built it in production tooling

    Next.js and TypeScript, mobile and desktop from one route registry. Building it is what surfaced the most useful lesson in the project, and it was not a design one.

The seller's dashboard is throughput — views, watchers and what needs acting on. A different job from the buyer's, so it is a different screen rather than a permissions toggle.

What the research changed

One conversation with a shop owner did more damage to my assumptions than the previous three weeks of desk research.

The original bet was local game shops as a supply channel: get shops listing their singles and the marketplace has inventory on day one. It is a clean story, so I took it to a shop owner — and he told me it was the wrong problem.

Three claims, each one undercutting the pitch. I did not accept them and I did not dismiss them; I checked all three against sourced industry data.

a lot of these brands main issues aren't selling, its sourcing.
if they wanted to use the site for sealed products, our site doesn't solve the main issue that getting that product is still near impossible.
a lot of these other game stores use singles as loss leaders to get people in the door.
Shop dashboard on mobile showing 30-day revenue, payouts and fees, plus buylist submissions received, cards reviewed, offers made and accept rate, with a Counter tab holding two waiting submissions.
What the shop actually needed, once selling turned out not to be the bottleneck: intake volume, review throughput and accept rate. Open it live and the Counter tab holds the queue.
Journey mapSelling & collecting, end to endOpen full
Six phases with what the user is doing, touching, thinking and feeling at each. The emotional low is “Will I get a fair number, or get lowballed?” — which is the anxiety the whole product is built to answer.
PrioritisationWhat we build, and whenOpen full
MoSCoW across the whole roadmap, every card tagged with build effort and whether it depends on the backend. This is where the pivot turned into scope decisions.

What I changed

  • The shop pitch moved from "we help you sell" to "we help you with trust, buylist intake and footfall." Selling was never their bottleneck — sourcing was, and for hot sealed product that is an upstream allocation problem no peer-to-peer platform can design around.
  • Singles turned out to be the high-margin profit centre (roughly 45% versus 15–20% on sealed), not the loss leader the owner described. His instinct about the mechanism was right and the two products were swapped. That produced the uncomfortable finding: a UK singles marketplace risks amplifying the exact price transparency that squeezed those shops in the first place.
  • The centre of gravity moved to collectors and peer-to-peer trading, with shops as trust, venue and community partners rather than as the supply channel.
  • The "another brand did this and disappeared" claim checked out — it was PucaTrade, dead in 2021, killed by an uncapped synthetic currency plus a sender–taker imbalance. Its surviving competitor Cardsphere used real cashable currency. That validated a decision already made: no trade credit, no platform points, trades settle card-for-card or in cash.
  • Trading strategy changed shape. The graveyard of in-person trading apps all died of the same thing — no local density — so the plan became seed a few cities deep, not the whole UK shallow.
The buylist intake the new pitch rests on: a submission arrives triaged, with the seller's verification and the payout maths already worked out.

Before & after

One vendor conversation, pressure-tested against cited sources, did more damage to my assumptions than the previous three weeks of desk research. He volunteered that he is not a typical game shop, so this is n=1 with that caveat attached — the value was not statistical.

Before

  • Local game shops as the supply channel
  • Shops list their singles; the marketplace has inventory on day one
  • Pitch to shops: we help you sell
  • National launch, UK-wide and shallow

After

  • Collectors and peer-to-peer trading at the centre
  • Shops as trust, venue and community partners
  • Pitch to shops: trust, buylist intake and footfall
  • Seed a few cities deep — local density is what killed the competitors

What I designed

Three users, three purpose-built dashboards — nothing here is a permissions toggle on a shared screen.

Three users, three dashboards. The buyer's home is discovery — sets, trending cards, price movement. The seller's is throughput — what is listed, what sold, what needs posting today. The shop's is the counter — buylist submissions, in-store trades, footfall. Same design language, three genuinely different jobs, and nothing is a permissions toggle on a shared screen.

Selling that does not cost an evening. Three routes in, because "list a card" means different things: one card with photos and condition, a bulk lot priced as a single pile, and a scan-a-stack flow for volume. Bulk being nobody's priority elsewhere was a research finding, so it got a first-class path rather than a checkbox.

A seller is a destination rather than a row: reputation, policies and their whole inventory filterable by set, condition and finish.
Flow diagramComplete user journeyOpen full
Every step from first visit to repeat purchase, with entry points, decision points and verification gates typed separately. Each step carries the problem it solves. Toggle between Detail and Flow view.
Direction explorationWhich layout answers “what needs my attention?”Open full
Two dashboard layouts side by side, generated before committing to either. Click a panel to select it — this is the comparison as it was actually made.

Buy orders, and the shop inside the product

Buy orders instead of endless watching. Name your price and condition and the platform matches you against future listings with a time-boxed exclusive window — turning "check every day" into "tell us once."

And the local shop sits inside the product: buylist submissions, in-store trade handoffs, and a storefront, so a shop is a place in the network rather than another seller row.

Local game shop storefront on mobile — Gnome Games, 4.6 stars from 1,280 reviews, Oxford 1.3km away, open till 9pm, with local vault and events cards and an in-stock-now row.
The shop as a place: distance, opening status, events and a local vault sit above the stock, because those are the reasons to walk in.
WireframesSell to shop — bulk intakeOpen full
A seller walks into a shop with 1,000 cards and the counter is busy. Sketch-fidelity wireframes across four phases, with an annotations layer you can toggle on to read the rationale behind each decision.

Paying once across three sellers

One payment, three sellers, three parcels — and a problem with one parcel affects that item alone.

A basket assembled from a multi-seller product page arrives at checkout as one payment and several parcels. The summary says so plainly — three cards, three sellers, three deliveries — rather than splitting the order into separate transactions the buyer has to reconcile.

Money is held in escrow per seller, so a problem with one parcel affects that item alone. It is the checkout answer to the trust question the whole three-sided model depends on.

One payment, held in escrow. Each seller is paid only when their card arrives as described.

The design system

One gutter per screen, enforced in code rather than written in a document — because a rule in a document survives about a fortnight.

30 shared components, a single token set, and one rule that mattered more than the rest: one gutter per screen, enforced in code rather than in a document.

Every screen picks one of two geometries. List and form screens put their inset on the scroller, so content contributes nothing. Card screens put no padding on the scroller and let each card carry its own margin. The shell component owns that choice and publishes it as a CSS variable that the breadcrumb and page title inherit.

The reason it lives in code is that the alternative does not hold. Written in a document, "screens are inset 16px" survives about a fortnight. Owned by the component, a screen physically cannot get it half-right — and when someone reaches for the wrong one, rows run to the screen edge while cards stay inset, which is visible immediately.

The same principle runs through the rest. One breadcrumb component that renders nothing when there is no ancestor to name, because a lone chevron is an orphan rather than a control. One notification blue, named once, so an unread dot and a new-listing badge cannot drift apart. One filled-button colour, so "primary action" means one thing.

One filled button per panel, so "primary action" means one thing. The offer arrives with the listed price and the 30-day range beside it, because accepting is a pricing decision.
System ruleEvery main screen, one header componentOpen full
The rule stated plainly and then tested against every screen at once, with toggles for each of the three states a header can take. This is the geometry contract made visible.
Design investigationSeller page, stripped back — 6 control rows to 3Open full
Before, After and Pins toggles over the same screen, with a table marking every row removed, kept or merged, and a section crediting the faults that prompted it. A measurable simplification with its reasoning attached.
Design investigationThe account hub says everything twiceOpen full
An audit of my own IA: what is stated, where it is stated again, why the repetition reads as a bug, and which route each duplicate belongs to.

Design to production: the part I did not plan for

I designed in a fast throwaway prototype — in-browser, no build step, instant feedback — and built the real thing in Next.js and TypeScript. Two repositories. That is a normal setup. What I had not reckoned with is how fast they come apart.

By the time I looked properly, the prototype was 219 commits ahead, touching 54 of its 82 files. The production app was faithfully implementing a design that no longer existed. Not because anyone was careless, but because the prototype is where thinking happens, and thinking does not wait for a port.

My first two attempts to fix a spacing complaint were guesses from a verbal description, and both missed. The third attempt loaded the prototype's screen and the built screen side by side and measured the computed values. It found the problem in one pass. That is the transferable lesson and it is about process rather than pixels: when two implementations disagree, put them next to each other and measure — do not reason from a description of the difference.

Reconciling them turned up things neither a design review nor a code review would have caught alone. A filter was hiding a seller's own stock — the facet row counted 13 listings while the grid showed 7, because a condition intended for one screen had been applied globally. Every seller photo was letterboxed on both breakpoints. Five hydration mismatches, where the server rendered one thing and the browser another, because a component read from local storage during render. A whole page had no back navigation. Seven "browse" buttons opened a search keyboard instead of the product grid.

Same screen, both implementations — and the direction of travel reverses. The prototype ran 219 commits ahead during the build, but once reconciliation started the newest decisions landed in production first: breadcrumb rooted at Home rather than Pokémon, links underlined, chevrons flipped, the ad moved out of the top slot. None of these are bugs. They are decisions, and by this point the build is where they were being made.

What I would do differently

Talk to the shop first, not third. One conversation invalidated a strategic bet that weeks of desk research had left intact. Desk research tells you the shape of a market; it does not tell you that you are solving the wrong problem for the people you planned to build on.

Treat the prototype-to-production gap as a scheduled job. Drift is not a failure of discipline, it is a property of having two artefacts. Reconciling weekly would have caught the filter bug in an hour instead of after it shipped.

Decide the geometry contract on day one. Every screen designed before it existed needed revisiting; the ones after it cost a fraction as much.

Write down why, at the time. I kept a running log of design decisions with their reasoning, including the ones still open. Months later that is the difference between "why is this blue?" and a two-line answer. It also meant that when a fee figure appeared in the UI that had not actually been agreed, it got flagged rather than quietly becoming fact.

What's next: private sales

The deal is already happening in WhatsApp. Neither side has any protection, and that is the same problem everything else here solves.

Collectors agree swaps and sales in DMs and group chats every day. One person posts first and hopes; the other pays first and hopes. There is no escrow, no tracked handover, no record if it goes wrong — and no reason it has to be that way when the rails already exist.

This one is designed but not built. The working document below sets out the state machine and the clocks that make it trustworthy, separates what genuinely has to be built from what the marketplace already does, and lists the decisions still worth arguing about — starting with who is selling before the sale is made.

In design — not builtPrivate sales — a sale between two people, on Cardconomy's railsOpen full
A private listing only the link-holder can find, escrow that releases when the parcel is scanned as delivered, and a build table separating what is new from what already exists. Includes the open decisions, unresolved.

Try it

Loading prototype…

What it did

  • The interface is complete across 92 screens on both breakpoints and runs as a production Next.js application. The domain model and API layer exist and are wired for a subset of flows; connecting the rest of the interface to real data is a known, scoped piece of work rather than an open question.
  • Pricing and fees are deliberately not settled. The research established what competitors charge. What Cardconomy charges is a decision I have kept open rather than guessed at.