Architecture Marketplace Multi-Vendeurs Next.js - Stripe Connect, Multi-Tenancy 2026
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 →