NextJS e-Commerce Platform (Storefront & Admin) by Kelvin OhemengNextJS e-Commerce Platform (Storefront & Admin) by Kelvin Ohemeng

NextJS e-Commerce Platform (Storefront & Admin)

Kelvin Ohemeng

Kelvin Ohemeng

What I built

A complete commerce platform, built solo, storefront and admin, no starter kit underneath it. Next.js 15 on the App Router, React 19, TypeScript, Supabase for Postgres and auth.

Checkout, built for how people here actually pay

The payment layer runs on Paystack server-side transaction initialize, hosted checkout, then verification on callback. Currency is GHS, and the enabled channels are card, bank transfer, USSD and mobile money.
That last part is the whole point. A checkout that only takes cards is a checkout that doesn't work for most of the people it's meant to serve. Mobile money isn't a fallback option in Ghana, it's the default, and building for that from the start is different from retrofitting it later.
The order flow holds a pending order in a cookie, redirects to Paystack, and verifies the reference on return before anything is written. Order creation checks for an existing record against the Paystack reference first, so a retried or replayed callback can't produce a duplicate paid order. Orders and their line items are written as a linked pair, with variants preserved per item.

The admin

Order management with customer details, delivery address, order notes, line items carrying price, quantity and variant, and payment and fulfilment status tracked as separate fields rather than collapsed into one.
Admin dashboard order list showing customer email, date, item thumbnails, order status, payment status and order totals
Admin dashboard order list showing customer email, date, item thumbnails, order status, payment status and order totals
Order details panel showing customer, date, items ordered, payment and fulfilment status, order total, customer note, and line items with price, quantity and size
Order details panel showing customer, date, items ordered, payment and fulfilment status, order total, customer note, and line items with price, quantity and size
Product management with image upload and client-side compression, descriptions, price and compare-at price, product type, size options, and stock levels tracked per product.
Admin products table listing products with thumbnail, name, price, available sizes, category tag, published status and stock count
Admin products table listing products with thumbnail, name, price, available sizes, category tag, published status and stock count
Create new product form with fields for name, image upload, description, price, compare price and available stock
Create new product form with fields for name, image upload, description, price, compare price and available stock
Admin routes sit behind middleware that verifies a role on the user's profile record before the route resolves, not a client-side check that hides a button.

Auth

Email and password, plus OAuth through Google and GitHub, on Supabase SSR with cookie-based sessions. Customer and admin authentication are separate paths with separate guards.

The rest of the stack

TanStack Query for server state and TanStack Table for the admin data grids. Zustand for cart and selection state. React Hook Form with Zod for validation. Radix primitives with CVA and Tailwind v4 as a component system rather than ad-hoc styling. Motion for animation. PostHog for analytics.

Why I stopped

Almost all of that time went into the backend and the admin. The storefront, the part anyone actually sees, and the part I care about most, got whatever was left over.
The problem was never difficulty. It was scope. I hadn't decided up front whether I was prepared to give years to this, and I wasn't.

What it became

I cut it down to the one piece I actually wanted.
Shopify already handles inventory, variants, carts, discounts and checkout, there was no reason to rebuild any of it. While there was a way to connect your Shopify store to Framer, I decided to also create mine since I had an interest in it.
A week to a working MVP. A month to the marketplace.
Three months on the version nobody saw. One week on the version people use.
That became anopa, a Shopify-to-Framer plugin, now free, with no product syncing limits.

Why it's still on my profile

Because it's the reason the Framer work holds up. When a client asks whether their store can handle variants, a payment callback that fires twice, or an admin surface their team can actually use, I'm not guessing I've built that layer and know exactly where it gets expensive.
Knowing which layer to build and which to leave to Shopify is most of the job.
Like this project

Posted Aug 15, 2026

A full-stack commerce platform built solo over three months. Next.js 15, React 19, Supabase, and a Paystack checkout built for mobile money and USSD.