← All templates

Multi-vendor Marketplace

E-commerce · React + Node (Express) · 19 @molecule/* packages

Etsy-like marketplace with vendor management, commissions, and payouts — with built-in Stripe-backed subscription tiers

Open in Molecule

What is inside

  • auth
  • search
  • payments
  • notifications
  • image-upload
  • permissions
  • subscriptions

Screens (20)

  • Landing /
  • Login /login
  • Signup /signup
  • ForgotPassword /forgot-password
  • ResetPassword /reset-password
  • Catalog /catalog
  • ProductDetail /products/:id
  • VendorStorefront /vendors/:slug
  • Cart /cart (signed in)
  • VendorDashboard /vendor/dashboard (signed in)
  • Orders /orders (signed in)
  • Settings /settings (signed in)
  • Checkout /checkout (signed in)
  • OrderDetail /orders/:id (signed in)
  • VendorProducts /vendor/products (signed in)
  • VendorProductForm /vendor/products/new (signed in)
  • VendorOrders /vendor/orders (signed in)
  • VendorPayouts /vendor/payouts (signed in)
  • Notifications /notifications (signed in)
  • VendorOnboarding /vendor/apply

Data model (16 tables)

  • cart_items — id, user_id, cart_id, product_id, variant_id, quantity, unit_price, name, …
  • carts — id, user_id, coupon, created_at, updated_at, updatedAt
  • commissions — id, user_id, vendor_id, order_id, amount, payout_amount, status, payout_id, …
  • devices — id, createdAt, updatedAt, userId, name, pushPlatform, pushSubscription, hasPushSubscription
  • inventory — id, product_id, available, reserved, reason, created_at, updated_at, updatedAt
  • inventory_movements — id, product_id, delta, reason, created_at
  • inventory_reservations — id, product_id, user_id, quantity, expires_at, created_at
  • notifications — id, user_id, type, payload, read_at, created_at
  • order_events — id, order_id, status, metadata, created_at
  • order_items — id, order_id, product_id, vendor_id, variant_id, quantity, unit_price, name, …
  • orders — id, buyer_id, user_id, vendor_id, status, subtotal, commission, vendor_payout, …
  • payments — id, createdAt, updatedAt, userId, transactionId, productId, platformKey, data, …
  • payouts — id, vendor_id, user_id, total, currency, status, stripe_payout_id, created_at, …
  • products — id, vendor_id, user_id, name, slug, description, price, currency, …
  • reviews — id, user_id, product_id, vendor_id, rating, title, body, status, …
  • vendors — id, user_id, name, slug, description, logo, banner_url, bank_account, …

API (10 handlers)

  • \_seed api/src/handlers/_seed.ts
  • cart api/src/handlers/cart.ts
  • commissions api/src/handlers/commissions.ts
  • notifications api/src/handlers/notifications.ts
  • orders api/src/handlers/orders.ts
  • products api/src/handlers/products.ts
  • profile api/src/handlers/profile.ts
  • reviews api/src/handlers/reviews.ts
  • storefront api/src/handlers/storefront.ts
  • vendors api/src/handlers/vendors.ts

Subscription tiers

free / pro / team — gated by: maxCommissions, maxOrders, maxProducts, maxReviews, maxVendors, advancedFeatures, canExport, retentionDays

Built from 19 @molecule/* packages

Browse all @molecule/* packages →

Required secrets

  • DATABASE_URL PostgreSQL connection string
  • STRIPE_SECRET_KEY Stripe secret API key
  • STRIPE_PUBLISHABLE_KEY Stripe publishable key
  • STRIPE_WEBHOOK_SECRET Stripe webhook signing secret
  • MEILISEARCH_API_KEY MeiliSearch admin API key
  • S3_BUCKET S3 bucket for product images
  • AWS_ACCESS_KEY_ID AWS access key for S3
  • AWS_SECRET_ACCESS_KEY AWS secret key for S3
  • MAILGUN_API_KEY Mailgun API key
  • MAILGUN_DOMAIN Mailgun sending domain

The @molecule/* packages are Apache-2.0. The app you build from this template is yours to export and self-host. Licensing