Case study · 2026
Sparrow Market
Multi-vendor marketplace: many independent stores, one cart
A multi-vendor e-commerce platform in Laravel and MySQL. Buyers check out from several stores in one order, sellers run their own catalogue and fulfilment, and an administrator approves stores and moderates the marketplace, in English and Arabic.
- Context
- Personal project
- Year
- 2026
The source code is private.

Overview
A complete marketplace with three roles. Buyers search the catalogue, fill one cart from several stores and check out once; the order is split into one part per store, each with its own payment, progress and cancellation. Sellers manage products, photos and stock, accept, ship and deliver their own parts of orders, and follow their revenue on a dashboard. The administrator approves new stores, suspends accounts, moderates products and watches every order and transaction, and each admin action is written to an audit log.
Server-rendered Blade pages with Alpine.js and fetch keep it fast and simple: the cart, search suggestions, wishlist and notification bell update without reloading. Checkout runs in one database transaction that locks the cart and product rows, so two buyers can never take the last item, and it checks the cart against what the buyer saw. Access control is layered: middleware for roles and account status, policies that answer 404 for other people's records, and validated form requests. The whole interface works in English and Arabic with a mirrored right-to-left layout, in light and dark themes and down to 360 px phones, and passes axe accessibility checks. About 560 Pest tests run on MySQL in GitHub Actions, alongside Larastan and Pint.
Key features
- One checkout across several stores, split into a part per store with its own payment, timeline and cancellation
- Seller centre: multi-photo products re-encoded to WebP, low-stock alerts, order fulfilment, revenue charts and CSV export
- Admin console: store approval, account suspension, product moderation, every transaction and an audit log
- Transactional checkout with row locks against overselling, and a cart fingerprint that refuses stale prices
- Full-text search with live suggestions, shareable filters and reviews only from verified buyers
- English and Arabic with a full right-to-left layout, dark mode, WCAG 2.1 AA and a phone-first layout
- About 560 Pest tests on MySQL, Larastan level 6 and GitHub Actions CI
Architecture
01
Blade + Alpine.js
Server-rendered pages; fetch updates the cart, search and wishlist in place
02
Laravel 13
Routes, middleware, form requests and policies for each role
03
Actions & queries
Checkout, fulfilment and moderation in transactions with row locks
04
MySQL 9.7
Constraints, full-text search and indexes for each screen
- PHP
- Laravel
- MySQL
- Blade
- Alpine.js
- Tailwind CSS
- daisyUI
- Chart.js
- three.js
- Pest
- GitHub Actions
Screens
Select a screenshot to see it larger.
Storefront10 screens
- , open larger image

Home page with a 3D hero, live figures and calls to action - , open larger image

Shop by category, as a photo mosaic - , open larger image

New arrivals, each card with its store, rating and stock - , open larger image

Catalog filtered to Home & Kitchen and sorted by top rated - , open larger image

Live search suggestions while typing - , open larger image

Product page: gallery, stock, quantity, add to cart and wishlist - , open larger image

Rating breakdown and reviews from verified buyers - , open larger image

A store's own page, with only its products - , open larger image

Photo credits for every product image - , open larger image

A not-found page with a way back
Sign-in and sign-up4 screens
- , open larger image

Sign-in, with one-click demo accounts - , open larger image

A store awaiting approval is refused, with the reason - , open larger image

Buyer sign-up - , open larger image

Seller sign-up: open a store for the admin to approve
Buyer14 screens
- , open larger image

Cart grouped by store, with live totals - , open larger image

Added to cart without leaving the page; the badge updates - , open larger image

Checkout: saved addresses, card or cash on delivery, the order by store - , open larger image

Order placed: one order, one part per store - , open larger image

Order history with each store's status - , open larger image

A delivered order: each store's timeline and payment - , open larger image

Rating a product the buyer received - , open larger image

The review, live with a verified-purchase badge - , open larger image

Wishlist with today's prices and stock - , open larger image

Account details, language and password - , open larger image

Address book with one default address - , open larger image

Server-side validation, with a message under each field - , open larger image

Notifications about each order's progress - , open larger image

The notification bell's latest updates
Seller centre9 screens
- , open larger image

Seller dashboard: revenue, orders to fulfil, low stock and rating - , open larger image

Revenue per day, orders by status and best sellers - , open larger image

Products with stock, visibility switches and status tabs - , open larger image

Adding a product - , open larger image

Editing a product and arranging its photos - , open larger image

The store's orders by status, with CSV export - , open larger image

A new order: what to pack, where to send it, accept or cancel - , open larger image

A shipped order, waiting to be marked delivered - , open larger image

New orders and stock alerts for the store
Administration11 screens
- , open larger image

Admin dashboard: revenue, orders, stores awaiting approval - , open larger image

Orders by status, top stores and the latest admin activity - , open larger image

Every buyer and seller, with role and status - , open larger image

A store waiting for approval - , open larger image

Every product from every store, to hide or remove - , open larger image

Every order, with each store's status - , open larger image

An order from three stores, each with its timeline and payment - , open larger image

Transactions: charges, refunds and cash awaiting delivery - , open larger image

Categories in English and Arabic - , open larger image

Editing a category and its icon - , open larger image

The audit log of every admin action
Arabic, dark mode and phones8 screens
- , open larger image

The home page in Arabic, right to left - , open larger image

A product page in Arabic - , open larger image

The admin dashboard in Arabic, charts included - , open larger image

The home page in dark mode - , open larger image

The catalog in dark mode - , open larger image

The seller dashboard in dark mode
, open larger imageOn a phone: home page, product page and cart
, open larger imageOn a phone: an order in Arabic, the catalog in dark Arabic and the seller dashboard