Sylius15 min

Sylius Marketplace : creer une marketplace multi-vendeurs

Par Pierre-Arthur Demengel
SyliusMarketplaceMulti-vendeursE-commercePlugin

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 :

  1. 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).
  2. 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.

Questions fréquentes

13 projets livrésGrand-Est & BelgiqueLighthouse >90Disponible immédiatement

Un projet en tête ?

Discutons de votre site web. Réponse garantie sous 24h.

Ou appelez directement :06 95 41 30 25

WhatsApp
Appeler