More Work

Appointment Booking App

Clinic/salon scheduling with JWT auth, admin calendar, email confirmations.

Role
Full-stack Developer
Timeline
2 weeks
Industry
Local Services
Team
Solo
Scope
Booking, Calendar, Admin, Email
Impact
Fewer no-shows, easier scheduling

TL;DR

  • Self-serve bookings reduce back-and-forth
  • Admin calendar controls availability & load
  • Email confirmations + reminders lower no-shows
  • JWT + role checks keep admin safe
  • Timezone-aware UX for fewer misunderstandings

⚡ Problem

Small clinics and salons juggle phone calls and DMs for scheduling; staff can’t see availability clearly, leading to double-bookings and missed appointments.

Audience & Use Cases

Primary Audience

  • Clinic and salon owners handling 10–100+ appointments/week
  • Front-desk staff who need a quick view of availability and status
  • Local service providers wanting fewer phone/DM scheduling conflicts

Key Use Cases

Customer books an open slot in seconds

User picks a service and sees live availability; selects a time and instantly receives a confirmation email in their local time.

Admin shapes the schedule

Admin creates recurring slots, disables specific times, and filters by day/week to balance capacity.

Reduce no-shows with reminders

Automated reminder emails are sent ahead of the appointment; admins can mark no-shows and completed appointments.

💡 Solution

A self-serve booking flow with real-time slot availability, admin slot management, email confirmations (in local time), and clear calendars for both customers and staff.

  • Mobile-first booking by available time slots
  • Admin slot creation/disable with day/week views
  • Email confirmations and reminders (local timezone)
  • Status filters (upcoming, completed, canceled, no-show)
  • Calendar grid/list toggles and search
  • JWT authentication and protected admin routes
  • Timezone-aware formatting with Day.js
  • Validation to prevent double-booking

Requirements & Constraints

Requirements

  • Prevent double-booking and overlapping slots
  • Handle timezones cleanly for both emails and UI
  • Provide an at-a-glance admin calendar and filters
  • Protect admin routes and actions

Constraints

  • Simple deployment footprint (single API + DB)
  • Minimal external dependencies beyond email
  • Fast mobile performance for on-the-go customers

Architecture

React/Vite frontend with a calendar-driven booking flow talks to an Express API backed by MongoDB/Mongoose. JWT secures admin actions. Nodemailer sends confirmations and reminders using template-based emails.

Data / Request Flow

  1. Customer selects service → sees available slots.
  2. POST booking → server validates slot availability & creates appointment.
  3. Confirmation email sent with local-time formatting.
  4. Admin dashboard shows day/week calendar with filters.
  5. Admins add/disable slots; bookings auto-respect availability.
  6. Reminder emails trigger ahead of appointment time.
  7. Admins update status (completed/canceled/no-show) and notes.

Domain Model

User
  • id
  • email
  • name
  • role (user/admin)
  • createdAt
Slot
  • id
  • start
  • end
  • service
  • isDisabled
  • staffId?
Appointment
  • id
  • userId
  • slotId
  • status (upcoming|completed|canceled|no-show)
  • notes?
  • createdAt
Service
  • id
  • title
  • durationMin
  • price?
  • active

Trade-offs & Alternatives

  • Chose MongoDB for quick iteration and flexible slot schema; relational DB would ease joins but slow early changes
  • Used Nodemailer for full control over email templates; third-party providers would add cost but reduce maintenance

Roadmap

  • Multi-staff schedules & overlapping calendars
  • Self-service reschedule/cancel links
  • SMS reminders and ICS calendar attachments
  • Payments & deposits for high no-show services
  • Service categories and multi-location support

FAQ

Can customers reschedule on their own?

Roadmap includes secure reschedule/cancel links sent in emails. Admins can reschedule today.

Does it support multiple staff or rooms?

The model anticipates a staffId per slot; UI support is planned on the roadmap.

How do you prevent double-booking?

Server validates slot availability during booking and uses atomic checks to ensure only one appointment can claim a slot.

Will this work across timezones?

Yes—customer-facing times and emails are rendered in the user’s local timezone with Day.js.