The Problem

Building a production e-commerce system means stitching together a mobile storefront, an admin dashboard, and a backend API—each with its own auth, payments, and data models. Most templates cover one slice. This repo is a full-stack reference implementation that ties all three together with a shared feature set: cart, orders, reviews, wishlist, addresses, and admin analytics.

What This Does

The repo is a monorepo with three independent apps. mobile/ is a React Native + Expo storefront with Clerk authentication (Google/Apple), Stripe checkout, and product browsing. backend/ is an Express REST API with Mongoose models for user, product, order, cart, and review, plus role-based admin routes. admin/ is a React + Vite dashboard for managing products, orders, and customers, with live stats.

Key architectural choices: the backend uses backend/src/config/inngest.js for background jobs and backend/src/config/cloudinary.js for image uploads. The mobile app uses TanStack Query hooks (mobile/hooks/useCart.ts, useOrders.ts) for data fetching. The admin dashboard is Clerk-protected and talks to the API via admin/src/lib/api.js.

How To Use It

Each app runs independently. The README documents the exact commands, and package.json files confirm npm as the package manager.

Setup: Install dependencies per app. The backend requires a MongoDB connection string, Clerk keys, Stripe keys, Cloudinary credentials, and an Inngest signing key—all set in backend/.env. The admin needs VITECLERKPUBLISHABLEKEY and VITEAPIURL in admin/.env. The mobile app needs EXPOPUBLICCLERKPUBLISHABLEKEY and EXPOPUBLICSTRIPEPUBLISHABLE_KEY in mobile/.env.

Running it: Use the commands from the README:

cd backend && npm install && npm run dev cd admin && npm install && npm run dev cd mobile && npm install && npx expo start

The backend entry point is backend/src/server.js; the admin is admin/src/main.jsx; the mobile app starts at mobile/app/(auth)/index.tsx.

Real-World Use

A small team building a white-label storefront could fork this and replace the seed data in backend/src/seeds/index.js with their catalog. The admin dashboard gives non-technical staff product/order management without touching code. The Stripe webhook handler in backend/src/controllers/payment.controller.js is the integration point for order fulfillment—when a payment succeeds, the order status updates and stock adjusts.

Code Health & Issues

Medium – No test files – No .test. or .spec. files exist. Payment flows, auth middleware, and cart logic are untested. This is a real risk for a payments-enabled app. Medium – No CI/CD pipeline – No .github/workflows, Dockerfile, or CI config. The README mentions Sevalla deployment, but there's no automated build/test gate. Medium – No LICENSE – Usage and redistribution rights are unclear. The fork has 392 stars upstream, so this is likely MIT, but it's not stated. Low – Hardcoded assets – mobile/assets/images/ contains placeholder logos (react-logo, partial-react-logo). These are likely leftovers from the Expo template and should be removed. Low – Typo in hook – mobile/hooks/useAddressess.ts is misspelled. Minor, but it will confuse future maintainers.

The codebase is otherwise well-structured: controllers are separated from routes, models are clean, and the mobile app uses typed hooks consistently.

The Bottom Line

This is a solid, production-shaped reference for a full-stack e-commerce stack. The biggest gaps are the absence of tests and CI, which you should add before running real payments. It's best used as a starting point or learning reference, not as a drop-in production system without hardening.