Zenvio
Multi-Vendor E-Commerce Marketplace
Zenvio connects buyers with sellers on a single marketplace, built to make discovering products and running a shop feel effortless for everyone involved.
Project overview
Zenvio is a multi-vendor e-commerce platform designed around three roles working together on one marketplace. Buyers browse and purchase products, sellers manage their own shop and orders, and admins oversee the whole platform. The goal was a marketplace where payments are secure, sellers can operate independently, and buyers, sellers, and admins can all communicate directly without leaving the platform.
A marketplace built around three roles
Buyers browse products, save favorites, and track orders. Sellers manage their own shop, products, and order status from a dedicated dashboard. Admins oversee users, sellers, products, and platform-wide activity. Each role gets its own interface rather than one generic view stretched to fit everyone.

Real-time messaging between everyone on the platform
Buyers, sellers, and admins can message each other directly, buyer to seller, buyer to admin, and seller to admin, all in real time through Socket.io. A live online status indicator shows who's currently active, so conversations feel immediate rather than like sending messages into a queue.

A seller dashboard built for running a real shop
Sellers get a dashboard overview, full product and order management, discount codes tied to specific products, refund handling, and shop profile controls, all in one place, so running a shop on Zenvio doesn't require jumping between disconnected tools.

Key features
Multi-role user system
Separate buyer, seller, and admin roles, each with interfaces and permissions matched to what they actually need to do.
Product management and shopping
Grid-based product listings with breadcrumb navigation, a persistent cart, and category-based search and filtering.
Secure payment processing
Stripe checkout sessions with webhook handling, alongside cash on delivery as a fallback option.
Real-time messaging
One-to-one chat between every pair of roles on the platform, with live online status.
Seller dashboard
Product and order management, discount coupons, refund handling, and shop profile updates in one place.
Image handling
Cloudinary-backed uploads for products and chat images, with old images cleaned up automatically on update.
3
User roles
8
API route groups
8
Database collections
1
Real-time channel
Architecture & diagrams
Buyers, sellers, and admins all go through the same React frontend, which talks to an Express API. The backend splits into focused modules for auth, products, orders, messaging, and payments, each reaching MongoDB, Stripe, or Cloudinary as needed.
Challenges & solutions
| Challenge | Solution |
|---|---|
| Image uploading needed a reliable storage strategy. | Started with local folder storage during development, then moved to Cloudinary for production, integrated through Multer's storage manager. |
| Redux state was resetting unexpectedly on page reloads. | Moved the relevant dispatch calls into a useEffect in the app's root component, so state loads consistently on every mount instead of only on the page it was first triggered from. |
| Data sent from the frontend didn't always match the database model shape. | Went back through each API query and aligned the request payloads with the exact Mongoose schema fields, rather than letting mismatches fail silently. |
Best practices
Authentication & security
- HTTP-only JWT cookies to prevent XSS attacks
- Password hashing with bcrypt before storage
- Role-based private routes to prevent unnecessary redirects
Component architecture
- Reusable components for a maintainable folder structure
- Redux reducers and actions for consistent state across the app
- Protected routes for all three roles
Error handling & UX
- React Hot Toast for user-friendly error messages
- Duplicate prevention in cart and wishlist for a smoother experience