05 — Elicit Furnishing

A production web app replacing pen-and-paper sales tracking — built for a real furniture retail client who uses it every day.

Elicit Furnishing sales ledger dashboard
Client Elicit Furnishing
Role Designer & Developer
Year 2025
Stack React · Supabase · Vercel · Resend · PWA
74 products tracked by hand across 8 categories — no history, no reports

Every sale on paper. No inventory visibility. No way to know what sold last week.

Every tool she tried bent the business to fit the software. She needed the opposite.

Off-the-shelf options exist — but none could be shaped to her exact product hierarchy, stock logic, or the specific way Elicit Furnishing processes sales. Something built from scratch, around her business, was the only path.

She explained the problem. I built. We iterated from there.

She walked me through how her business works — what she sells, how she restocks, what she needs to know at the end of each week. I built from that. Once it was live and she was using it in her actual business, real edge cases surfaced that no spec could have anticipated. We worked through them one at a time.

Real use revealed what no spec could.

Five systems. One tab. Zero training required.

PostgreSQL, edge functions, and automated email — not just a front-end.

Database

Supabase — PostgreSQL

Three tables with row-level security so the app works without user auth. Five SQL migrations shipped post-launch as Kerzy's needs evolved — adding stock, variants, category splits.

products · sales · settings stock_quantity · variant is_group · low_stock_threshold

Email Automation

Resend + Vercel Cron

Weekly and monthly reports fire on a cron schedule — no manual export, no reminder. Vercel edge functions act as a proxy so the API key never touches the client.

Mon 08:00 UTC → weekly report 1st of month → monthly report POST /api/send-report → Resend

Data Layer

Custom Supabase Client

All DB logic lives in a single db.js module — addSale, deleteSale, restockProduct, setStock, getSalesByDateRange. Stock auto-deducts silently on every sale so logging is never blocked.

addSale() · deleteSale() restockProduct() · setStock() getSalesByDateRange()

Analytics

Recharts — Client-Side

Revenue, order count, daily averages, and best-seller rankings are all computed client-side from already-loaded sales data. No extra API calls for filters or date ranges.

Weekly bar chart Top-10 best sellers Custom date range filter

Auth

Password Gate

Lightweight password gate wraps the entire app — no full auth system needed for a single-operator tool. Stored in localStorage; password lives as a Vercel env var.

VITE_APP_PASSWORD → Vercel localStorage → session persist PasswordGate.jsx → full wrap

Deployment

Vercel — React + Vite

Frontend on Vercel with serverless edge functions in /api for email and cron. Env vars for Supabase keys, Resend key, and app password kept off the client entirely.

React 18 + Vite + Tailwind /api/send-report.js (edge fn) /api/weekly-report.js (cron)

Live. Used every day by the client it was built for.

“He completely exceeded my expectations. Not only did he create exactly what I requested, but he also went above and beyond by incorporating additional features that made the ledger even more useful — particularly when it came to analysing my business data.

Every single request was incorporated, often within just a few hours. He took note of everything and made sure nothing was overlooked, so I never had to worry about reminding him about something I had previously mentioned.

Most importantly, Stephen brought a huge sense of relief to what had previously been one of my biggest bookkeeping struggles. I now have a system that is not only tailored to my business but also makes it much easier to keep track of and understand my data.”

— Kersten Brefo, CEO — Elicit Furnishing