Overview
Taiwan Happy Feet is a local wellness business that previously handled bookings by phone and paper schedules. This led to double-bookings, missed calls, and
limited visibility into staff availability. I built a production Flask application with a schedule-aware booking form, an admin dashboard for day-to-day
operations, and automated SMS reminders using Twilio. Staff can manage shifts and blackout windows; the public form only exposes valid time slots and
services, reducing errors and no-shows while improving utilization.
Goals
- Let customers self-book only when a qualified staff member is available.
- Automate reminders and confirmations to reduce no-shows.
- Give admins a clear calendar view, quick reassignments, and editable menus/services.
My Role
- Backend: Flask blueprints, SQLAlchemy models, validation, and service layer.
- Frontend: Accessible HTML/CSS/JS, schedule-aware booking form with async checks.
- Ops/Integrations: Twilio SMS flows, environment-based settings, and deployment.
Solution
- Admin Dashboard: Day/Week calendar, searchable bookings, drag-to-reassign slots, bulk edit for shifts and blackout windows.
- Schedule-Aware Booking Form: Customers see only valid time slots computed from staff shifts, service durations, buffers, and room limits.
- Dynamic Services/Menu: Managers update services, durations, and prices in the backend; the public form reflects changes instantly.
- Twilio SMS: Confirmation and reminder messages (e.g., 24h/2h before) with opt-out; failed sends are logged for follow-up.
- Conflict Prevention: Server-side checks guarantee no double-bookings across staff, rooms, or overlapping services.
- Exports & Notes: CSV export for accounting; private notes per booking for special instructions or contraindications.
Architecture
- Backend: Flask blueprints (
auth, catalog, scheduling, bookings, admin).
Service layer encapsulates availability math and validation; responses as HTML or JSON for AJAX.
- Data: PostgreSQL via SQLAlchemy. Key tables:
staff, services, shifts, blackout_windows, rooms,
bookings, booking_services (many-to-many), sms_log.
- Availability Logic: Slot generator respects shift boundaries, service durations, buffer times, room capacity, and existing bookings.
- Frontend: Server-rendered templates with progressive enhancement.
JS
fetch endpoints validate slots in real time and update the UI without reloads.
- Integrations: Twilio API for confirmations/reminders; signed callback URLs for delivery status →
sms_log.
- Deployment: Gunicorn behind a reverse proxy; environment variables for secrets; daily backup task; error logging with rotating files.
Impact
- Fewer scheduling errors thanks to conflict checks and schedule-aware booking.
- Significant drop in no-shows after automated SMS confirmations and reminders.
- Owners gained live visibility into staff utilization, busy hours, and popular services.
Gallery
What I Learned
- Designing reliable availability engines (durations, buffers, room capacity) and enforcing rules at both service and DB levels.
- How to structure Flask apps for growth using blueprints + a service layer with clear boundaries.
- Building production SMS flows with retries, delivery webhooks, and opt-out handling.
Next Steps
- Online payments + deposits to further reduce no-shows.
- Staff mobile view with one-tap confirm/complete and same-day blackout controls.
- Revenue and utilization analytics by service, staff member, and daypart.