Equine Breeding, Billing & Live Auction Platform
Context
An equine reproduction management system built for a breeding business's staff and customers. It is built on NestJS, Next.js, Prisma, and PostgreSQL, with breeding records, billing, timed auctions, and QuickBooks sync.
The Hard Part
The business entered the same data twice and kept disconnected records across separate tools, including a separate auction product. Staff needed one place for breeding records, contracts, billing, and communication.
What I Built
- pnpm and Turbo monorepo with 4 apps and 1 shared types package
- NestJS API with 246 controllers and 138 modules on PostgreSQL and Prisma
- Breeding records: embryo lifecycle, ownership, biopsy, and charges
- Timed auctions with max bids, an increment ladder, soft close, spending limits, bans, and live updates over Socket.IO — each bid in one database transaction with row locks and Redis protection against duplicate requests
- Stripe card setup, payment collection, invoicing, and auto-charge, plus QuickBooks sync with encrypted tokens
- Staff and portal sign-in with argon2 password hashing, JWT access and refresh tokens, and Google sign-in
- SMS, voice, and email through Twilio and Resend, and AI briefings with the Anthropic SDK
The Build
An equine reproduction business kept breeding records, billing and auctions in separate tools and entered the same data twice.
I built one platform on NestJS, Next.js, Prisma and PostgreSQL: breeding records, Stripe invoicing and auto-charge, QuickBooks sync, and timed online auctions with live bidding. Each bid runs in one database transaction with row locks and duplicate-request protection.
The platform is covered by 101 Playwright specs and 13 CI workflows.
Measured Results
1
database transaction per bid, with row locks and Redis protection against duplicate requests
101
Playwright specs, run through 13 CI workflows
4
apps and 1 shared types package in one monorepo
Tech Stack
More Case Studies
Have a similar project?
I would love to help you build something great. Let's discuss your requirements.