Architecture Marketplace Multi-Vendeurs Next.js - Stripe Connect, Multi-Tenancy 2026
Marketplace Next.js : architecture multi-tenancy, Stripe Connect (splits auto, KYC), modération AI, escrow. 80-150k€ dev, scale 1M+ users.
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 |
| 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 :
- Vendeur crée compte (email/password)
- Stripe Connect Account créé (backend)
- Stripe Onboarding (KYC, bank details)
- Validation Documents (Stripe automated)
- 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 :
- Buyer checkout → Crée PaymentIntent
- Stripe charge buyer card
- Commission split automatique :
- Vendeur : 85% (transfer vers Stripe Connect Account)
- Marketplace : 15% (reste sur platform account)
- 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 :
- Vendor crée produit → Status
DRAFT - AI Moderation (Google Cloud Vision API) :
- Détecte nudité, violence, spam
- Score Safe/Unsafe
- If Unsafe → Reject automatique
- If Borderline → Queue modération humaine
- Admin approuve/rejette
- Product Status →
PUBLISHED
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 :
- Buyer ouvre dispute (produit non reçu, défectueux)
- Vendor notifié (7 jours pour répondre)
- Admin arbitre (si pas accord)
- 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
Brandon Sueur
Expert en développement web et création de produits numériques. Passionné par les technologies modernes et l'innovation, je partage mes connaissances et retours d'expérience pour aider les équipes à construire de meilleurs produits.
Articles similaires
Découvrez d'autres articles qui pourraient vous intéresser.
Accessibilité RGAA 2026 - Guide Conformité, SEO +18%, Business Case ROI
RGAA 2026: Conformité légale obligatoire, SEO +18%, marché +1.2M visiteurs/an. Audit 8-25k€, ROI 18 mois via trafic + conversions.
Tests E2E avec Playwright en 2026 : Pourquoi nous avons abandonné Cypress
Playwright s'impose comme la référence des tests end-to-end en 2026. Découvrez pourquoi nous avons migré depuis Cypress, comment démarrer avec Playwright et nos patterns de tests avancés.
Refonte Site Legacy vers Next.js - Migration 0 Downtime, Stratégie Strangler Fig 2026
Refonte site legacy vers Next.js - Migration progressive 0 downtime. Strangler Fig pattern, proxy routing, budget 40-120k€. -60% coûts maintenance.