A full-featured marketplace where independent sellers run their own shops, buyers shop across a unified storefront, and admins oversee the entire platform complete with real-time chat, Stripe payments, and seller analytics.
Eshop-MV is a multi-vendor e-commerce marketplace where independent sellers can register their own shops, list products, run promotional events, and manage orders while buyers shop across a single unified storefront with cart, wishlist, checkout, and order tracking.
What sets it apart from a typical single seller store is the three-role architecture: buyers, sellers, and admins each get their own permissions, dashboards, and views over a shared product and order pipeline. The codebase is split into three independently deployable services a REST API, a React client, and a standalone real-time service mirroring how production e-commerce platforms are actually structured.
- Buyer browse, search, wishlist, cart, checkout, track orders, leave reviews
- Seller manage products, events, orders, coupons, and earnings from a dedicated dashboard
- Admin oversee all users, sellers, products, events, and withdrawal requests platform-wide
- Product listings with image uploads via Cloudinary
- Category based search and filtering
- Persistent cart and wishlist (Redux Toolkit)
- Multi-step checkout flow
- Stripe integration for card payments
- Cash on Delivery fallback option
- Orders are only created after payment confirmation β no orphaned/unpaid records
- Live buyer β seller chat powered by a standalone Socket.IO service
- Real-time order notifications pushed to the seller dashboard
- Sales and order tracking
- Coupon and event (flash sale) management
- Withdrawal requests for earnings
- Full visibility into users, shops, products, orders, and payouts
- Seller and content moderation tools
The project is split into three independently deployable services:
βββββββββββββββββββββββββββ
β Client (Browser) β
ββββββββββββββ¬ββββββββββββββ
HTTPS REST β WebSocket
ββββββββββββββββββββ β ββββββββββββββββββββ
β React Frontend ββββββ΄ββββΊβ Socket Server β
β (Vercel) β β (Render) β
ββββββββββ¬ββββββββββ ββββββββββ¬ββββββββββββ
β REST API calls β
βΌ β
ββββββββββββββββββββββββββββββββββββββββββ
β Express Backend API (Render)
β controllers: product Β· shop Β· order Β· user
β payment Β· event Β· coupounCode Β· message
ββββββββββββββ¬βββββββββββββββββββββββββββββ
βΌ
ββββββββββββββββββββββ΄βββββββββββββββββββββ
β MongoDB Atlas Cloudinary Stripe β
β (data) (images) (payments)β
ββββββββββββββββββββββββββββββββββββββββββββββ
Why three services? Serverless platforms like Vercel aren't built to hold persistent WebSocket connections, so the real-time chat/notification layer runs as its own service on a platform that supports long-lived processes, independent of the main API.
|
Backend
|
Frontend
|
|
Real-Time
|
Deployment
|
βββ backend
β βββ config
β βββ controller
β β βββ conversation.js
β β βββ coupounCode.js
β β βββ event.js
β β βββ message.js
β β βββ order.js
β β βββ payment.js
β β βββ product.js
β β βββ shop.js
β β βββ user.js
β β βββ withdraw.js
β βββ db
β β βββ Database.js
β βββ middleware
β β βββ auth.js
β β βββ catchAsyncErrors.js
β β βββ error.js
β βββ model
β β βββ conversation.js
β β βββ coupounCode.js
β β βββ event.js
β β βββ messages.js
β β βββ order.js
β β βββ product.js
β β βββ shop.js
β β βββ user.js
β β βββ withdraw.js
β βββ seed
β βββ uploads
β βββ utils
β β βββ ErrorHandler.js
β β βββ jwtToken.js
β β βββ sendMail.js
β β βββ shopToken.js
β βββ app.js
β βββ multer.js
β βββ package-lock.json
β βββ package.json
β βββ server.js
βββ frontend
β βββ build
β β βββ static
β β β βββ css
β β β β βββ main.b392feb7.css
β β β β βββ main.b392feb7.css.map
β β β βββ js
β β β βββ 453.03346f77.chunk.js
β β β βββ 453.03346f77.chunk.js.map
β β β βββ main.5cef72e3.js
β β β βββ main.5cef72e3.js.LICENSE.txt
β β β βββ main.5cef72e3.js.map
β β βββ asset-manifest.json
β β βββ favicon.ico
β β βββ index.html
β β βββ logo192.png
β β βββ logo512.png
β β βββ manifest.json
β β βββ robots.txt
β βββ public
β β βββ favicon.ico
β β βββ index.html
β β βββ logo192.png
β β βββ logo512.png
β β βββ manifest.json
β β βββ robots.txt
β βββ src
β β βββ Assests
β β β βββ animations
β β β βββ 107043-success.json
β β β βββ 24151-ecommerce-animation.json
β β βββ Assets
β β βββ components
β β β βββ Admin
β β β β βββ Layout
β β β β β βββ AdminSideBar.jsx
β β β β βββ AdminDashboardMain.jsx
β β β β βββ AllEvents.jsx
β β β β βββ AllProducts.jsx
β β β β βββ AllSellers.jsx
β β β β βββ AllUsers.jsx
β β β β βββ AllWithdraw.jsx
β β β βββ Cart
β β β β βββ Cart.jsx
β β β βββ Checkout
β β β β βββ Checkout.jsx
β β β β βββ CheckoutSteps.jsx
β β β βββ Events
β β β β βββ CountDown.jsx
β β β β βββ EventCard.jsx
β β β β βββ Events.jsx
β β β βββ Layout
β β β β βββ AdminHeader.jsx
β β β β βββ DropDown.jsx
β β β β βββ Footer.jsx
β β β β βββ Header.jsx
β β β β βββ Loader.jsx
β β β β βββ Navbar.jsx
β β β βββ Login
β β β β βββ Login.jsx
β β β βββ Payment
β β β β βββ Payment.jsx
β β β βββ Products
β β β β βββ ProductDetails.jsx
β β β β βββ Ratings.jsx
β β β β βββ SuggestedProduct.jsx
β β β βββ Profile
β β β β βββ ProfileContent.jsx
β β β β βββ ProfileSidebar.jsx
β β β β βββ TrackOrder.jsx
β β β βββ Route
β β β β βββ BestDeals
β β β β β βββ BestDeals.jsx
β β β β βββ Categories
β β β β β βββ Categories.jsx
β β β β βββ FeaturedProduct
β β β β β βββ FeaturedProduct.jsx
β β β β βββ Hero
β β β β β βββ Hero.jsx
β β β β βββ ProductCard
β β β β β βββ ProductCard.jsx
β β β β βββ ProductDetailsCard
β β β β β βββ ProductDetailsCard.jsx
β β β β βββ Sponsored.jsx
β β β βββ Shop
β β β β βββ Layout
β β β β β βββ DashboardHeader.jsx
β β β β β βββ DashboardSideBar.jsx
β β β β βββ AllCoupons.jsx
β β β β βββ AllEvents.jsx
β β β β βββ AllOrders.jsx
β β β β βββ AllProducts.jsx
β β β β βββ AllRefundOrders.jsx
β β β β βββ CreateEvent.jsx
β β β β βββ CreateProduct.jsx
β β β β βββ DashboardHero.jsx
β β β β βββ DashboardMessages.jsx
β β β β βββ OrderDetails.jsx
β β β β βββ ShopCreate.jsx
β β β β βββ ShopInfo.jsx
β β β β βββ ShopLogin.jsx
β β β β βββ ShopProfileData.jsx
β β β β βββ ShopSettings.jsx
β β β β βββ WithdrawMoney.jsx
β β β βββ Signup
β β β β βββ Signup.jsx
β β β βββ Wishlist
β β β β βββ Wishlist.jsx
β β β βββ UserOrderDetails.jsx
β β βββ pages
β β β βββ Shop
β β β β βββ ShopAllCoupouns.jsx
β β β β βββ ShopAllEvents.jsx
β β β β βββ ShopAllOrders.jsx
β β β β βββ ShopAllProducts.jsx
β β β β βββ ShopAllRefunds.jsx
β β β β βββ ShopCreateEvents.jsx
β β β β βββ ShopCreateProduct.jsx
β β β β βββ ShopDashboardPage.jsx
β β β β βββ ShopHomePage.jsx
β β β β βββ ShopInboxPage.jsx
β β β β βββ ShopOrderDetails.jsx
β β β β βββ ShopPreviewPage.jsx
β β β β βββ ShopSettingsPage.jsx
β β β β βββ ShopWithDrawMoneyPage.jsx
β β β βββ ActivationPage.jsx
β β β βββ AdminDashboardEvents.jsx
β β β βββ AdminDashboardOrders.jsx
β β β βββ AdminDashboardPage.jsx
β β β βββ AdminDashboardProducts.jsx
β β β βββ AdminDashboardSellers.jsx
β β β βββ AdminDashboardUsers.jsx
β β β βββ AdminDashboardWithdraw.jsx
β β β βββ BestSellingPage.jsx
β β β βββ CheckoutPage.jsx
β β β βββ EventsPage.jsx
β β β βββ FAQPage.jsx
β β β βββ HomePage.jsx
β β β βββ Login.jsx
β β β βββ OrderDetailsPage.jsx
β β β βββ OrderSuccessPage.jsx
β β β βββ PaymentPage.jsx
β β β βββ ProductDetailsPage.jsx
β β β βββ ProductsPage.jsx
β β β βββ ProfilePage.jsx
β β β βββ SellerActivationPage.jsx
β β β βββ ShopCreate.jsx
β β β βββ ShopLoginPage.jsx
β β β βββ SignupPage.jsx
β β β βββ TrackOrderPage.jsx
β β β βββ UserInbox.jsx
β β βββ redux
β β β βββ actions
β β β β βββ cart.js
β β β β βββ event.js
β β β β βββ order.js
β β β β βββ product.js
β β β β βββ sellers.js
β β β β βββ user.js
β β β β βββ wishlist.js
β β β βββ reducers
β β β β βββ cart.js
β β β β βββ event.js
β β β β βββ order.js
β β β β βββ product.js
β β β β βββ seller.js
β β β β βββ user.js
β β β β βββ wishlist.js
β β β βββ store.js
β β βββ routes
β β β βββ AdminRoutes.js
β β β βββ ProtectedAdminRoute.js
β β β βββ ProtectedRoute.js
β β β βββ Routes.js
β β β βββ SellerProtectedRoute.js
β β β βββ ShopRoutes.js
β β βββ static
β β β βββ data.js
β β βββ styles
β β β βββ styles.js
β β βββ App.css
β β βββ App.js
β β βββ App.test.js
β β βββ index.js
β β βββ logo.svg
β β βββ reportWebVitals.js
β β βββ server.js
β β βββ setupTests.js
β β βββ ShopRoutes.js
β βββ package-lock.json
β βββ package.json
β βββ postcss.config.js
β βββ README.md
β βββ tailwind.config.js
β βββ yarn.lock
βββ socket
βββ index.js
βββ package-lock.json
βββ package.json
- Node.js (v16 or higher)
- MongoDB Atlas account (or local MongoDB instance)
- Cloudinary account (for image uploads)
- Stripe account (for payments)
git clone https://github.com/codingwithriha/Eshop-MV.git
cd Eshop-MVcd backend
npm installCreate a .env file inside backend/:
PORT=8000
DB_URL=your_mongodb_connection_string
JWT_SECRET_KEY=your_jwt_secret
JWT_EXPIRES=7d
ACTIVATION_SECRET=your_activation_secret
SMTP_HOST=smtp.gmail.com
SMTP_PORT=465
SMTP_MAIL=your_email@gmail.com
SMTP_PASSWORD=your_gmail_app_password
CLOUDINARY_NAME=your_cloudinary_name
CLOUDINARY_API_KEY=your_cloudinary_key
CLOUDINARY_API_SECRET=your_cloudinary_secret
STRIPE_API_KEY=your_stripe_publishable_key
STRIPE_SECRET_KEY=your_stripe_secret_keynpm run devcd frontend
npm installCreate a .env file inside frontend/:
REACT_APP_BACKEND_URL=http://localhost:8000
REACT_APP_STRIPE_PUBLISH_KEY=your_stripe_publishable_keynpm startcd socket
npm install
node index.jsThe app should now be running locally:
- Frontend β
http://localhost:3000 - Backend API β
http://localhost:8000
| Service | Platform | Notes |
|---|---|---|
| Frontend | Vercel | Set REACT_APP_BACKEND_URL to your deployed backend URL |
| Backend API | Railway | Set root directory to backend, add all .env variables |
| Socket Server | Railway | Set root directory to socket |
| Database | MongoDB Atlas | Whitelist Render's IP or allow access from anywhere |
Note: Environment variables do not carry over from local development to hosted platforms they must be added manually in each service's dashboard.
Buyer: Sign up β Verify email β Browse products β Add to cart/wishlist β Checkout β Pay (Stripe/COD) β Track order β Leave review
Seller: Create shop β Shop activation β Add products/events β Receive order notifications in real time β Update order status β Withdraw earnings
Admin: Log in β Manage users, sellers, products & events β Approve withdrawal requests
- CI/CD pipeline (GitHub Actions) for automated build checks
- Logging & monitoring integration (e.g. Sentry)
- Containerization with Docker for local dev parity
- Unit & integration test coverage
This project is built for educational purposes, based on the Becodemy Multi-Vendor MERN E-commerce tutorial series, and extended independently for deployment and case-study documentation.
Built with β€οΈ by codingwithriha