Multi-Tenant Online Auction Platform
An online auction marketplace where auction houses post lots and buyers bid across three formats — Live (real-time), Timed (closes at a set time), and Buy Now (fixed price). Built for art, antiques, jewellery, watches, and collectibles.
One feed. Three ways to win the lot.
Collectibles from multiple auction houses surfaced in one feed. The product handles the three formats that matter for the category — Live (real-time bidding), Timed (closes at a set time), and Buy Now (fixed price) — without making the buyer learn a new mental model for each.
Heritage chronograph, leather strap
Untitled, abstract oil on canvas, c.1958
Art Deco diamond solitaire, c.1925
Hand-thrown stoneware vase, mid-century
Antique silver pocket watch, c.1890
Rare first-edition library, early 20th c.
This is an animated mockup of the auction-platform capability we'd build — not a live product. Lot photos and house names are illustrative, sourced from Unsplash.
Live auctions
Real-time bidding with a 1-hour window. Price ticks up as bids come in, the bidder count is live, and you can place a counter-bid until the gavel.
Timed auctions
Place bids any time until the timer hits zero. The platform handles outbid notifications and proxy max-bids in the background.
Buy Now
Fixed-price lots — no bidding, just buy. Useful when an auction house wants to move duplicates or below-estimate inventory quickly.
Across many houses
A single feed pulls lots from every connected auction house. Each card shows the house, lot number, estimate range, and category.
An online auction marketplace where auction houses post lots and buyers bid across three formats — Live (real-time), Timed (closes at a set time), and Buy Now (fixed price). Built for art, antiques, jewellery, watches, and collectibles.
Multi-tenant by auction house: each house gets its own dashboard to upload lots, schedule auctions, and manage results. Buyers see one unified marketplace across every house on the platform. A single bidding engine handles all three auction formats with mode-specific timing and notification rules.
Two operational surfaces sit on top of one bidding engine. Auction houses use their dashboard to onboard inventory, set the auction format (Live / Timed / Buy Now), schedule start and end times, and review hammer results once the sale closes. Buyers use a unified marketplace to browse lots from every connected house, watch lots, place real-time bids on Live auctions, set proxy max-bids on Timed auctions, or check out instantly on Buy Now lots. Notifications fire on outbid, ending-soon, and won events.
How a request flows through it
Each request enters at the top of the diagram, flows through every box, and lands at the bottom — exactly the way the production system behaves. The scan-line traces where a live request would be right now.
What it's built with
The interesting parts
Auction house dashboard
Houses sign in to their own dashboard to onboard inventory, pick the auction format per lot, schedule start and end times, and review hammer results once the sale closes. Each house's data is isolated; their branding surfaces on every lot they list.
Unified buyer marketplace
One marketplace across every house on the platform — buyers don't learn a new app per auction house. Filter by category, house, price band, or auction type; watch lots, place bids, and complete checkout from a single buyer account.
Three auction modes, one engine
Live (real-time bidding window), Timed (closes at a fixed time, supports proxy max-bids), and Buy Now (fixed price, no bidding) all driven by the same lot data — so buyers don't learn a new mental model per format and houses don't manage three separate systems.
Real-time bidding for live auctions
Every viewer of a Live lot sees the same current bid the instant it's placed. Bidder count, recent-bid feed, and time remaining stream live without polling, so the room doesn't drift between participants.
The calls that did most of the work
A handful of engineering choices shape how a system feels. Here are the ones we'd still defend — alongside what each one cost.
Three auction modes on a single bidding engine
Live, Timed, and Buy Now look different to buyers but share most of their data model (a lot, a price, a winner). Reusing one engine with mode-specific timing and notification rules is cheaper to maintain than three parallel systems, and it keeps the buyer's mental model consistent across formats.
Tradeoff: Mode-specific edge cases — live extensions, proxy max-bids on timed lots, immediate settlement on Buy Now — all live inside the engine and need careful per-mode testing.
Multi-tenant by auction house, not by deployment
Each house wants control over its own lots, pricing, and reporting, but standing up a separate deployment per house would multiply ops cost. Tenant isolation per house gives each one a private dashboard while keeping a single backend.
Tradeoff: Cross-house buyer queries (the unified marketplace browse) have to walk every tenant — needs indexing and caching discipline so the catalog stays fast as the number of houses grows.
Real-time bidding via WebSockets, not polling
Live auctions can't tolerate polling lag — every bid needs to broadcast to every viewer immediately, or the bid that 'won' is already stale by the time you see it.
Tradeoff: Persistent connections add operational complexity over stateless REST — connection management, reconnection, and fan-out to all viewers of the same lot all need to be solved.
Notifications as a first-class subsystem
Auction value lives in the moments between events — outbid, ending in 30 seconds, you won. If those moments arrive late or unreliably, buyers stop trusting the platform. Treating notifications as a real subsystem (not a bolt-on) keeps every event tight against the bidding engine.
Tradeoff: Adds a delivery layer to test and monitor (push + email + SMS) and a per-user preference surface to maintain.
Tell us what you're building.
Free 30-minute call. Real humans, real timelines, no follow-up emails forever.