KRIYA
Full-stack furniture e-commerce with an AI support chatbot
Drag to rotate
KRIYA is a single-vendor, IKEA-style furniture store built for the Indonesian market. Customers browse flat-pack furniture room by room, pick a color or size variant, and check out with a shipping quote and coupon before paying through Midtrans. Behind the storefront, an admin panel runs the whole shop — catalog, inventory, orders, shipping, promotions, reviews, returns, and sales reports — and an AI chatbot answers questions from a store knowledge base. I built it solo across the stack: a Next.js storefront and admin panel, a Go REST API, and a Supabase Postgres database. It's a demo project, so the catalog is synthetic and payments run on the Midtrans Sandbox.


A storefront you browse room by room
The home page opens on an editable hero slider and points straight into rooms — living room, workspace, bedroom — instead of an endless product list. Each category page carries price-range, sale, and in-stock filters with sorting, and a language switcher flips both the interface and the product content between Indonesian and English.

Product pages built around variants
Every product opens into a gallery, color and size variants with their own stock, dimensions, weight, materials, and assembly notes, alongside ratings and reviews from verified buyers. Prices — including scheduled sale prices — always come from the API, so what the page shows is exactly what checkout will charge.


From cart to a paid order
A guest cart merges into the account on sign-in, and the server recalculates prices and validates stock on every change. Checkout combines the address book, zone-based shipping rates, and coupon codes into one deterministic quote, then hands off to Midtrans Snap with a payment deadline. Customers follow each order from pending to completed, can pay again before the deadline, print an invoice, leave a review, or request a return.

An admin dashboard that shows what needs doing
The admin home summarizes net sales, paid orders, average order value, and new customers against the previous period, with a daily sales trend, order-status and category breakdowns, and best sellers. A "needs attention" queue surfaces what to act on next — orders to ship, pending payments, low stock, reviews to moderate, and open returns.


Inventory and fulfillment you can audit
Stock is tracked per variant and SKU, and every change — a reservation at checkout, a release on expiry, a manual adjustment — is written to a stock ledger with its history one click away. On the order side, staff move orders through their status transitions, record the courier and tracking number, and keep internal notes.


Promotions and reports in the same panel
Coupons come in percentage, fixed-amount, and free-shipping flavors, each with usage limits and a redemption log. Reports cover a sales summary, time series, and top products, with CSV export for anything that needs to leave the panel.

An AI support chatbot, wired in n8n
Every chat message runs through an n8n workflow: payload validation, Supabase JWT verification, and a per-user rate limit in Postgres before an AI agent ever sees it. The agent can search, inspect, and sort products through a read-only database role, query a bilingual knowledge base of FAQs, policies, and assembly guides with full-text and trigram search, and check order status through an internal API endpoint — with a safe fallback reply if anything fails. The chatbot is still in progress.
My role
- 01Built the bilingual (ID/EN) storefront in Next.js 16 and React 19 — catalog, product detail, cart, checkout, orders, and after-sales
- 02Designed a Go (Gin) REST API that owns every business rule, split into one package per domain behind a shared JSON envelope
- 03Integrated Midtrans Snap with signature-verified webhooks, stock reservation, and automatic expiry of unpaid orders
- 04Built the admin panel — dashboard, catalog, inventory ledger, orders, shipping, coupons, reports, reviews, and returns
- 05Modeled the schema in Supabase Postgres with forward-only SQL migrations, plus Supabase Auth for email and Google sign-in
- 06Wired an n8n AI chatbot that searches a bilingual knowledge base and looks up order status through an internal API
- 07Covered the main flows with Go unit tests and Playwright end-to-end tests
One API owns the business rules
The Next.js app uses Supabase only for sign-in, sessions, and admin image uploads; everything else goes through the Go API with the user's JWT. That API owns the catalog, cart, checkout quotes, orders, inventory reservations, coupons, after-sales, and reports, each in its own package. The schema lives in forward-only SQL migrations rather than ORM auto-migration, and the whole codebase forbids untyped escape hatches — no any in TypeScript, no interface{} in Go payloads.
Payments that can't drift out of sync
Placing an order reserves stock and creates a Midtrans Snap transaction in one step. When Midtrans calls back, the API verifies the SHA-512 signature before touching the order, and a background sweeper expires unpaid orders past their deadline and releases the reserved stock. The result is a checkout where inventory, order status, and payment always agree — even when a customer walks away mid-payment.