Skip to content
All work
23E-commerce platform2026

Revive Roots Essentials

A full-stack storefront and back office for hair and skincare — catalogue, cart, checkout, Flutterwave payments, currency-aware pricing, and eight admin panels over eighteen Sequelize models.

18
Sequelize models
32
Frontend pages
17
Controllers
5
Lifecycle emails
Role
Author
Year
2026
Type
E-commerce platform

01Overview

Revive Roots Essentials is an e-commerce platform for premium hair and skincare products: a React storefront over an Express and Sequelize backend on MySQL, with Flutterwave for payments and NodeMailer for the transactional mail the order lifecycle generates.

Eighteen Sequelize models, seventeen controllers, thirty-two frontend pages. The storefront is the visible half; the other half is the back office, which covers products, orders, contacts, shipping fees, inventory, users, coupons and audit logs.

The parts that took the real work were the ones customers only notice when they break: currency-aware pricing, shipping fee quoting, and an order lifecycle that emails the right thing at the right moment — placed, paid, failed, status changed, refunded.

02The problem

Storefronts are easy to start and hard to finish. A product grid and a cart are a weekend. Coupons that interact correctly with shipping quotes, inventory that does not oversell, refunds that reconcile, and an audit log that can answer what an admin changed last Tuesday are the reason e-commerce projects stall at eighty percent.

Selling into Nigeria adds constraints a generic template does not carry: local payment rails rather than card-first checkout, currency-aware pricing, and shipping fees that vary by destination rather than a flat national rate.

Payment failure is the case that matters most and gets tested least. A customer whose payment fails and hears nothing assumes the order succeeded, and the first anyone learns otherwise is a support message.

03Architecture

  1. 01

    Catalogue and inventory

    Products, categories, featured selections and inventory support, with currency-aware pricing so the displayed price is correct for the buyer rather than converted at the last step.

  2. 02

    Cart to order

    Cart, wishlist, checkout, shipping fee quoting and order history — one path from browsing to a placed order, with the fee resolved before payment rather than surprising the customer at the end.

  3. 03

    Payments via Flutterwave

    Flutterwave handles collection, which is what a Nigerian storefront actually needs — local cards, transfers and the rails customers already trust — instead of a card-only checkout that fails for most of the market.

  4. 04

    Order lifecycle email

    Five distinct transactional mails: order placed, payment receipt, payment failed, status update and refund update. The failure mail is the one most storefronts omit and the one that prevents the most support load.

  5. 05

    Back office

    Admin panels for products, orders, contacts, shipping fees, inventory, users, coupons and audit logs, plus contact-form persistence with alerts — so a customer enquiry lands in the system rather than in an inbox.

04Key decisions

Decision 01

Sequelize over a hand-rolled data layer

Eighteen models with real relationships — orders to items to products to inventory — is past the point where hand-written SQL per query stays consistent. Migrations and associations were worth the abstraction here in a way they are not on a three-table service.

Decision 02

Flutterwave rather than card-first

Optimising for the payment method the customer actually holds matters more than optimising for the integration with the best documentation.

Decision 03

Email the failure, not only the success

A payment-failed receipt is an unusual thing to build and a cheap one. It converts a silent failure into a customer who knows to try again.

Decision 04

Audit logs from the start

Admin panels that mutate price, stock and orders need a record of who changed what before the first dispute, not after it.

05Stack

  • React
  • Vite
  • Tailwind CSS
  • Node.js
  • Express
  • Sequelize
  • MySQL
  • Flutterwave
  • NodeMailer