SalonIQ Scheduler
A dynamic, reusable web-based scheduling tool built for Great Clips franchise operators.
The Problem
Running two Great Clips franchise locations means producing two weekly staff schedules every week — every week, forever. The standard approach is a manager eyeballing a spreadsheet and hoping they've hit the floor hour targets, opener/closer minimums, and part-time hour caps required by corporate.
That approach breaks constantly. A manager forgets someone's day off. The floor hours come in under target. A part-time stylist gets scheduled over their cap. The problems only surface after the schedule is posted, which means corrections, friction, and payroll risk.
The deeper problem: Great Clips corporate reporting runs Saturday through Friday — not Monday through Sunday like most scheduling tools assume. Off-the-shelf tools don't understand this, and they certainly don't know what a "recommended floor hour target" is or why it matters.
A tool built specifically for this operation — one that understands the business rules, validates in real time, and produces a professional schedule in one click — would save hours per week and eliminate a category of avoidable errors.
Approach
SalonIQ Scheduler is a single-file HTML application. Everything — HTML, CSS, and JavaScript — lives in one index.html file with no build step, no npm, no framework dependencies. A manager can open it in a browser, build a schedule, and export it without installing anything.
The scheduling week always runs Saturday through Friday, matching the Great Clips corporate reporting period. This is hardcoded as a core business rule — not a setting.
Core features built:
Stylist roster management — Each stylist has a full data model: name, role (MGR/A/S/RECPT), floor status, weekly hour cap, and per-day availability constraints. Constraints support four states: available, off (temporary), locked (permanent), and hard time boundaries (must leave by 3pm, cannot start before 11am). Receptionists are excluded from floor hour totals automatically.
Live validation engine — Six rules run on every schedule change:
- Floor hours meet or exceed the daily recommended target
- Minimum 2 openers on every open day
- Minimum 2 closers on every open day
- No stylist exceeds their weekly hour cap
- No stylist scheduled on a constrained or locked day
- Grand total within the weekly ceiling (target + 20 hours)
Each rule produces a green/yellow/red signal so managers see problems the moment they create them, not after the schedule is posted.
Auto-scheduler — One button builds a full week schedule respecting all constraints. Uses 5–8 hour shifts only, assigns every available stylist to every available day, and stays within the weekly hour ceiling.
Export — PDF via window.print() with a dedicated print stylesheet: landscape orientation, navy headers, alternating row colors, daily totals and opener/closer counts in the footer, store name and week label at the top. CSV export is a pure JavaScript generator — no libraries, auto-named file.
Persistence — localStorage saves the current schedule and stylist roster between sessions so managers don't start from scratch each week.
Outcome
Deployed on Vercel as a pure static site — no serverless functions, no environment variables, no backend. The entire app is a single HTML file that can be opened locally or served from any static host.
The tool is in active use across both franchise locations — Parker #0467 and Roxborough #9863. Managers can build a validated, export-ready schedule in under 15 minutes instead of the previous 45–60 minute spreadsheet process. The live validation has caught floor hour shortfalls and opener/closer gaps that would previously have only surfaced on the day of.
Stack
The deliberate choice to use zero dependencies — no React, no Vue, no build pipeline — was intentional. The end users are salon managers, not developers. A single HTML file that works offline, loads instantly, and requires no installation is more reliable and more maintainable for this use case than a framework-based app. localStorage handles persistence without any backend. window.print() handles PDF export without a PDF library.
The entire app deploys in seconds via Vercel's static hosting with no configuration beyond a vercel.json cache headers file.
What I Learned
The hardest part of this project wasn't the code — it was encoding the business rules precisely enough that the validation engine catches real problems without producing false positives. The Saturday–Friday week structure, the distinction between "off" and "locked" availability, and the opener/closer logic (shift starts exactly at store open time, not just overlaps with it) all required careful definition before any code was written. Getting the rules right first made the implementation straightforward.