The brief
A Toronto liquidation business needed to move from in-person auctions to an online marketplace that could run many lots at once, protect reserve prices, settle in CAD with HST, and hand buyers a clean pickup or shipping experience. Off-the-shelf auction software could not model their premiums, taxes and warehouse flow.
What we built
- Real-time bidding over websockets with soft-close anti-sniping, so a late bid extends the lot instead of stealing it.
- Proxy bidding and a Bid Assistant with Conservative, Aggressive and Snipe modes.
- Automatic admin bids that protect reserve prices.
- Invoices generated at auction close with buyer's premium and HST, rendered as PDF.
- Stripe payments, refunds and reconciliation.
- Pickup slots, shipment tracking and warehouse transfers.
- An admin portal with analytics, CSV bulk lot import, email templates, newsletter and an audit log.
Under the hood
About 200 REST endpoints across 30 modules on NestJS 11 with Prisma and PostgreSQL, Redis and Socket.IO. Stripe for payments, Twilio SMS, MailerSend email, Cloudflare R2 for lot images and Puppeteer for invoice PDFs. The bidder and admin portals are React 19 on Vite with TanStack Query, Tailwind and shadcn/ui, hosted on Render.
Where it stands
Delivered to the client with the backend feature-complete and both portals in use. Myone continues to support releases.
Stack
- NestJS 11
- Prisma
- PostgreSQL
- Redis
- Socket.IO
- Stripe
- Twilio
- Cloudflare R2
- Puppeteer
- React 19
- Vite
- Tailwind
- shadcn/ui
