WashBay – Business & Operations Software | Vibe96

Business & Operations

WashBay

Source code included

Car wash center management with customer booking, staff operations, payments and web admin for multi-branch businesses

Built by Max code Updated 22 Oct 2026 48,385 lines of code

Open live demo Built withClaude Code

About this software

About WashBay

WashBay runs car wash and detailing businesses from one system. Customers book slots and pay online through a Flutter mobile app (Android/iOS). Branch staff check in customers by QR code, track wash jobs through a live board, take before/after photos and close daily cash on a tablet. Managers control branches, pricing, staff and reports from an ASP.NET Core web panel with a guided product tour. The system handles multiple countries with separate currencies and VAT rates, and multiple branches per country with individual opening hours, holidays and bay configurations.

Category: Business & OperationsStack: ASP.NET Core 10 + Flutter 3.35 · Microsoft SQL Server 2019+Built with: Claude Code Licence: Single-site, full source

Why WashBay

What makes it better
than the alternatives

  1. 01

    Live wash board over SignalR

    Every bay updates in real time across web panel and staff tablets with job status, assigned washer and customer timeline

  2. 02

    Dual Flutter apps from one codebase

    Customer booking app (main.dart) and staff tablet app (main_staff.dart) share auth, network and domain logic

  3. 03

    Branch-specific pricing

    Services have a base price per vehicle type, with optional branch overrides and a cached menu (CatalogCache) invalidated on catalog changes

  4. 04

    Guided demo mode

    In-browser sample data (demo/store.js) and a chapter-based product tour (tour/provider.js) that plays without server calls, controlled by ProductionGuards.cs

  5. 05

    Plain JavaScript web panel

    No build step; ES modules (core/api.js, ui.js, resource.js) and Razor Pages render tables and forms with Tailwind CSS

Customer Mobile App (Flutter)

  • Email/password registration with OTP verification (AuthRepository
  • LoginCubit
  • OtpCubit)
  • My vehicles list with default selection (VehiclesScreen
  • VehicleRepository)
  • Branch list sorted by GPS distance with hours
  • directions and call (BranchesScreen
  • LocationHelper)
  • Service selection with live price including VAT
  • package and add-on support (SelectServicesScreen
  • BookingFlowCubit)
  • Real-time slot availability from SlotCalculator
  • 5-minute hold during checkout (SelectSlotScreen
  • BookingRepository)
  • Stripe hosted checkout or pay-at-counter
  • PDF invoice download (SummaryScreen
  • PaymentService
  • InvoicePdf)
  • Live wash timeline: checked in → washing → quality check → ready → picked up (BookingDetailScreen
  • LiveSession widget)
  • Ratings and reviews after completion (RatingsController)
  • In-app notifications list and optional Firebase push (NotificationsScreen
  • PushService)
  • English and Arabic with full RTL support (LocalizationCubit
  • assets/language/ar.json

Staff Tablet App (Flutter)

  • One-time pairing with manager email/password
  • then 4-digit PIN login (PairScreen
  • PinScreen
  • StaffAuthController)
  • PIN lock after 5 wrong attempts for 15 minutes (Operations:PinMaxAttempts
  • PinLockMinutes)
  • Live board with lanes per bay
  • drag jobs between statuses (BoardScreen
  • BoardCubit
  • LaneColumn widget)
  • QR code scanner for customer check-in (ScanScreen
  • JobCubit.checkIn)
  • Job detail drawer: customer
  • vehicle
  • services
  • assign washer
  • before/after photo upload (JobScreen
  • JobSections)
  • Walk-in booking: select vehicle type and services
  • see price and free slots
  • capture customer details (WalkInScreen
  • WalkInCubit)
  • Daily cash closing: counter payments total and submit (CashController)

Web Admin Panel (Razor Pages + JS)

  • Dashboard: today's bookings
  • revenue and average rating Pages/Panel/Dashboard.cshtml
  • pages/dashboard.js
  • Live board: all branches
  • real-time job updates over SignalR Pages/Panel/Live.cshtml
  • core/live.js
  • LiveHub)
  • Countries: add countries with currency code and VAT rate Pages/Panel/Countries.cshtml
  • OrgController.CreateCountry)
  • Branches: name
  • address
  • time zone
  • opening hours
  • holidays
  • bays with category limits Pages/Panel/Branches.cshtml
  • components/branch-form.js
  • Catalog: vehicle types
  • categories
  • services
  • packages
  • add-ons with translatable names Pages/Panel/Catalog.cshtml
  • CatalogController)
  • Price board: base price and duration per vehicle type
  • branch overrides components/price-board.js
  • CatalogController.UpdatePrices)
  • Branch menu: turn services on/off per branch (CatalogController.UpdateBranchMenu
  • CatalogCache invalidation)
  • Bookings list: filter by branch and day
  • cancel when needed Pages/Panel/Bookings.cshtml
  • BookingsController)
  • Staff management: create accounts
  • set roles (Super Admin
  • Country Admin
  • Branch Manager
  • Front Desk
  • Supervisor
  • Washer)
  • set/clear PINs
  • unpair tablets Pages/Panel/Staff.cshtml
  • StaffAdminController
  • StaffAppController)
  • Ratings: reviews list with summary stats Pages/Panel/Ratings.cshtml
  • RatingsController)
  • Reports: daily branch report with bookings
  • walk-ins
  • no-shows
  • cancellations
  • cash/card/online revenue
  • average stars
  • CSV export Pages/Panel/Reports.cshtml
  • ReportsController)
  • Guided product tour: 8 chapters tour/chapters/
  • in-browser demo data demo/store.js
  • skippable and resumable tour/provider.js
  • AuthController.UpdateTours)
  • Session: signed httpOnly cookies with Data Protection
  • auto-refresh Panel/PanelSessionFilter.cs
  • PanelAuthController)
  • English and Arabic UI Panel/i18n/ar.json
  • core/i18n.js

Booking Engine

  • Quote calculation: services + package + add-ons
  • VAT included (BookingsController.Quote
  • QuoteService)
  • Slot generation: SlotCalculator reads branch hours
  • holidays
  • bay availability and existing bookings to return free times
  • 5-minute hold: BookingHold entity locks a slot while customer confirms (Booking:HoldMinutes)
  • Booking creation: validates hold
  • creates Booking with line items
  • sends confirmation (BookingsController.Create)
  • Reschedule: cancel cutoff enforced (Booking:CancelCutoffMinutes)
  • new slot hold and swap (BookingsController.Reschedule)
  • Cancellation: allowed until cutoff
  • refund if paid online (BookingsController.Cancel)
  • Max active bookings per customer (Booking:MaxActiveBookings)
  • Walk-in bookings: staff create on-the-spot with immediate check-in (StaffAppController.CreateWalkIn)

Operations & Job Flow

  • Check-in: QR code or typed code
  • validates early check-in window (Operations:CheckInEarlyMinutes)
  • creates Job entity (StaffAppController.CheckIn)
  • Job statuses: Pending → InProgress → QualityCheck → Ready → PickedUp (JobStatus enum
  • JobRules.CanTransition)
  • Washer assignment: supervisor or front desk assigns staff
  • tracked in Job.AssignedStaffId (StaffAppController.AssignWasher)
  • Before/after photos: required by default (Operations:RequireBeforePhotos
  • RequireAfterPhotos)
  • uploaded to storage/uploads (FilesController
  • JobPhotosService)
  • No-show detection: manual mark or auto after 2 hours (Operations:NoShowAfterMinutes
  • AutoNoShowAfterMinutes
  • NoShowWorker background service)
  • Live updates: SignalR LiveHub broadcasts job changes to web panel and tablets (LiveNotifier
  • LiveHub.SubscribeToJobs)

Payments & Invoicing

  • Payment providers: None
  • Demo (try-out only with DemoPayToken signed links)
  • Stripe (PaymentOptions.cs
  • OnlinePaymentProviders)
  • Stripe integration: hosted checkout session
  • webhook signature verification (StripePaymentProvider
  • StripeWebhookController)
  • Demo payments: simulated success/failure with signed expiring tokens
  • blocked in production (ProductionGuards.cs
  • DemoPaymentProvider)
  • Invoice generation: QuestPDF creates PDF with company details
  • line items
  • subtotal
  • VAT
  • total (InvoicePdf
  • InvoiceService)
  • Invoice storage: saved to storage/invoices
  • downloadable by customer (PaymentsController.DownloadInvoice)
  • Payment methods: Online (Stripe)
  • Counter (cash/card at branch)
  • tracked per booking (PaymentMethod enum)

Multi-Tenancy & Access Control

  • Countries: separate currency and VAT rate
  • Country entity (OrgController)
  • Branches: belong to one country
  • have time zone
  • hours
  • holidays
  • bays (Branch entity)
  • Role-based access: Super Admin (all countries)
  • Country Admin (one country)
  • Branch Manager (one branch)
  • Front Desk/Supervisor/Washer (branch staff)
  • Customer (Roles.cs
  • AuthPolicies)
  • Access scoping: TenantContext and AccessScope limit staff to their country or branch (ClaimsUser.CountryId
  • BranchId)
  • Policy enforcement: [Authorize(Policy = AuthPolicies.Panel)] for web panel
  • [Authorize(Policy = AuthPolicies.Operations)] for staff tablet (AuthPolicies.cs)
  • Branch filtering: operations pages (bookings
  • cash
  • reports
  • ratings
  • live) filter by branch core/branch-picker.js

Notifications

  • In-app notifications: stored in Notification entity
  • paginated list (NotificationsController
  • NotificationRepository)
  • Push delivery: Log (development) or FCM (production) via Notifications:PushProvider (PushService
  • FcmPushService)
  • Notification types: BookingConfirmed
  • BookingCancelled
  • BookingReminder
  • JobStatusChanged
  • PaymentReceived (NotificationType enum)
  • User preferences: opt-in push
  • device token registration (NotificationsController.RegisterDevice)
  • Retention: keeps last 100 per user (Notifications:KeepPerUser)

Catalog & Pricing

  • Vehicle types: Car
  • SUV
  • Truck
  • Van
  • Motorcycle (VehicleType entity
  • seeded in CatalogSeeder)
  • Service categories: Exterior
  • Interior
  • Detailing
  • Protection (ServiceCategory entity)
  • Services: translatable name/description (Localized<string>)
  • base price and duration per vehicle type (Service entity
  • ServicePrice)
  • Packages: bundles of services with discount (Package entity
  • PackageService)
  • Add-ons: optional extras (AddOn entity)
  • Branch menu: services enabled/disabled per branch (BranchService entity
  • CatalogController.UpdateBranchMenu)
  • Price overrides: branch-specific prices (BranchServicePrice entity
  • CatalogController.UpdatePrices)
  • Catalog cache: in-memory branch menu
  • invalidated on any catalog change (CatalogCache
  • CatalogService.InvalidateCache)

Security & Production Guards

  • JWT tokens: access (60 min) and refresh (30 days) with HS256 signing (TokenService
  • Jwt:SigningKey)
  • Password hashing: Argon2id with salt (PasswordService)
  • OTP verification: 6-digit code
  • 5 attempts
  • 5-minute expiry
  • 30-second resend cooldown (OtpService
  • Otp:* settings)
  • Production guards: refuses to start in Production with DemoSite=true
  • OTP demo mode
  • demo passwords or Demo payment provider (ProductionGuards.cs)
  • Rate limiting: 20 req/min/IP for auth routes
  • 10 req/15min/device for PIN login (RateLimitPolicies
  • Program.cs)
  • CORS: configurable allowed origins (Cors:AllowedOrigins)
  • Panel session: signed httpOnly cookies
  • auto-refresh
  • same-origin [RequirePanelHeader] (PanelSessionFilter
  • PanelAuthController)
  • Stripe webhook: HMAC signature verification before processing (StripeWebhookController)
  • Authorization tests: EndpointAuthorizationTests.cs ensures every mutating route has a role or is reviewed as public

Quality report

Manually reviewed

89/ 100

Automated audit score

✓ Passed the audit

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

Security92
Code structure72
Docs & completeness88
Dependency health85
Build & deploy92
Reviewer notes (4 minor)

No critical vulnerabilities found; some outdated dependencies in flutter apps; strong authentication and role checks; minor ownership gaps on read endpoints; no real credentials found; weak defaults in example files need stronger guidance; moderate duplication and some oversized files; module boundaries mostly sound. None of these stop the software from working; the developer has been told and improvements come in a future update.

Versions & updates

Release history

Current version

1.1.0
released 22 Oct 2026

Updates in the last 90 days

1
1 version · 0 patches

Buyers

0
full source, single-site licence

Updates included

1 year
free from purchase
  1. 1.1.0 Version Current22 Oct 2026 ✓ Reviewed & audited
    • New features have been added to the admin panel: Email, Stripe, Database Backup, and Database Cleanup.
  2. 1.0.0 First release 19 Oct 2026 ✓ Reviewed & audited

How updates work: versions add features and go through the full AI audit and human review. Patches are small fixes, audited and checked by a reviewer before release. Buyers get every update free for 1 year and are emailed the how-to-apply steps.

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.
$112Single-site licence Details