Appearance
Product authoring and moderation
Vendors create and manage their products from the Seller panel, through a purpose-built, guided form — not the Sylius admin product screen. Products remain ordinary Sylius products (they flow through the cart, checkout, search and promotions unchanged); only the authoring experience is tailored to vendors.
What the vendor sees
The product form is deliberately slim. A vendor enters:
- name and description
- a price and a stock quantity
Everything the marketplace operator governs is derived automatically and never shown as a field:
- the product code (auto-generated, unique per vendor),
- the channels the listing belongs to (taken from the vendor's own channels),
- the channel pricing plumbing.
Simple products and variations
By default a product is simple: a single variant, with the price and stock entered inline.
To sell variations (e.g. a size), the vendor assigns one or more of the options the operator has curated (global ProductOptions such as Size) to the product and then generates the variants. The vendor picks from the operator's options — it cannot create new ones. Generating variants produces one variant per option-value combination, each ready to be priced.
Moderation
Every product carries a moderationState, driven by a state machine (graph odiseo_marketplace_product_moderation, initial place draft) and orthogonal to its own enabled visibility flag:
| State | Meaning |
|---|---|
draft | Authored in the seller panel, not yet submitted. Not visible in the shop. |
pending | Submitted, waiting for the operator to review it. |
approved | Cleared for sale. |
rejected | Turned down; the reason is shown to the vendor. |
Transitions: submit (draft, rejected → pending), approve (pending → approved), reject (pending → rejected).
Where a product starts depends on how it was created:
- From the seller panel it starts as a
draft. The vendor edits it freely and submits it when ready. - Any other way (admin, fixtures, API) it is submitted immediately.
And what submitting leads to depends on the vendor:
- a trusted vendor's product is approved automatically,
- everyone else's goes to
pendingfor review.
Editing an already-approved product never sends it back to pending. A rejected product can be fixed and resubmitted; the seller product list shows each product's state, and a rejected one shows its rejection reason.
Shop visibility
A product is only purchasable when all of these hold:
- the product is
enabled, - its
moderationStateisapproved, - its vendor is live — approved, enabled, in at least one channel, and done with onboarding.
Conditions 1–3 minus onboarding are enforced directly in the shop catalogue queries, so listings and product pages filter themselves once the repository traits are in place. Onboarding completeness can't be expressed as a plain SQL filter — a subplugin may register a step the core query knows nothing about — so for a single-product check use the dedicated service instead:
php
<?php
/** @var \Odiseo\SyliusMarketplacePlugin\Product\ProductIsPurchasableInterface $checker */
$checker = $this->container->get('odiseo_marketplace.product.is_purchasable');
$checker->isPurchasable($product); // enabled + approved + vendor fully liveWiring moderation into your application (entity trait, migration, catalogue filtering) is covered in Product moderation.