Naughty Bean Coffee Store
Our own coffee brand's online store, built to retire Shopify.
Naughty Bean Coffee is our own coffee brand, and its store used to run on Shopify. This build replaced it: one Django application serving the marketing site and the shop, with every page, menu, theme colour, product, coupon and shipping rule editable from the admin.
Checkout takes Yoco, PayFast or Stitch, with a simulated gateway when keys are absent so a staging environment works end to end. Live courier rates, waybill bookings and tracking come from The Courier Guy’s API. Order and shipping notifications go out by e-mail and WhatsApp.
It is the reference build for what we mean by an e-commerce site: fast, owned outright, no per-transaction platform fee, and boring to run.
- Full catalogue with options and variants, coupons including free-shipping rules, and an announcement banner.
- Marketing pages, menus, theme colours and blog all edited from the admin, no developer required.
- Cart and checkout with Yoco, PayFast or Stitch, and a simulated gateway when keys are absent so staging works end to end.
- Live courier rates, waybill booking and tracking webhooks from The Courier Guy.
- Order and shipping notifications by e-mail and WhatsApp.
- Customer accounts, order history, newsletter signup and a rule-based FAQ chat widget.
- Address autocomplete with Google Places; uploads converted to WebP automatically.
| Item | Layer | Component |
|---|---|---|
| 01 | Framework | Django 6 |
| 02 | Database | PostgreSQL |
| 03 | Front end | Tailwind CSS v4, HTMX, Alpine.js; storefront derived from the Shopify Dawn layout customers already knew |
| 04 | CMS | django-unfold admin with TinyMCE; pages, menus, banners, theme colours and shipping rules are all editable |
| 05 | Media | Automatic WebP conversion of uploads |
| 06 | Auth | Google sign-in via django-allauth, Cloudflare Turnstile |
| 07 | Hosting | Gunicorn and WhiteNoise on aaPanel, Sentry |
Integrations
Tell us what to build.
A web app, a mobile app, a platform, an integration nobody else wants to touch. Send the brief, we reply with questions, a scope and a price.