EUNICE M. Get in Touch
Back to Projects

Full Stack · E-commerce

TJ Naturals

A production-shaped e-commerce store for a natural skincare business. Nested categories, SKU-level inventory with low-stock thresholds, location-based shipping rates, a custom user model with its own auth backend, payments, and a support chatbot — containerised with Docker Compose.

Django Python Docker Docker Compose Custom User Model PostgreSQL

Demo status: not publicly hosted, but the repository includes a Dockerfile, docker-compose.yml and a product import script, so a full catalogue comes up locally in a couple of commands.

Store capabilities

The model layer is where this project earns its keep — it encodes how a real shop actually operates.

Nested Categories Self-referencing parent
SKU Inventory Unique per product
Low-stock Alerts Per-product threshold
Zone Shipping Location-based rates
Compose Environment Docker Compose stack
Custom Auth Own user model & backend

The Problem

A skincare business selling by direct message hits a ceiling fast: the same questions answered every day, stock tracked in someone's head, and delivery fees negotiated per order. Growth just adds admin.

The store puts the catalogue, inventory, shipping rules and payments into a system, and hands the repetitive questions to a chatbot.

My Role

Sole developer. I designed the catalogue and inventory model, built the storefront and checkout, implemented the custom authentication, added the chatbot, and containerised the whole stack.

  • Catalogue & inventory model
  • Custom user model & auth backend
  • Shipping rate system
  • Payments integration
  • Docker Compose setup

App structure

Four apps and a container setup that brings the whole store up together.

accounts

Custom user model, a dedicated auth backend, forms and signals.

shop

Category, Product, ShippingRate and the storefront views.

payments

Checkout and payment record handling.

chatbot

Support assistant answering repeat product and delivery questions.

import_products.py

Bulk catalogue import, so the store isn't populated by hand.

docker-compose.yml

App and database brought up together, matching production shape.

Engineering decisions

Self-referencing categories

Category.parent points at another category, so the taxonomy nests to any depth without a schema change when the shop reorganises its range.

Inventory that warns before it hurts

Each product carries stock_quantity and low_stock_threshold. Restocking becomes a query the system answers rather than a discovery at the moment of sale.

Shipping as data, not code

ShippingRate holds a fee per location with an active flag and display order. Adding a delivery zone is an admin edit, not a deployment.

Custom user model from day one

Swapping the user model after the first migration is one of Django's genuinely painful migrations. Starting with a custom model plus its own auth backend costs nothing up front.

Merchandising flags on the product

is_bestseller, is_special and is_new_arrival let the shop owner curate the storefront without a developer touching a template.

Compose for parity

The app and its database come up together, so local development runs the same shape as deployment instead of a SQLite approximation.

Run it locally

The fastest way to see it working end to end.

Docker Compose

git clone https://github.com/Eunice-ctrlz/Tj-Naturals.git
cd Tj-Naturals
cp .env.example .env
docker compose up --build

Brings up the app and database together on localhost:8000.

Without Docker

python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python manage.py migrate
python manage.py import_products
python manage.py runserver

The import script populates the catalogue so the store isn't empty.

Want a walkthrough of the code?

I'm happy to talk through the architecture or the decisions above — and I build systems like this for other people too.