Architecture Marketplace Multi-Vendeurs Next.js - Stripe Connect, Multi-Tenancy 2026

Brandon Sueur15 min

Marketplace = Airbnb, Uber, Etsy... modèle platform business.

Complexité :

  • Multi-tenancy (vendeurs isolés)
  • Paiements multi-parties (Stripe Connect)
  • Commission automatique
  • KYC/AML compliance
  • Modération contenu
  • Search/Filters performants

Coût Développement :

Marketplace Type Complexité Coût Dev Durée
Simple (produits physiques) Basse 80-120k€ 16-20 sem
Services (freelance, booking) Moyenne 120-180k€ 20-28 sem
Complex (multi-category, escrow) Élevée 180-300k€ 28-40 sem

Chez HULLI STUDIO, nous construisons marketplaces Next.js complètes :

  • 12 marketplaces livrées (produits, services, rentals)
  • Stack : Next.js + Stripe Connect + PostgreSQL
  • Scale : 500k+ users, 15k+ vendeurs
  • Commission rate : 8-15%

Ce guide détaille architecture multi-tenancy + Stripe Connect + features essentielles.


Architecture Globale

Stack Recommandée

Layer Technologies Raison
Frontend Next.js 15 App Router RSC, performance
Backend Next.js API Routes + tRPC Type-safe API
Database PostgreSQL + Prisma Relationnel, multi-tenant
Auth NextAuth.js Multi-role (admin, vendor, buyer)
Paiements Stripe Connect Splits automatiques
Storage Vercel Blob / S3 Images produits
Search Algolia / Meilisearch Full-text search rapide
Email Resend Transactionnel
Queue Inngest / BullMQ Jobs async (modération, etc.)
Hébergement Vercel Edge, preview deploys

Schema Database

Entités Core :

model User {
  id            String   @id @default(uuid())
  email         String   @unique
  role          Role     @default(BUYER)

  // Relations
  vendorProfile VendorProfile?
  orders        Order[]
  reviews       Review[]
}

enum Role {
  BUYER
  VENDOR
  ADMIN
}

model VendorProfile {
  id                String   @id @default(uuid())
  userId            String   @unique
  user              User     @relation(fields: [userId])

  // Business Info
  businessName      String
  description       String
  logo              String?

  // Stripe Connect
  stripeAccountId   String?  @unique
  stripeOnboarded   Boolean  @default(false)

  // KYC Status
  kycStatus         KYCStatus @default(PENDING)

  // Stats
  totalSales        Decimal  @default(0)
  rating            Decimal  @default(0)
  reviewCount       Int      @default(0)

  // Relations
  products          Product[]
  orders            Order[]
}

model Product {
  id            String   @id @default(uuid())
  vendorId      String
  vendor        VendorProfile @relation(fields: [vendorId])

  // Content
  title         String
  description   String
  price         Decimal
  images        String[]
  category      Category

  // Inventory
  stock         Int      @default(0)

  // Status
  status        ProductStatus @default(DRAFT)
  moderationStatus ModerationStatus @default(PENDING)

  // SEO
  slug          String   @unique

  // Relations
  orderItems    OrderItem[]
  reviews       Review[]
}

model Order {
  id            String   @id @default(uuid())
  buyerId       String
  buyer         User     @relation(fields: [buyerId])
  vendorId      String
  vendor        VendorProfile @relation(fields: [vendorId])

  // Amounts
  subtotal      Decimal
  commission    Decimal
  platformFee   Decimal
  total         Decimal

  // Payment
  stripePaymentIntentId String?

  // Status
  status        OrderStatus @default(PENDING)

  // Relations
  items         OrderItem[]

  createdAt     DateTime @default(now())
}

Stripe Connect Integration

Modèle Paiement

3 Modèles Stripe Connect :

Modèle Contrôle Marketplace Compliance Use Case
Standard Faible Vendeur responsable Marketplace simple
Express Moyen Shared Recommandé général
Custom Total Marketplace responsable Banking-as-service

Recommandation : Express = compromis optimal.


Flow Onboarding Vendeur

Étapes :

  1. Vendeur crée compte (email/password)
  2. Stripe Connect Account créé (backend)
  3. Stripe Onboarding (KYC, bank details)
  4. Validation Documents (Stripe automated)
  5. Vendor Approved → Peut vendre

Code Example :

// app/api/vendor/onboarding/route.ts
import Stripe from 'stripe'
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!)

export async function POST(req: Request) {
  const { userId } = await req.json()

  // 1. Create Stripe Connect Account
  const account = await stripe.accounts.create({
    type: 'express',
    country: 'FR',
    email: vendor.email,
    capabilities: {
      card_payments: { requested: true },
      transfers: { requested: true },
    },
  })

  // 2. Save Stripe Account ID
  await prisma.vendorProfile.update({
    where: { userId },
    data: { stripeAccountId: account.id },
  })

  // 3. Create Onboarding Link
  const accountLink = await stripe.accountLinks.create({
    account: account.id,
    refresh_url: 'https://marketplace.com/vendor/onboarding',
    return_url: 'https://marketplace.com/vendor/dashboard',
    type: 'account_onboarding',
  })

  return Response.json({ url: accountLink.url })
}

Flow Paiement Achat

Process :

  1. Buyer checkout → Crée PaymentIntent
  2. Stripe charge buyer card
  3. Commission split automatique :
    • Vendeur : 85% (transfer vers Stripe Connect Account)
    • Marketplace : 15% (reste sur platform account)
  4. Payout vendeur : automatique (daily/weekly/monthly)

Code Example :

// app/api/checkout/route.ts
export async function POST(req: Request) {
  const { orderId } = await req.json()
  const order = await prisma.order.findUnique({
    where: { id: orderId },
    include: { vendor: true },
  })

  const commissionRate = 0.15 // 15%
  const platformFee = order.subtotal * commissionRate
  const vendorAmount = order.subtotal - platformFee

  // Create PaymentIntent with automatic transfer
  const paymentIntent = await stripe.paymentIntents.create({
    amount: Math.round(order.total * 100), // cents
    currency: 'eur',
    application_fee_amount: Math.round(platformFee * 100),
    transfer_data: {
      destination: order.vendor.stripeAccountId,
    },
    metadata: {
      orderId: order.id,
    },
  })

  return Response.json({ clientSecret: paymentIntent.client_secret })
}

Cashback / Refunds

Refund Process :

// Refund acheteur + reverse transfer vendeur
const refund = await stripe.refunds.create({
  payment_intent: order.stripePaymentIntentId,
  reverse_transfer: true, // ✅ Récupère argent du vendeur
})

Commission Refund : Marketplace rembourse aussi sa commission (goodwill).


Multi-Tenancy

Isolation Données

Principe : Vendeurs ne voient QUE leurs données.

Stratégies :

Stratégie Isolation Complexité Coût Scale
Row-Level Security (RLS) DB rows Faible Faible
Schema Séparé DB schemas Moyenne Moyen
Database Séparée DB per tenant Élevée Élevé

Recommandation : RLS PostgreSQL jusqu'à 10k vendeurs.


Implement RLS Prisma

Approche : Middleware Prisma filter automatique.

// lib/prisma.ts
import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()

// Middleware RLS
prisma.$use(async (params, next) => {
  const { model, action } = params

  // Get user context (from session)
  const session = await getSession()

  // If vendor, filter by vendorId
  if (session?.role === 'VENDOR' && model === 'Product') {
    if (action === 'findMany') {
      params.args.where = {
        ...params.args.where,
        vendorId: session.vendorId,
      }
    }
  }

  return next(params)
})

Résultat : Vendor queries automatiquement filtrées.


Features Essentielles

1. Search & Filters

Challenge : Performance avec 100k+ products.

Solution : Algolia ou Meilisearch.

Solution Coût/Mois Setup Performance
PostgreSQL Full-Text 0€ Facile Lent (> 10k products)
Meilisearch (self-hosted) 20-50€ Moyen Rapide
Algolia 50-500€ Facile Très rapide

Recommandation : Meilisearch (open-source, 10x moins cher Algolia).

Sync Products → Meilisearch :

// lib/search.ts
import { MeiliSearch } from 'meilisearch'

const client = new MeiliSearch({ host: process.env.MEILISEARCH_HOST })

export async function indexProduct(product: Product) {
  const index = client.index('products')
  await index.addDocuments([
    {
      id: product.id,
      title: product.title,
      description: product.description,
      price: product.price,
      category: product.category,
      vendorName: product.vendor.businessName,
    },
  ])
}

2. Modération Contenu

Challenges :

  • Produits interdits (armes, drogues, etc.)
  • Images inappropriées
  • Descriptions spam

Solution : Modération AI + Humaine.

Process :

  1. Vendor crée produit → Status DRAFT
  2. AI Moderation (Google Cloud Vision API) :
    • Détecte nudité, violence, spam
    • Score Safe/Unsafe
  3. If Unsafe → Reject automatique
  4. If Borderline → Queue modération humaine
  5. Admin approuve/rejette
  6. Product StatusPUBLISHED

Cost : Google Vision API = 1,50€/1000 images.


3. Reviews & Rating

Schema :

model Review {
  id        String   @id @default(uuid())
  orderId   String   @unique
  order     Order    @relation(fields: [orderId])
  userId    String
  user      User     @relation(fields: [userId])
  productId String
  product   Product  @relation(fields: [productId])

  rating    Int      // 1-5
  comment   String?
  images    String[]

  createdAt DateTime @default(now())
}

Logique :

  • Review possible SEULEMENT si order completed
  • 1 review max par order
  • Update vendor rating average automatiquement

4. Dispute Management

Flow :

  1. Buyer ouvre dispute (produit non reçu, défectueux)
  2. Vendor notifié (7 jours pour répondre)
  3. Admin arbitre (si pas accord)
  4. Résolution : Refund ou Close dispute

Escrow : Argent bloqué jusqu'à résolution.

Stripe : payment_intent.capture delay (7-30 jours).


KYC & Compliance

Stripe KYC

Stripe Express gère automatiquement :

  • Identité vérification (ID upload)
  • Business verification (SIREN/SIRET France)
  • Bank account verification

Status :

Status Description Can Sell ?
Unverified Onboarding incomplete
Pending Documents soumis, review
Verified KYC approved
Rejected Documents invalides

AML Compliance

Anti-Money Laundering :

  • Transactions > 3k€ → Enhanced Due Diligence
  • Suspicious patterns → Report authorities (TRACFIN France)

Stripe gère automatiquement compliance.


Coûts Développement

Marketplace E-commerce Simple

Features :

  • Multi-vendor
  • Product CRUD
  • Stripe Connect
  • Search (Meilisearch)
  • Reviews
  • Modération basique
  • Admin dashboard
Poste Durée Coût
Architecture + Setup 2 sem 8k€
Auth Multi-Role 1 sem 4k€
Vendor Onboarding (Stripe) 2 sem 9k€
Product Management 3 sem 14k€
Search (Meilisearch) 1 sem 5k€
Checkout + Payments 3 sem 15k€
Reviews 1 sem 5k€
Modération 2 sem 10k€
Admin Dashboard 3 sem 14k€
UI/UX Design 4 sem 18k€
Testing 2 sem 8k€
Contingence 10% 11k€
Total 24 sem 121k€

Infra/An : 3,6k€ (Vercel Pro + Meilisearch + Stripe fees)


Cas Client : Marketplace Artisanat

Contexte

Marketplace : Produits artisanaux français
Objectif : Airbnb de l'artisanat
Budget : 135k€

Features :

  • Multi-vendeurs (artisans)
  • Produits physiques + virtuels (ateliers)
  • Stripe Connect (commission 12%)
  • Modération AI + humaine
  • Search Algolia

Exécution - 28 Semaines

Équipe :

  • 1 Tech Lead
  • 2 Devs Full-Stack
  • 1 Designer UI/UX

Stack :

  • Next.js 15 + TypeScript
  • PostgreSQL + Prisma
  • Stripe Connect Express
  • Algolia Search
  • Google Vision API (modération)
  • Vercel

Résultats - 12 Mois

Traction :

KPI Launch Mois 6 Mois 12
Vendors 28 145 520
Products 180 2 400 8 600
Users 850 12k 45k
GMV/Mois 8k€ 68k€ 285k€
Commission (12%) 960€ 8,2k€ 34,2k€

Unit Economics (Mois 12) :

Métrique Montant
GMV/Mois 285k€
Commission 12% 34,2k€
Costs :
- Infra 450€
- Support 2,5k€
- Marketing 8k€
Profit 23,2k€/mois

Levée Seed (Mois 14) : 2,1M€ (valorisation 12M€).

"Architecture multi-tenancy + Stripe Connect ont permis scale rapide. 520 vendors onboardés sans friction. Commission splits automatiques = 0 comptabilité manuelle." - CEO


Checklist Lancement

MVP Marketplace

Must-Have :

  • Auth multi-role (buyer, vendor, admin)
  • Vendor onboarding Stripe Connect
  • Product CRUD vendors
  • Search + filters
  • Checkout + Stripe payments
  • Commission automatic splits
  • Order management
  • Basic reviews
  • Admin modération
  • Vendor dashboard (sales, payouts)

Nice-to-Have (V1.1) :

  • Modération AI
  • Dispute management
  • Advanced analytics vendors
  • Email marketing (Resend campaigns)
  • Multi-currency

Conclusion

Marketplace = modèle business puissant (network effects).

Complexité Technique :

  • Multi-tenancy (RLS)
  • Stripe Connect (onboarding, splits, payouts)
  • KYC compliance
  • Search performant (Algolia/Meilisearch)
  • Modération (AI + humaine)

Coût : 80-180k€ selon complexité
Durée : 20-32 semaines

Chez HULLI STUDIO, nous construisons marketplaces Next.js complètes :

  • 12 marketplaces livrées (produits, services, rentals)
  • Stack Stripe Connect + PostgreSQL multi-tenant
  • Scale 500k+ users, 15k+ vendeurs
  • Commission tracking automatique
  • Budget moyen : 125k€

Vous lancez marketplace ?
Architecture + Budget Marketplace →

30 minutes = Analyse use case + Archi recommandée + Budget précis.


HULLI STUDIO - Experts Marketplace
Next.js • Stripe Connect • Multi-Tenancy
12 Marketplaces Scale
Amiens • Interventions France
Lancez votre marketplace →


Ressources Complémentaires

Articles Connexes

Documentation