PCUTB
A web and mobile ecosystem for a barber shop, with appointments booked into slots calculated from services and schedule, administrative approval, push reminders, customer and service management, statistics, and loyalty mechanisms.

Core stack
The challenge
The challenge was synchronizing the salon's real schedule across three different interfaces, without users or the administrator being able to easily create overlaps. Slots have to account for service duration, the weekly schedule, special days, breaks, existing appointments, and the current time, and status changes have to be propagated via notifications to the right actor. At the same time, authentication and mobile distribution had to work consistently across web, iOS, and Android.
The solution
The solution separates the Node.js/TypeScript API from the web and mobile clients. Express and Sequelize centralize validation, authentication, booking rules, and persistence in MySQL; SvelteKit uses server-side proxies and HttpOnly cookies for authenticated flows, and the Expo apps use React Query, Zustand, and SecureStore. Availability is calculated from the service, schedule, exceptions, breaks, and existing bookings, and the booking interfaces periodically refresh the slots while the user is choosing a time. Persistent notifications are complemented by Expo Push and Web Push, and node-cron jobs run the reminders and loyalty processes. Web and backend deployment is automated via GitHub Actions and PM2, and the administrative app has a separate workflow for OTA, native builds, artifacts, and store submission.
Notable complexity
PCUTB is an operational product built around the relationship between the customer and the salon. The customer can register, verify their email, and create an appointment by choosing the service, day, and time. Duration and price come from the salon's managed catalog, and the backend calculates the final time slot, applies the weekly schedule, special days, and breaks, and rejects slots that overlap with existing appointments.
Appointments created by customers enter a pending state, and the admin area offers a calendar, daily occupancy, filters, manual creation, editing, confirmation, rejection, and marking no-shows. The administrator can manage services, the recurring schedule, calendar exceptions, users, notifications, reviews, and app versions. Rules include customer cancellation only more than 24 hours in advance, protection against booking in the past, and overlap checks against breaks and existing bookings.
Notifications are handled across multiple channels. Events such as a new appointment, confirmation, rejection, modification, or cancellation create persistent notifications and can trigger Expo Push for mobile apps and Web Push for the browser. A cron job periodically checks confirmed appointments and sends reminders in the 24-hour and one-hour windows, using persistent flags to avoid re-sending the same reminder.
The product has three main surfaces over the same API: the SvelteKit site for customers and administration, the React Native/Expo customer app, and the React Native/Expo app dedicated to the administrator. On web, the session uses HttpOnly cookies and a refresh token; on mobile, tokens are persisted in SecureStore, and the HTTP interceptor serializes the refresh when multiple requests receive a 401 simultaneously. The visual theme is shared, with a dark/light palette and a configurable golden accent.
Besides booking, the backend includes operational statistics and a loyalty layer based on points, transactions, and mini-games. Jobs award points for completed appointments and manage the monthly reset and the leaderboard. The site is public at pcutb.ro, the customer app is published in the App Store, and the repositories include automatic deployment for the backend and web plus an EAS pipeline for build, OTA update, and submitting the administrative app.
Key results
- Public SvelteKit site for presentation, authentication, appointments, and admin surfaces
- React Native/Expo customer app published in the App Store
- Separate React Native/Expo app for the salon's operational administration
- Booking flow with a single service, duration and price from the catalog, calculated slots, and overlap checking
- Weekly schedule, breaks, and special days used directly in the availability calculation
- Appointment workflow pending → confirmed or rejected, with controlled cancellation and no-show management
- Manual creation and editing of appointments from the admin interface, including calendar occupancy
- Persistent notifications, Expo Push, and Web Push for important events in the appointment lifecycle
- Automatic reminders for confirmed appointments in the 24-hour and one-hour windows
- Management of users, services, schedule, special days, reviews, and app versions
- Statistics on appointments, revenue calculated from confirmed services, services, and user status
- Points system and transaction history linked to appointments, a leaderboard, and loyalty mini-games
- Automatic backend and site deployment on a VPS with GitHub Actions and PM2
- EAS pipeline for OTA update, iOS/Android builds, artifacts, and controlled submission of the administrative app
Related projects
- AavenaA multi-platform agricultural product that brings together map-based field delineation, crop and intervention tracking, weather data, visual plant analysis, and context-aware AI recommendations.
- Program Lucru (Work Schedule)A platform for organizing work schedules, time tracking, time-off-in-lieu, and statistics, complemented by an offline PWA, synchronized mobile alarms, Web Push notifications, role-based administration, and a BBD module for tracking products and batches.
Want something similar?
Start with the estimate wizard — answer a few questions and get a realistic price range and timeline.