← All works

Designing the end-to-end proxy bidding experience for Collect2Day

JDirectItem Auction is an external Japanese auction marketplace. Behind every bid sits a web of payment, bid and refund states. I designed it so users only ever see one clear status and one next step, and can bid on Japanese collectibles without leaving the app.

Three mobile screens — product detail, Place bid, and My bids — showing the proxy bidding flow across the app.
Role
Associate Product Designer
Company
Buy&Ship
Type
External API · Auction UX
Team
2 PMs · 6 Engineers · 1 Designer

Background

Collect2Day (formerly Buyandship One) is a cross-border ecommerce platform that lets users access international marketplaces from one place. To expand the catalogue for users hunting Japanese goods, we integrated JDirectItem Auction, a major Japanese C2C auction marketplace.

The integration had to handle two purchase modes that behave very differently. Buy-out items follow a standard add-to-cart flow. Auction bidding demands real-time state, fast confirmation windows, and recovery flows when users get outbid.

Defining success with PM and engineering

North star
Monthly GMV lift from the JDirectItem channel
Service health
Monthly active users, order frequency, AOV
Buy-out flow
High purchase success rate
Bidding flow
Reliable bid placement, fast confirmation, strong rebid recovery

Key contributions

  • Partnered with PMs and engineering to turn a complex auction state machine into a flow that feels like a standard checkout: one upfront payment, pre-filled bids, and 6 clear statuses in place of 9 backend combinations
  • Defined the shared bid status model with backend, adding a dedicated Outbid status that every downstream team now uses
  • Led design across the full bidding lifecycle, scoping PDP, checkout, order management, notifications, and refunds into one coherent experience
  • Designed the full bidding experience: dual-currency flow, pre-filled Place Bid screen with real-time conversion and cost breakdown, and a bid management system where each status card surfaces only what the user needs at that moment

The challenge

This wasn't a single feature — it was a new commerce model layered onto an existing eCommerce app. Bidding reached into PDP, checkout, order management, notifications, and refunds.

1

Scope — a new marketplace and a new buying behaviour

Bidding touched almost every page in the app — end-to-end design, not a feature

2

Case complexity — auction state explodes into edge cases

Payment timeouts, failed payments, repeated raises and outbids can overlap. Each one needed a defined system behaviour and a clear way back for the user.

3

API constraints — design bounded by what the API returns

The external API defined what data was available. The design had to work within those limits, while still giving users everything they needed

4

Confidence — easy to lose when multiple actions run at once

A user can have a bid pending, a refund in progress, and an outbid notification — all at the same time. Every unresolved state is a chance to feel something's gone wrong.

Bidding flow design

Designed to create a consistent experience across bidding and shopping

Most proxy bidding platforms split payment across two moments. I designed the bid flow to consolidate all fees into a single upfront payment, so it's like a standard eCommerce checkout.

Place bid user journey — PDP → Place bid → Payment → Bid in progress → Auction resolves → Won (Order created) / Outbid (loops back to Place bid with Raise max) / Lost. Outbid and Lost both lead to a traceable refund.

Design highlights

Highlight #01

Taking the maths out of placing a bid

I designed the Place Bid screen to pre-fill the minimum bid and offer two one-tap increments— removing calculation from a time-sensitive decision. A full cost breakdown alongside eliminates checkout surprise.

  1. 1Pre-filled minimum bid — pre-filled minimum valid bid JP¥85,000
  2. 2Real-time HKD inline — auto-converts at platform rate, no currency switching needed
  3. 3Three quick-select increments — confirm minimum or step up in one tap
  4. 4Full cost breakdown — bid + tax + domestic shipping, itemised before you confirm
Product detail page — current bid JP¥84,000 / HK$3,830, with Buy now and Place bid actions
Product detail
Place bid screen annotated with four key interaction details1234
Place bid

One primary currency per screen

Place bid screen — JPY primary with HKD shown as reference
JPY primary
Checkout screen — HKD primary with order summary, shipping + handling fees
HKD primary
Context

Two currencies in one flow

JDirectItem Auction is a Japanese platform; bid increments are in JPY. But Collect2Day users pay in HKD.

Risk

Confusion under pressure

Two currencies in one flow leads to confusion, especially under auction time pressure.

Decision

One currency per screen

JPY while bidding, HKD at checkout — one primary currency per screen.

Highlight #02

Making bid statuses easy to understand

I mapped 9 backend combinations across payment, item, and order layers into 6 user-facing statuses, each with its own fields, urgency, and next action.

  • Bid order created, awaiting paymentCREATED
  • Payment failed or cancelled, retry allowedPAYMENT_UNSUCCESSFUL
Pending payment
  • Payment authorised, bid queuedCONFIRMED
  • Payment authorised, bid placedIN_PROGRESS
Bid in progress
  • Bid rejected, auction still live, hold releasingLOSE_BID
OutbidNew status, adopted by backend
  • Won, payment being capturedWIN_BID
  • Payment captured, order createdCOMPLETED
Won
  • Auction ended, hold releasedLOSE_BID → CLOSED
Lost
  • Not paid within 5 minutes, bid never sentCANCELLED / CLOSED
ClosedSame backend end state as Lost, but no bid was ever placed
Highlight #03

Adding "Outbid" to the shared status model

I pushed for Outbid to become a dedicated backend status, not an app-side label, so every team downstream works from the same definition. When edge cases in the API surfaced, a quick patch on the app side would have shipped fastest, but every other surface would still have treated the same situation as "Lost." I made the case to backend with concrete user-flow evidence, and together we agreed on the new status.

Design decisionOutbid is designed to keep users informed without misleading them. A state the experience needed, and the backend eventually adopted.

My bids screen — Outbid status card at top with max bid, current bid, and time remaining
My bids · Outbid card
Bid details screen — Outbid status with Bid again CTA, bid overview and bid order history
Detail · Bid again
Principle 01

Clear

"Outbid", not "Lost". The auction is still running.

Principle 02

Actionable

Current price vs their max, with a direct path to bid again.

Principle 03

Reassuring

Refund confirmation shows immediately. Every past bid and its refund stays traceable in bid details.

Highlight #04

Showing only what matters for each status

Each card shows only the fields that drive the user's next move, and names that move. The card's shape adapts to the state rather than forcing every status into one layout.

StatusInfo shownUser action
Bid in progressMax bid · Current bid · Time remainingKeep watching — raise max if outbid
Bid in progresswhen max − current ≤ bid incrementRaise prompt as current bid nears Max bidRaise Max bid before being outbid
OutbidMax bid · Current bid · Time remainingRaise max bid — or accept the loss
WonMax bid · Won bidView orders for parcel status
LostMax bid · Winning bidCheck refund — no further action
Pending paymentMax bid · Current bid · Time remaining (alert)Pay before timeout to keep the bid
ClosedMax bid · Reason: payment not completedPlace a new bid while the auction is open
Bid in progress bid card from My bids
Bid card · My bids
Bid details info panel — Bid in progress
Info in bid details
Bid details info panel — Bid in progress with raise prompt when current bid is within one increment of max
When current bid approaches max
Lost bid card from My bids
Bid card · My bids
Bid details info panel — Lost
Info in bid details
Highlight #05

A fallback pathway for every edge case

For each edge case I defined what the system does, what the user sees, and how they get back on track. Where possible, the design prevents the problem instead of recovering from it: the price is checked again before payment, so users aren't charged for a bid that's already been beaten.

SituationUser seesRecoverySystem behaviour
Payment times out before the bid is placedClosed, with a "Bid order closed" notificationPlace a new bid while the auction is open; the coupon can be reusedOrder closes after 5 minutes; bid never sent
Payment failsPending payment, with the time left to payRetry payment before the timeoutOrder stays open for retry
Current price passes the max bid before paymentA prompt to raise the max bidRaise the max bid, or leave without payingPrice re-checked before payment
Outbid while the auction is liveOutbid, with current bid next to max bidBid again from the Outbid card; the old hold refunds automaticallyBid rejected; payment hold released
Raising a bid several timesEvery past bid with its own refund status, in bid detailsAutomatic, no action neededNew order per raise; old hold released

Making every refund easy to track

Most recoveries end in a refund, so every bid on an item can be tracked. Tap any entry to see its payment record, refund status, and exact amount.

  • Bid history — every bid placed on this item, in order
  • Payment record — tap any bid to see its payment detail
  • Refund status — in progress or completed, with expected date
Bid details screen with Outbid status, showing bid overview and bid order history entry
Outbid
Bid order details screen — Refund in progress with payment method, order summary, refund total and refund ID
Refund

Outcome

Bidding launched first in HK, MO and SG, followed by MY and PH. In the first three weeks, 451 users placed 1,528 bids, and many of them came back to bid again.

0
Active bidders in the first month
0%
Came back to bid again
0
Bids per bidder on average

Losing is the normal outcome, not the edge case. 65% of bids end lost and only about 1 in 10 wins, so most bidders see a refund far more often than a win. That backs the decision to make every refund traceable, bid by bid.

People bid at hours when they can't watch. A third of all bids arrive between midnight and 5am HKT, peaking at 4am. Few people sit up to watch an auction close, which is why setting a max bid once and the Outbid notification matter. It may also be part of why 27.2% of orders miss the 5-minute payment window.

What's next

Fix unpaid bids

27.2% of bid orders go unpaid. Study the payment step and test saved payment methods

One-tap rebid from Outbid

Raise the max straight from the notification, with the next bid pre-filled

A next step after losing

Suggest similar live auctions on the Lost card to keep users hunting

Next up

Explore more work

← Back to all works