Loading0%
Back to portfolio

Zenvio

Multi-Vendor E-Commerce Marketplace

ReactRedux ToolkitNode.jsExpress.jsMongoDBSocket.ioStripeCloudinaryJWTVercel

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.

A marketplace built around three roles

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.

Real-time messaging between everyone on the platform

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.

A seller dashboard built for running a real shop

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

ChallengeSolution
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