Multi-vendor marketplace
Launch a marketplace where sellers are first-class
Vendors are sellers on your store, not brands on a product. A new seller arrives pending and is approved or suspended by you — because a marketplace that lists whoever signs up is not moderating, it is hosting whatever turns up.
- core/vendors.go vendors, offers, states
- core/vendor_accounts.go a seller's own login
- 3 vendor states, 2 offer states
A seller's path through the engine
- Pending is a seller who has arrived and not been let in. Nothing of theirs shows.
- Approved is a seller the storefront will show. Their offers can go active.
- Suspended keeps the row, the history and the offers, and stops the storefront showing them.
- An offer is one vendor's price and stock for one variant, active or paused, one per vendor per variant.
- Stock on an offer is on-hand and reserved, so two shoppers cannot both buy the last one.
VendorStatus: pending · approved · suspended — OfferStatus: active · paused
Seller signs up
state: pending
you review
Approved
may list offers — or suspended, reversibly
publishes
Vendor offer
own price, own stock, on your catalogue entry
customer buys
Order
priced and stocked from the offer
What a vendor is
The record, the login and the rate — each a real field, none a placeholder.
- A recordSlug, name, legal name, email, phone, website, about, a logo, an address for the invoice and for tax, a tax id.
- A login of their ownSame table, hashing, sessions and rights as every operator. What differs is a scope: role vendor, pointing at their vendor.
- A commission rateIn basis points on the vendor — 250 is 2.5%. Recorded on the record, not settled by the engine.
- Offers, one per variantTheir price and their stock against your catalogue entry, with their own active or paused state.
- Moderation in the engineA state machine in core, enforced on write — not a checkbox in a theme.
- Admin screensVendors and their offers are managed on the same admin, on the same API, with the same 52 rights.
Where the edge is
Two gaps a marketplace will meet early. Both are named so nobody discovers them in production.
Commission is recorded, not settled
The rate lives on the vendor. There is no payout ledger, no settlement run and no statement. Paying sellers means computing it from orders yourself.
The order line does not yet carry the seller
A line is priced and stocked from an offer, but the vendor is not written onto the order. Per-seller fulfillment and payout reports need that, and it is not there.
No seller-facing storefront
A vendor's login is to the admin, scoped to their records. A separate seller portal is a client you would build on the same API.
FAQ
Questions about marketplaces
How does a seller get onto the marketplace?
A vendor record is created — by you, or by their own sign-up — and starts pending. Nothing of theirs is shown until you approve it. Suspending keeps the row, the history and the offers, and stops the storefront showing them; it is reversible in a way that deleting is not.
What does a vendor actually own?
A vendor record with a slug, legal name, contact details, an address for the invoice and for tax, a tax id and a commission rate; a login of their own; and offers. An offer is one vendor’s price and stock for one variant of your catalogue, with its own active or paused state and its own reserved-versus-on-hand stock.
Can several sellers sell the same product?
Yes. That is what an offer is: several vendors, one catalogue entry, each with their own price and stock. The unique constraint is one offer per vendor per variant, so a seller cannot list the same thing twice.
What does a vendor see when they log in?
Only what is theirs. A vendor account uses the same login table, password hashing, sessions and rights machinery as every other operator — a second identity system would be a second place for a login bug to live — and what makes it a vendor account is a scope, not a right: the role is vendor and the row points at their vendor.
Is commission paid out automatically?
No. Each vendor carries a commission rate in basis points — 250 is 2.5% — and it is recorded, not settled. There is no payout ledger and no settlement run. A marketplace that pays its sellers needs to compute that from orders itself, today.
Does an order know which seller it belongs to?
Not yet. Offers carry the seller, and a line bought from an offer is priced and stocked from that offer, but the order line does not yet record the vendor. This is the most visible gap for a marketplace and it is named here rather than left for you to find.
Sellers are rows. Moderation is a state.
Run the stack, create a vendor from the admin, approve it, and list an offer against a variant from the API docs.