Capsule Marketplace, the seller side.
A multi-tenant product for running marketplaces: seller onboarding, catalogs, offers and stock, orders and returns, commissions, settlements and payouts. Built solo and in active development.
Two products, one direction
Capsule Marketplace runs the seller side of a marketplace and has no storefront, cart or checkout of its own. Capsule Commerce pulls snapshots and change feeds from it, reserves stock at checkout and sends orders in. The marketplace never calls back and never stores Commerce credentials.
What it does
Seller network
Onboarding with document checks and approval, and shops that enrol into marketplaces under versioned agreements.
Marketplaces and channels
Marketplaces with sales channels and two operating models, including a seller-owned catalog.
Managed catalog
Seller product submissions with typed attributes, variants, and image upload with re-encoding.
Offers, pricing and stock
Listings priced by channel, quantity and date, with stock and reservations for checkout.
Vendor orders
Accept, ship, deliver, cancel and return, per seller.
Money, end to end
Commission rules, a ledger, settlements, seller statements and payouts.
Cases and insights
Dispute, task and exception cases with comments, plus KPIs, seller scorecards and search.
Spreadsheet import and export
Operators move large catalogs and offers in and out without touching the API.
How it is built
- A modular monolith, on purpose. One Spring Modulith app with 15 modules, from tenancy and identity to finance and workflow, instead of a fleet of microservices.
- Tenant isolation in the database. PostgreSQL row-level security policies enforce it, so a missed check in app code cannot leak another tenant's data.
- Pull-only integration. Recorded as an architecture decision: Commerce depends on Marketplace, never the reverse.
- One query surface for every list. Shared sorting, filtering and paging across the portal, also recorded as a decision.
- Contract first. An OpenAPI spec for the machine-client API, and Testcontainers for integration tests.
Tested at three levels
0 test methods
Across 62 files, with Testcontainers running real PostgreSQL.
0 tests
Vitest across 12 test files in the React portal.
0-step smoke test
A scripted merchant journey through the public API.
~47k lines of Java
Plus ~35k lines of TypeScript in the portal.
The taxonomy migrator
A companion Spring Boot service that moves another system's data into a Capsule Marketplace tenant using only the public operator APIs.
- Imports Shopify's Standard Product Taxonomy: 14,606 categories and 281 return reasons, streamed one vertical at a time from an 80 MB dump.
- Declarative mapping profiles with dot-paths, transforms and nested lists, so a new source needs configuration rather than code.
- Batches of up to 500, parents before children, three retries with backoff.
- Safe to re-run: duplicates come back as already existing, so re-submitting a failed job is the recovery path.
Stack, and what is next
On the roadmap: single sign-on, stock split across locations, and richer shop-enrollment rules. It runs locally today and is not yet public.