Sylius Marketplace : creer une marketplace multi-vendeurs
Les marketplaces dominent le e-commerce mondial. Amazon, Cdiscount, ManoMano - le modele multi-vendeurs s'est impose comme la reference. Si vous envisagez de creer votre propre marketplace de niche, Sylius est un choix technique particulierement pertinent. Son architecture ouverte permet de construire exactement le modele de marketplace dont vous avez besoin, sans les limitations des solutions SaaS.
Pourquoi Sylius pour une marketplace ?
Creer une marketplace n'est pas un projet anodin. C'est l'un des types de plateforme e-commerce les plus complexes, car vous devez gerer trois types d'utilisateurs (acheteurs, vendeurs, administrateurs), des flux financiers complexes et une logistique multi-sources. Le choix de la bonne fondation technique est donc critique.
Sylius presente plusieurs avantages decisifs pour ce type de projet :
- Architecture decouplable : chaque composant (catalogue, commande, paiement, expedition) peut etre etendu independamment
- Systeme de channels : la brique native multi-canal facilite la separation des contextes vendeurs
- API Platform : l'API headless permet de construire des interfaces vendeurs et acheteurs separees
- Symfony ecosystem : acces a tout l'ecosysteme Symfony (Messenger pour les queues, Workflow pour les machines a etats, Mailer pour les notifications)
- Open source : pas de frais de licence par transaction, contrairement aux solutions SaaS marketplace
Architecture d'une marketplace Sylius
L'architecture d'une marketplace comporte plusieurs couches distinctes. Voici le schema global que je recommande pour un projet de taille moyenne.
Le modele de donnees
Au coeur de la marketplace, l'entite Vendor represente un vendeur. Elle est liee aux produits, aux commandes et au systeme de commission.
// src/Entity/Vendor/Vendor.php
namespace App\Entity\Vendor;
use Doctrine\ORM\Mapping as ORM;
use Sylius\Component\Resource\Model\ResourceInterface;
#[ORM\Entity]
#[ORM\Table(name: 'app_vendor')]
class Vendor implements ResourceInterface
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
private string $companyName;
#[ORM\Column(length: 255, unique: true)]
private string $slug;
#[ORM\OneToOne(targetEntity: ShopUser::class)]
private $user;
#[ORM\Column(type: 'string', length: 20)]
private string $status = 'pending'; // pending, verified, suspended
#[ORM\Column(type: 'decimal', precision: 5, scale: 2)]
private string $commissionRate = '15.00';
#[ORM\Column(type: 'json')]
private array $bankDetails = [];
#[ORM\OneToMany(targetEntity: Product::class, mappedBy: 'vendor')]
private Collection $products;
#[ORM\Column(type: 'text', nullable: true)]
private ?string $description = null;
// getters, setters...
}
Le split de commande
Quand un acheteur commande des produits de plusieurs vendeurs, la commande doit etre eclatee en sous-commandes (une par vendeur). C'est le "order splitting". Chaque sous-commande suit son propre cycle de vie pour l'expedition.
// src/OrderProcessor/VendorOrderSplitter.php
namespace App\OrderProcessor;
use Sylius\Component\Order\Processor\OrderProcessorInterface;
final class VendorOrderSplitter implements OrderProcessorInterface
{
public function process(OrderInterface $order): void
{
$itemsByVendor = [];
foreach ($order->getItems() as $item) {
$vendor = $item->getProduct()->getVendor();
$vendorId = $vendor?->getId() ?? 'platform';
$itemsByVendor[$vendorId][] = $item;
}
// Creer ou mettre a jour les sous-commandes
foreach ($itemsByVendor as $vendorId => $items) {
$subOrder = $this->findOrCreateSubOrder($order, $vendorId);
$subOrder->clearItems();
foreach ($items as $item) {
$subOrder->addItem(clone $item);
}
$this->calculateCommission($subOrder);
}
}
}
Le plugin BitBag Multi-Vendor Marketplace
Plutot que de tout developper from scratch, le plugin BitBag SyliusMultiVendorMarketplacePlugin offre une base solide. Il fournit :
- Entite Vendor avec inscription et verification
- Tableau de bord vendeur (gestion produits, commandes, statistiques)
- Systeme de commission configurable
- Split de commandes automatique
- Gestion des expeditions par vendeur
- Conversations vendeur-acheteur
composer require bitbag/multi-vendor-marketplace-plugin
Attention cependant : le plugin couvre les fondamentaux mais necessite presque toujours des adaptations pour un projet reel. Les aspects paiement split, gestion des litiges et reporting avance necessitent du developpement sur mesure.
Systeme de commissions
Le modele economique de votre marketplace repose sur les commissions. Plusieurs modeles sont possibles :
- Commission fixe : un pourcentage identique pour tous les vendeurs (ex: 15%)
- Commission par categorie : un taux different selon la categorie de produit
- Commission par palier : le taux diminue quand le volume de vente augmente
- Commission hybride : pourcentage + montant fixe par transaction
- Abonnement + commission reduite : les vendeurs paient un abonnement mensuel en echange d'un taux reduit
// src/Commission/CommissionCalculator.php
namespace App\Commission;
final class CommissionCalculator
{
public function calculate(SubOrder $subOrder): int
{
$vendor = $subOrder->getVendor();
$category = $subOrder->getPrimaryCategory();
// Chercher un taux specifique par categorie
$rate = $this->rateRepository->findByVendorAndCategory($vendor, $category);
if (null === $rate) {
$rate = $vendor->getDefaultCommissionRate();
}
// Appliquer les paliers de volume
$monthlyVolume = $this->statsService->getMonthlyVolume($vendor);
$adjustedRate = $this->applyVolumeTiers($rate, $monthlyVolume);
$subtotal = $subOrder->getItemsTotal();
return (int) round($subtotal * ($adjustedRate / 100));
}
}
Paiement split avec Stripe Connect
Le paiement est le nerf de la guerre d'une marketplace. La solution la plus repandue est Stripe Connect en mode "destination charges". Le principe : le client paie en une seule transaction sur le compte Stripe de la marketplace, et Stripe transfere automatiquement la part de chaque vendeur.
// src/Payment/StripeConnectPaymentProcessor.php
namespace App\Payment;
use Stripe\StripeClient;
final class StripeConnectPaymentProcessor
{
public function processMarketplacePayment(Order $order): void
{
$subOrders = $order->getSubOrders();
// Creer un PaymentIntent avec transfert automatique
$paymentIntent = $this->stripe->paymentIntents->create([
'amount' => $order->getTotal(),
'currency' => strtolower($order->getCurrencyCode()),
'payment_method' => $order->getPaymentMethodNonce(),
'transfer_group' => $order->getNumber(),
'confirm' => true,
]);
// Creer les transferts vers chaque vendeur
foreach ($subOrders as $subOrder) {
$vendor = $subOrder->getVendor();
$vendorAmount = $subOrder->getTotal() - $subOrder->getCommission();
$this->stripe->transfers->create([
'amount' => $vendorAmount,
'currency' => strtolower($order->getCurrencyCode()),
'destination' => $vendor->getStripeAccountId(),
'transfer_group' => $order->getNumber(),
]);
}
}
}
Pour les marketplaces basees en Europe, des alternatives a Stripe Connect existent : Mangopay, Lemonway ou Adyen for Platforms. Elles offrent des avantages en matiere de conformite europeenne et de KYC.
Le tableau de bord vendeur
Chaque vendeur a besoin d'une interface pour gerer son activite. Les fonctionnalites essentielles :
- Gestion du catalogue : ajout, modification et suppression de produits avec workflow de moderation
- Suivi des commandes : visualisation des commandes, mise a jour des statuts, generation des bons de livraison
- Statistiques : chiffre d'affaires, nombre de commandes, produits les plus vendus, taux de conversion
- Facturation : historique des commissions prelevees, releves de paiement, factures de commission
- Messagerie : communication avec les acheteurs pour le SAV
- Parametres : informations entreprise, coordonnees bancaires, politique de retour
L'approche recommandee est de construire ce panel vendeur en SPA (React, Vue) communiquant avec l'API Platform de Sylius, securisee par un firewall dedie.
Moderation et qualite
La qualite du catalogue est l'un des plus grands defis d'une marketplace. Sans moderation, les vendeurs peuvent publier des produits de mauvaise qualite, des descriptions incorrectes ou des photos inadequates.
Implementez un workflow de moderation des produits :
# config/packages/workflow.yaml
framework:
workflows:
product_moderation:
type: state_machine
marking_store:
type: method
property: moderationState
supports:
- App\Entity\Product\Product
initial_marking: draft
places:
- draft
- pending_review
- approved
- rejected
transitions:
submit:
from: draft
to: pending_review
approve:
from: pending_review
to: approved
reject:
from: pending_review
to: rejected
revise:
from: rejected
to: draft
Logistique multi-vendeurs
La logistique est un autre defi majeur. Deux modeles principaux s'offrent a vous :
- Expedition par le vendeur (dropshipping) : chaque vendeur expedie ses produits directement au client. Plus simple a mettre en place mais l'experience client est morcelee (plusieurs colis, plusieurs suivis).
- Fulfillment centralise : les vendeurs envoient leur stock dans un entrepot centralise qui gere l'expedition. Meilleure experience client mais infrastructure lourde.
La plupart des marketplaces debutent avec le modele d'expedition par le vendeur, puis evoluent vers un modele hybride au fur et a mesure de leur croissance.
Les aspects juridiques a ne pas negliger
En France et en Belgique, l'operateur d'une marketplace a des obligations legales specifiques :
- Verification de l'identite des vendeurs professionnels (KYC)
- Information claire sur l'identite du vendeur pour chaque produit
- Gestion du droit de retractation (14 jours en B2C)
- Conformite a la directive Omnibus (transparence des avis, prix barres)
- Declaration des revenus des vendeurs au fisc (directive DAC7 en Europe)
- Respect du RGPD pour les donnees des vendeurs et acheteurs
Conclusion et estimation budgetaire
Construire une marketplace est un projet ambitieux qui necessite une vision claire et un budget adequat. Voici un ordre de grandeur :
- MVP (3-4 mois) : inscription vendeurs, catalogue partage, commissions basiques, paiement Stripe Connect - 25 000 a 40 000 euros
- V1 complete (6-8 mois) : moderation, tableau de bord vendeur avance, reporting, gestion des litiges, logistique - 50 000 a 80 000 euros
- Plateforme mature (12+ mois) : fulfillment, programme fidelite, app mobile, IA recommandations - 80 000+ euros
L'avantage de Sylius est de pouvoir demarrer avec un MVP fonctionnel et iterer rapidement. Vous n'avez pas besoin de tout construire des le premier jour.
Vous avez un projet marketplace en tete ? Discutons-en. Je vous accompagne de la conception a la mise en production, en passant par le choix des briques techniques et l'architecture. Consultez mes services de developpement Sylius pour en savoir plus.
