Idepoo Software

A multi-vendor marketplace platform that is already in production

Three products in one platform — storefront, seller panel and operator panel — with multi-seller settlement, legally compliant invoicing, faceted search on Elasticsearch, and five locales of which two are right-to-left. Trading today in the German market.

Why building a marketplace from zero is an expensive mistake

The shopping cart is not the hard part. What makes a marketplace hard only shows itself once real money moves: an order split across four sellers, each part shipping and returning independently; a commission that must be computed at the right moment and held in reserve until the return window closes; an invoice whose numbering may have no gaps; and a ledger a tax auditor can follow and no code may quietly rewrite.

This platform has all of that, because it was built for a real and demanding market — Germany — and proven in production. The figures are counted from the repository: 62,275 lines of C# across 486 files, 36,426 lines of TypeScript, 238 HTTP endpoints across 19 modules, 15 bounded contexts with isolated data stores, 74 domain aggregates, 49 migrations and 845 automated tests.

If you want a bespoke marketplace built from the ground up rather than a platform to license, marketplace development is that service; this page is about buying what is already built.

Three products in one platform

  • Storefront

    Faceted search on Elasticsearch — brand, category, origin, organic, price — with variant families collapsed into a single card. Product pages with galleries, variant axes, typed attributes, reviews and buyer questions. Guest and account checkout, per-seller shipping, hosted payment. Wholesale tiers, comparison, wish lists and a weekly offer rail.

  • Seller panel

    Onboarding with KYB: legal identity, registration number, VAT ID, bank details and document review. Listing against the shared catalog or proposing a new product for review. Bulk CSV import for offers and stock. Campaigns and coupons, wholesale pricing, scheduled price changes. Packing, carrier handover, tracking, returns and RMA decisions. Commission, reserve holds against the return window, debits and payout statements.

  • Operator panel

    Catalog governance: product types, attribute sets, the category tree, variant families and an approval queue. Store approval and KYB document review. Moderation of reviews and questions, and notice-and-action handling. An invoicing queue — vendor invoices are confirmed before they are issued and numbered. VAT by rate and document type, settlement oversight, payout execution. Audit trail, retention rules and a compliance worklist for catalog gaps.

What separates this from a shop template

Price is arithmetic, not a typed number. The unit price is computed from what the shopper can actually pay today, so starting a campaign moves the per-kilo figure with it. A container deposit is its own component with its own VAT treatment, from the cart quote through the invoice line to the refund; it is never folded into the price of the goods. Price history is recorded per offer, so a "lowest price in 30 days" figure reads the price in force when the window opened, not merely the changes inside it.

Money is a value object, not a decimal. It is Money throughout, never decimal, with one rounding rule applied once per line. Totals are carried forward from the quote into the order, the invoice and the settlement rather than recomputed at each step — because two computations of the same number eventually disagree.

Policy is snapshotted at the moment of sale. The return window comes from a policy tier attached to the offer when the purchase was made, so a later policy change cannot rewrite what the buyer was promised.

Compliance as a domain rule, not a checkbox

  • Unit price

    The per-kilo or per-litre figure is computed from the price actually payable, and is identical on the listing card and the product page. (PAngV § 4)

  • Deposit stated separately

    The deposit is its own component from the cart quote to the invoice line and the refund. (PAngV § 7)

  • Lowest price in 30 days

    Price history is kept per offer and the window figure is read correctly. (PAngV § 11)

  • Gapless invoices

    Per-issuer sequential numbering allocated under a row lock. An invoice missing a mandatory field cannot take a number. (§ 14 UStG)

  • Credit notes

    A correction repeats the particulars of the invoice it corrects and carries VAT back at the rate it went out, per rate. (§ 17 UStG)

  • Immutable books

    The settlement ledger rejects UPDATE and DELETE at the database level; corrections are compensating entries. (GoBD)

  • Food information

    Allergens, origin and net quantity are typed catalog fields rather than free text, so they can be filtered and validated. (LMIV)

  • Privacy

    A subject-access pipeline fans out over every context, with email-verified identity, an SLA clock and retained-category transparency. (GDPR)

  • Trader identity and notices

    Seller legal identity is public on the shop page; an abuse report is routed to a moderator rather than triggering an automatic takedown. (DSA)

Every row above is a rule in the domain layer with a test that fails when the rule is removed. That distinction matters: compliance enforced only in the interface disappears the first time somebody places an order through the API.

If your target market is not Germany or the EU, the same structure adapts: the rules live in the domain layer and are swapped per market.

Architecture: fifteen bounded contexts, each with its own store

  • Real boundaries

    Identity, Catalog, Vendors, Offering, Pricing, Cart, Payments, Ordering, Invoicing, Settlement, Returns, Reviews, Notifications, Compliance and Admin — each owns its schema and its DbContext. Nothing reaches across a boundary with a join.

  • Events and an outbox

    Contexts talk through domain events delivered by a transactional outbox, so a failure in one does not roll back another and no event is lost.

  • Correctness under load

    Anything that decides money — coupon redemption, seller payouts, gapless invoice numbering — takes a row lock inside an explicit transaction, covered by concurrency tests that run real parallel requests against a real database.

  • One definition per rule

    Where two surfaces need the same answer — the parcel count, the effective price, a cache key — they call one function. The invariant is tested directly: the number the listing quotes equals the number the product page quotes.

  • Background work

    Ten hosted services for what is not request-shaped: an outbox dispatcher, an email dispatcher, expiry sweepers for payments and stock reservations, reserve release, retention enforcement, and a pricing scheduler that starts and ends campaigns.

  • 845 tests

    Integration tests boot the real application against PostgreSQL and Redis in containers. One standard throughout: a test earns its place only if it fails when the fix it guards is reverted.

The stack

  • Back end — .NET 10 with MediatR, EF Core and FluentValidation; warnings as errors, banned-API analyzers, 49 versioned migrations.
  • Data — PostgreSQL 17 for state, Redis 7 for cache and distributed rate limits, Elasticsearch 8.15 for search and facets.
  • Storefront — Next.js 15 with the App Router and server components, next-intl across five locales, SEO metadata and a sitemap.
  • Panels — React with Vite, TanStack Query and react-router, on a shared typed API client and a 20-component design system.
  • Payments— hosted checkout with webhooks and an inbox for replay safety, refunds and chargeback handling.
  • Delivery — Docker Compose, an nginx proxy, a CDN, and a mail server with SPF, DKIM and DMARC.

Five languages, two written right to left

Persian and Arabic are not a translation layer over a left-to-right design. The whole interface mirrors: the layout uses logical properties throughout, so padding, borders and icons flip without a second stylesheet. Dates and numbers come from the browser's own locale data, which means a Persian shopper reads a delivery date on the Jalali calendar in Persian numerals and an Arabic one sees the Hijri equivalent — because that is what those locales mean, not because a special case was written.

Nineteen transactional email templates are authored in all five languages, sent as multipart HTML and plain text with the recipient's own direction applied, from an authenticated mail domain.

What you receive

  • The platform, deployed and running

    Deployment on your infrastructure with Docker Compose, migrations and seed data included.

  • Your brand and theme

    Colour, logo, typography and the home page on the existing design system — these are in the base price. A fully bespoke design from scratch is estimated separately.

  • Your languages and market

    Five locales ship with it; adding a language and adapting the compliance rules for a target market is defined work with its own estimate.

  • Catalog and data migration

    Import of catalog, sellers and users from your current system; bulk CSV import for offers and stock is built into the seller panel.

  • Training and documentation

    Training for the operator team and for seller support.

  • Support and updates

    Bug fixes, security updates and new platform versions. Annual support is 20% of the setup fee.

Frequently asked

Do we own the code?

Three forms are possible: an operating licence for your own use, a source handover under a contract with a non-disclosure undertaking, and exclusivity in a geographic market or a product category. All three are offered, the choice affects the price, and the final form is settled in the contract.

How long until we are trading?

The platform is ready; the time goes into branding and theme, catalog, the payment gateway and adapting the rules for your market.

Is it only for food?

No. The catalog model — product types, attribute sets, variant families — is general; what is food-specific (allergens, origin, net quantity, deposit) is one attribute set that is swapped for another category. Apparel with size and colour, parts with a technical code, all sit on the same model.

Does it support our country's tax and invoicing rules?

The structure is right for it — invoicing, numbering, corrections and the settlement ledger all live in the domain layer and are swapped per market — but what is implemented today is German and EU law.

How many sellers and products does it handle?

Search runs on Elasticsearch and state on PostgreSQL with a Redis cache; the practical ceiling comes from the infrastructure it is deployed on, not from the architecture.

What does it cost?

Setup starts at 450m toman, with annual support at 20% of the setup fee. The licence form — an operating licence, a source handover, or exclusivity in one market or product category — is agreed in the contract and affects the figure. The final number follows a demo, once the target market, the languages and the gateways are clear.

See the platform working

A live demo on the deployed instance: place a multi-seller order, watch the money split, and look at the invoice and its correction document.

Your target market, the languages you need and the product category — those three answers are enough for a demo and a first estimate.