Business website + admin system
Timeless Ties Events & Decor
Wedding and event décor website with an inquiry flow and client quotation links, backed by an admin system for sales, bookings, operations, finance and website content.
- My role
- Built the public website, the admin system, the inquiry workflow and the Supabase backend, and set up deployment and the custom domain.
- Client
- Timeless Ties Events & Decor, a wedding and event décor company in Kathmandu
- Status
- Public site live, admin in active development
- Stack
- Next.js
- React
- TypeScript
- Tailwind CSS
- Supabase
- PostgreSQL
- Drizzle ORM
- Zod
- React PDF
- Resend
- Vercel

Overview
Timeless Ties Events & Decor creates wedding and event décor in Kathmandu. The project combines a public website with an admin system that covers the business from first inquiry to final payment.
The public website is live on the company’s domain. The admin system is built and still in active development and testing.
Who it serves: Couples and families planning weddings and celebrations, and the company’s team, who manage leads, quotations, bookings, events and finances.
The problem
An events business tracks a lot of information for each celebration: the inquiry, the quotation and its revisions, the advance payment, the event day plan, stock, vendors and staff. The project brings all of it into one system, connected to the public website where inquiries begin.
My contribution
- Built the public pages: Home, About, Services, Catalogue & price list, Gallery, Contact and Inquiry.
- Built the admin modules for sales, quotations, bookings and events, operations, finance and website content.
- Designed the PostgreSQL schema and row-level security policies in Supabase, with a script that tests what each role can read and write.
- Set up authentication: invitations, password reset, roles and permissions.
- Deployed the site on Vercel and configured the custom domain, with www as the canonical address.
Features
Public website
- Catalogue with prices, grouped into décor, Baja & music, tentage, lights & sound and rentals
- Gallery organised by occasion
- Full event inquiry form; “Enquire” on a catalogue design pre-fills the message with that design and its price
- Date availability hint (“looks open”, “popular date”, “very busy”) that never reveals counts or client details
- Private client quotation page: view, download as PDF, accept online, ask for changes or decline, without logging in
- Sitemap, robots.txt, social share image, web app manifest and page metadata
Admin system
- Dashboard with customisable widgets
- Leads, pipeline board, inquiries, follow-ups and customers
- Quotation editor with versions, sending, client links, PDF output and conversion to a booking
- Bookings and events with tasks, timelines, design approvals, a calendar and a printable event day sheet
- Inventory with reservations, packages, vendors, staff and tasks
- Invoices, payments, receipts, expenses, reports, and CSV import and export
- Website editor for content sections, gallery albums, services, testimonials and the media library
- Users, roles and permissions, notifications and an activity log
Technical decisions
Security enforced in the database
Access rules live in PostgreSQL row-level security policies rather than only in the app. A dedicated test script creates temporary users for each role, checks what each one can read and write, and rolls everything back.
Rate limiting that works on serverless hosting
Public forms are rate-limited through a database-backed counter, so the limit holds across serverless instances instead of resetting with each one.
Transparent email outbox
Every outgoing email, including quotations, acceptances, receipts and reminders, is recorded in an outbox. If the email provider isn’t configured, the message is marked as not sent, so staff can see exactly what would have gone out.
Privacy-aware availability
The inquiry form helps people choose a date without exposing the calendar. It shows a coarse hint, never a booking count or another client’s details.
Challenges & solutions
Challenge
Clients needed to accept quotations without creating accounts, while staff still needed control over who could see a quote.
Solution
Each quotation has a private share link. Staff can reset the link, which immediately stops the old one from working, and an online acceptance is recorded with the client’s name and date.
Challenge
Links in emails sent while testing locally pointed to localhost, which is useless to a client.
Solution
Email links always resolve to the live site, so a message is correct wherever it was sent from.
Outcome
- The public website and inquiry flow are live on the company’s own domain.
- The admin system’s modules are built. Recent features are being tested, and some content is still to come from the client before full launch.
Screens

Catalogue & price list

Inquiry form

Admin dashboard (figures blurred)

Mobile homepage