Marketplace · 2024 · Shipped
Multi-Vendor Marketplace
role
Full stack engineer

An end-to-end marketplace platform with three distinct portals sharing one API and one MongoDB cluster. Buyers browse, filter and checkout across multiple vendors in a single cart. Vendors manage their own products, orders and payouts. Platform admins control commission rules, disputes and cross-vendor analytics.
the problem
Multi-vendor commerce breaks predictably on split orders: one cart, multiple sellers, separate fulfilment timelines, separate money flows. Single-tenant e-commerce code has no model for any of that.
what I built
Orders designed as a parent record with per-vendor sub-orders, each running its own state machine. Authorization scoped to vendor identity at the middleware layer so no route can accidentally cross vendor boundaries.
architecture
React storefront with faceted search, persistent cart across sessions and guest checkout Node.js / Express API with vendor-scoped authorization enforced once in shared middleware Parent order record with per-vendor sub-orders, each with independent state machine and fulfilment flow Commission and payout ledger computed automatically from settled sub-orders MongoDB aggregation pipelines for catalog facets, search ranking and vendor analytics Vendor dashboard: product CRUD, inventory, order management, payout history and metrics Platform admin: commission configuration, dispute resolution, cross-vendor reporting
Engineering highlights
01
Split orders that stay coherent
One checkout fans out into per-vendor sub-orders. Fulfilment, refunds and payouts are completely independent per seller - no shared state, no cross-vendor bleed.
02
Authorization that can't be forgotten
Vendor identity scoping lives in shared middleware, applied once before any route handler runs. Every endpoint is vendor-safe by architecture, not by convention.
03
Catalog at query speed
Facets and listings run on tuned MongoDB aggregation pipelines with compound indexes. No in-memory filtering, no N+1 catalog reads at browse time.