Unified waitlist
One queue for the page and the front desk.
Online clients waiting on a cancellation and walk-ins waiting at the door live on the same surface. When an appointment frees, Flowesce picks the next match and emails them a claim link before the salon has to think about it.
Built for the salon whose phone rings about a cancellation before the cancel-confirm dialog has closed. The queue runs in the background; the front desk runs the salon.
01/
Two intake paths, one queue.
Online clients hit a Join the waitlist CTA when their date has no slots; the form captures a date window, an optional time-of-day, and contact info. Walk-ins get added by the front desk through an Add walk-in dialog on the same Waitlist page. Both kinds sit in the same list, ordered first-in first-out so nobody gets skipped.
Online intake on the no-slots step.
Inside the public booking wizard, single-service mode. Default window: their date plus 14 days, edit if they want a wider net.
Walk-in intake at the front desk.
Add walk-in dialog captures client name, service wanted, optional preferred stylist, optional time-of-day. No public-page traffic involved.
FIFO by default.
Oldest entry that fits the freed slot wins. No favoritism, no hidden ordering. Audit-friendly.
Seat-now button on walk-ins.
On any walk-in row, one click drops them into an appointment starting immediately. Lands on the calendar, no payment up front; checkout the usual way.
02/
Auto-match the moment a slot frees.
Every cancellation and every reschedule triggers a post-commit scan of the queue. We pick the oldest entry whose service, branch, staff preference, date window, and time preference fit the freed slot. The row gets atomically reserved (no double-claim race), the customer gets an email with a one-click claim link, and the salon sees a Waitlist match bell notification.
Two-hour hold.
The claim link reserves the slot for two hours. Plenty for a phone check, not so long the slot rots while one person ignores email.
Race-safe claim.
The public claim page at /book/your-slug/claim/token creates the appointment against the same exclusion constraint a normal booking uses. Two people trying to claim the same slot, only one wins.
Bell on every match.
A WAITLIST_HIT notification fires for owners and managers so you know a slot is on hold. Drill in to see who, for what, until when.
Match respects every preference.
Service first. Branch second. Staff preference (if set) third. Date window. Time-of-day preference. If a slot fails any check, the next row in the queue gets a look.
03/
Stale claims sweep themselves out.
A daily cron at 06:00 UTC expires NOTIFIED rows where the two-hour hold has lapsed and nobody claimed. The slot reopens on the public booking page, the next person in line gets a fresh look on the next freed slot, and the queue stays honest. No manual cleanup, no rows pinned forever.
04/
Both queues on one screen.
The /waitlist admin page splits into a Walk-in queue section at the top and an Online waitlist section below. Each row shows the client name, the service, the staff preference, the window, and a Remove action. Each ONLINE row that's currently on hold shows the claim deadline so you know how much rope is left.
Remove with a reason.
Pull a row when the client phones in and books another date. The remove records who and when so the audit stays clean.
Sidebar entry under Manage bookings.
Waitlist sits next to Requests. The two surfaces where clients are asking for something and the salon decides.
Confirmation email on join.
Online intake gets a WaitlistJoined email immediately so they know they're in the queue, not in a void.
Slot-available email on match.
WaitlistSlotAvailable email with the claim link and the two-hour expiry. Plain copy, single CTA.
05/
What the queue does to your no-show rate.
A salon running a tight calendar with a fast queue turns same-day cancellations into same-day fills. A four-chair salon with two cancellations a week and an active waitlist recovers most of that revenue without a phone call. The math is in the queue length and the speed of the email; both are under your control.
Common questions
Honest answers, including the ones we don't love.
Does the auto-match respect the booking policy?
The auto-match scan runs when a slot is freed by any path (admin cancel, client cancel, reschedule). If a late-cancel fee was triggered on the freeing appointment, the fee lands the usual way; the slot freeing is independent of how it freed.
Can a client be on the queue for multiple services?
Each row covers one service. A client wanting two different services on the same day enters two rows. The auto-match scans each row independently, so the first one that fits wins.
What stops two clients claiming the same slot?
The same Postgres exclusion constraint that protects every booking against double-claim. The first claim through commits; the second hits the constraint and gets a clean error with a Find another slot CTA.
Do walk-ins block online matches while they sit in the queue?
Yes for the slots they fit. A walk-in waiting for any haircut with any stylist blocks the next free haircut slot. Add a stylist preference or a time-of-day to a walk-in row and the queue gets more selective.
Can I run the queue without auto-matching?
Today the auto-match is the headline behavior. Manual-only mode (queue exists, no auto-email) is on the post-launch list if salons ask. For now, removing the row by hand stops the auto-match for that client.
Pairs well with
Fourteen days. No card.
Try Flowesce on a real Saturday.
No card required, no auto-charge at the end. If Flowesce isn't for you, export everything in one click and walk.