Business & Operations

Bookmysal0n

Source code included

Multi-tenant salon management system for UAE salons: bookings, POS, staff, inventory, loyalty and online payments.

Built by Build Nest Updated 6 Oct 2026 57,554 lines of code

Open live demo Built withClaude Code

Why Bookmysal0n

What makes it better
than the alternatives

  1. 01

    Multi-tenant architecture

    Multi-tenant architecture

  2. 02

    UAE-specific configuration

    UAE-specific configuration

  3. 03

    No ORM, hand-written SQL

    No ORM, hand-written SQL

  4. 04

    Clean Architecture with full test coverage

    Clean Architecture with full test coverage

  5. 05

    Blazor Interactive Server for admin, static SSR for auth

    Blazor Interactive Server for admin, static SSR for auth

Online Booking & Customer Portal

  • Public booking page per salon at /book/{slug}: service menu
  • professional selection
  • date strip with available slots
  • customer sign-in by email or UAE mobile code
  • Customer authentication: 6-digit codes by email or SMS
  • Google and Apple sign-in with account linking
  • 60-day sliding cookie
  • My Bookings page: view upcoming and past appointments
  • reschedule (checks availability in transaction)
  • cancel with reason
  • pay deposit online
  • Customer wallet: view credit balance
  • top-up online
  • transaction history
  • Booking settings per salon: advance booking window
  • cancellation deadline
  • deposit percentage
  • blocked days
  • service visibility
  • professional assignment rules

Calendar & Appointments

  • Team calendar with day
  • 3-day
  • week and month views; one column per team member; drag-and-drop rescheduling with conflict detection
  • Appointment statuses: Booked
  • Confirmed
  • In Progress
  • Completed
  • No Show
  • Cancelled; change history with timestamp and user
  • No double booking: every save re-checks the slot inside a database transaction (AppointmentRepository.IsSlotAvailableAsync with UPDLOCK)
  • Blocked time: mark unavailable periods per professional (lunch
  • training
  • personal time)
  • Appointment details: client
  • services
  • professional
  • duration
  • notes
  • internal notes (staff only)
  • deposit paid
  • total price
  • Automatic reminders: scheduled by MessageScheduler
  • sent 24 hours before via SMS or email

Point of Sale & Checkout

  • Checkout cart: add services (from appointment or walk-in)
  • products
  • custom items; apply discounts (percentage or fixed amount)
  • promo codes
  • tips
  • Split payments: cash
  • card
  • online (Stripe)
  • gift card
  • package session
  • membership
  • wallet credit; one sale can use multiple tenders
  • VAT calculation: configurable rate (default 5% UAE)
  • applied to services and products
  • shown on receipt
  • Invoice numbering: gap-free sequence per business (SaleRepository.NextInvoiceNumberAsync with UPDLOCK)
  • Receipt generation: 80mm thermal or A4 PDF (ReceiptPdfRenderer with QuestPDF)
  • email to client
  • print from browser
  • Cash register: opening float
  • cash in/out with reason
  • closing count with variance report (RegisterService)
  • Refunds and voids: full or partial refunds with reason
  • void unpaid sales
  • refund history per sale

Client Management

  • Client profiles: name
  • email
  • mobile
  • birthday
  • gender
  • tags
  • source
  • notes
  • visit count
  • total spend
  • last visit date
  • Client segments: new (first visit <30 days)
  • loyal (5+ visits)
  • lapsed (no visit >90 days)
  • birthdays this month
  • custom filters by tags/source/spend
  • Client wallet: credit balance
  • top-up at checkout or online
  • transaction log with sale references
  • Consultation forms: custom forms per business (FormService)
  • sent by link
  • client fills online
  • stored with client record
  • Consent forms: GDPR-style consent tracking
  • signed date
  • form version
  • CSV import: bulk import clients with mapping (ClientService.ImportFromCsvAsync)
  • Contact masking: staff without 'view_client_contacts' permission see masked email/phone (ClientService applies mask based on CurrentUser permissions)

Prepaid, Loyalty & Marketing

  • Gift cards: define types with value and validity period
  • sell at POS or online (e-gift with email delivery)
  • redeem at checkout
  • balance tracking
  • Packages: bundles of sessions (e.g. 10 massages)
  • sold at POS
  • sessions deducted at checkout
  • expiry date
  • remaining sessions shown in cart
  • Memberships: recurring access (monthly/annual)
  • sold at POS
  • benefits applied at checkout (discounts
  • free services)
  • renewal reminders
  • Loyalty points: earn points on spend (configurable rate)
  • redeem for discounts
  • referral bonus points
  • points ledger per client (LoyaltyPosting)
  • Promo codes: percentage or fixed discount
  • usage limit
  • expiry date
  • applied at checkout (CheckoutDiscounts validates and applies)
  • Blast campaigns: email or SMS to segments
  • scheduled send
  • unsubscribe link
  • delivery tracking (CampaignService
  • OutboxProcessor)
  • Review requests: automatic after appointment completion
  • public review page at /review/{token}
  • star rating and comment (ReviewService)

Team, Roster & Payroll

  • Team members: linked to user accounts
  • assigned to services
  • working hours
  • commission rate
  • hourly rate
  • active/inactive status
  • Roles and permissions: 8 system roles (Owner
  • Admin
  • Manager
  • Receptionist
  • Stylist
  • Therapist
  • Technician
  • Trainee) plus custom roles; 47 granular permissions across 12 areas
  • Shift scheduling: weekly roster
  • assign shifts per professional
  • copy previous week
  • conflict detection (ShiftService)
  • Timesheets: clock in/out (manual entry by manager)
  • break deduction
  • overtime calculation
  • approval workflow (TimesheetService)
  • Payroll: pay runs per period
  • base salary + commission on sales + hourly for extra hours
  • deductions
  • net pay
  • PDF payslip (PayrollService)
  • Commission tracking: percentage of service price or fixed amount per service
  • calculated at sale completion
  • included in pay run

Inventory & Products

  • Product catalog: name
  • SKU
  • category
  • brand
  • cost price
  • retail price
  • stock level
  • reorder point
  • supplier
  • Stock tracking: current quantity per branch
  • stock movements (purchase
  • sale
  • adjustment
  • transfer)
  • movement history
  • Transfers: move stock between branches
  • pending/completed status
  • transfer log (TransferService
  • TransferRepository)
  • Low stock alerts: products below reorder point shown on dashboard
  • email notification (InventoryService.GetLowStockAsync)
  • Stock adjustments: manual corrections with reason (damaged
  • expired
  • found)
  • adjustment history
  • Product sales: add to checkout cart
  • deduct from stock on sale completion
  • cost of goods sold tracked

Payments & Billing

  • Stripe integration: AED payments
  • payment intents for deposits and gift cards
  • webhook handling for payment confirmation (StripeGateway
  • OnlinePaymentRecorder)
  • Payment links: generate link for unpaid sale
  • send by SMS/email
  • customer pays online
  • sale marked paid on webhook (PaymentLinkService)
  • Deposit handling: online deposit for bookings
  • held in customer wallet
  • applied at checkout
  • auto-refund if cancelled >24h before (OnlineBookingService.DepositReturns)
  • Multi-currency support: AED only in UAE edition (Region.Currency)
  • but architecture supports other currencies (Money value object)
  • Billing module: subscription plans (trial
  • basic
  • pro)
  • usage tracking
  • invoice generation
  • payment collection (BillingService
  • Phase 16 in PHASE-NOTES.md)

Reports & Analytics

  • Dashboard: today's appointments
  • sales summary
  • top services
  • top professionals
  • low stock alerts
  • upcoming birthdays (DashboardService)
  • Daily sales summary: total sales
  • payment method breakdown
  • VAT collected
  • tips
  • refunds
  • register variance (SalesReportService.GetDailySummaryAsync)
  • Sales list: filterable by date range
  • professional
  • payment method
  • status; export to Excel/CSV (SalesReportService.GetSalesAsync
  • SpreadsheetWriter)
  • Appointment reports: by status
  • professional
  • service
  • date range; no-show rate
  • cancellation reasons
  • Client reports: new clients
  • repeat rate
  • average spend
  • visit frequency
  • segment sizes
  • Staff reports: sales per professional
  • commission earned
  • hours worked
  • appointments completed
  • Inventory reports: stock value
  • movement history
  • low stock
  • products sold

Multi-Location & Settings

  • Multi-branch support: one business can have multiple branches
  • each with own address
  • phone
  • working hours
  • staff assignment
  • inventory (Phase 15 in PHASE-NOTES.md)
  • Business settings: name
  • slug (for booking URL)
  • logo
  • address
  • phone
  • email
  • timezone (Asia/Dubai)
  • currency (AED)
  • VAT rate
  • booking rules (SettingsService)
  • Service catalog: define services with name
  • duration
  • price
  • category
  • assigned professionals
  • online visibility (CatalogService)
  • Working hours: set per branch and per professional
  • used for availability calculation (Availability.GetSlotsAsync)
  • Email templates: customizable for login codes
  • appointment confirmations
  • reminders
  • receipts (EmailLayout.WrapAsync)
  • SMS gateway: HTTP API integration for any UAE SMS provider (SmsSenders.HttpGateway)
  • configurable URL/query/auth in appsettings.json
  • Data protection: ASP.NET Core Data Protection keys stored in configurable folder (appsettings.json DataProtection:KeysPath)
  • survives restarts

Quality report

Manually reviewed

91/ 100

Automated audit score

◷ 2 open warnings

Passed the audit and a manual review.
Audit run: 6 Oct 2026
Reviewed by Vibe96 staff, Dubai.

Security92
Code structure82
Docs & completeness93
Dependency health95
Build & deploy92

What to know before you buy

2 non-blocking findings shown publicly: no real secrets found; weak default sql password in docker-compose.yml needs attention; dapper sql is parameterized and scoped; minor schema gaps (missing indexes on fks); strong authentication and role checks; minor ownership gaps on read endpoints; moderate duplication and some oversized files; architecture is sound but refactoring needed. The seller has been notified; fixes ship in the next version.

Versions & updates

1.0.0
First release6 Oct 2026✓ Reviewed & audited

No updates yet. New versions appear here with a changelog.
Buyers receive updates free for 1 year.

Quality report

What you get

  • </>Full source codeThe complete audited source, delivered as a download from your account. No obfuscation.
  • ▤DocumentationSetup guide, architecture notes, CLAUDE.md and AGENTS.md.
  • ↻One year of updatesEvery new version the builder publishes, free for 12 months.
  • ♧30 days of supportInstallation and defect support through Vibe96 tickets.
$349Single-site licence Details