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.

15 modules, one app310 backend tests93 portal testsPostgreSQL row-level securityIn 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.

Two products, one direction pull-only integration

What it does

Sellers

Seller network

Onboarding with document checks and approval, and shops that enrol into marketplaces under versioned agreements.

Structure

Marketplaces and channels

Marketplaces with sales channels and two operating models, including a seller-owned catalog.

Catalog

Managed catalog

Seller product submissions with typed attributes, variants, and image upload with re-encoding.

Offers

Offers, pricing and stock

Listings priced by channel, quantity and date, with stock and reservations for checkout.

Orders

Vendor orders

Accept, ship, deliver, cancel and return, per seller.

Finance

Money, end to end

Commission rules, a ledger, settlements, seller statements and payouts.

Operations

Cases and insights

Dispute, task and exception cases with comments, plus KPIs, seller scorecards and search.

Bulk

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

Backend

0 test methods

Across 62 files, with Testcontainers running real PostgreSQL.

Portal

0 tests

Vitest across 12 test files in the React portal.

End to end

0-step smoke test

A scripted merchant journey through the public API.

Size

~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

Java 21Spring Boot 4Spring ModulithPostgreSQL 16 + RLSFlywayReact 19TypeScriptTailwind 4Radix / shadcnTestcontainersOpenAPI

On the roadmap: single sign-on, stock split across locations, and richer shop-enrollment rules. It runs locally today and is not yet public.

Write back. I answer fast.

Open to senior backend, platform and AI engineering roles, and to consulting on SAP Commerce, Java and marketplace integrations.