$30–90
Vagaro/mo (per staff tier)
$99–699
Mindbody/mo (bloated)
$200–500
Meevo/mo (enterprise)
$176+
Boulevard/mo (premium)
Free–$13
Fresha/mo per seat
$49
Your target price/location
What owners hate about existing tools
- Mindbody $159–699/mo — brutal for a 3-person salon. Outdated interface. Slow mobile app. Complex setup takes weeks.
- Mindbody Frequent price hikes. Charges extra for features that should be standard. Poor mobile experience in 2026.
- Vagaro Cluttered UI with too many features. Glitches in payments and client profiles. Limited customisation for niche workflows (e.g. natural hair).
- Vagaro Never sends new clients from their marketplace. Owners still do all their own marketing. Referral tracking is reserved for Vagaro itself.
- Meevo $200–500/mo, built for large chains — not a 3-person barbershop. Complex, requires weeks of implementation.
- Boulevard Beautiful interface but $176+/mo — hard to justify for small single-location salons.
- Fresha Free model charges transaction fees and pushes marketplace leads to competitors. Owners feel they're working for Fresha.
The real gap your $49 product can fill
Almost every tool is either too cheap and basic (Booksy, Acuity) or too expensive and complex (Mindbody, Meevo, Boulevard). The $49 flat-rate slot for a clean, fast, mobile-first tool aimed purely at single-location beauty businesses is genuinely under-served.
Square Appointments already charges $49/mo per location for teams — which means the market has already validated exactly your price point. You need a better product, not a lower price.
MVP feature set (v1 — what you vibe code first)
Only build what a single-location beauty business needs to go live and take bookings.
- Core Online booking page — public, shareable, embeddable link
- Core Service catalogue — name, duration, price, which staff can do it
- Core Staff calendars — individual schedules, working hours, breaks
- Core Client profiles — name, contact, booking history, notes
- Core SMS + email reminders — automated 24h and 2h before appointment
- Core Card-on-file deposits — to protect against no-shows
- Core Simple POS — checkout after appointment, accept card via Stripe
- Core Owner mobile dashboard — today's appointments, quick reschedule
v2 features (after first 50 paying customers)
- Growth Waitlist management — auto-fill cancellations
- Growth Rebooking nudges — "It's been 6 weeks, time to book again?"
- Growth Simple inventory tracking — product retail sales
- Growth Gift cards — digital, redeemable at checkout
- Growth Basic revenue reports — daily/weekly/monthly
- Growth Multi-staff payroll summary — commission or hourly
Do NOT build: marketplace, class scheduling, membership tiers, email marketing builder, franchise tools, or API integrations in v1. These are what bloat Vagaro and Mindbody. Resist the urge.
Vibe coding prompt 1 — project scaffold
Create a Next.js 14 app router project called "bookslot" for a salon booking SaaS.
Stack: Next.js, Tailwind CSS, shadcn/ui, Supabase, Prisma, Stripe, Twilio.
Create the following database schema in Prisma:
- Business (id, name, slug, email, phone, timezone, stripeCustomerId)
- Staff (id, businessId, name, email, color, isActive)
- Service (id, businessId, name, durationMins, price, staffIds[])
- WorkingHours (id, staffId, dayOfWeek, startTime, endTime)
- Client (id, businessId, name, email, phone, notes)
- Appointment (id, businessId, staffId, serviceId, clientId,
startTime, endTime, status, depositAmount, stripePaymentIntentId)
- Reminder (id, appointmentId, type[sms/email], scheduledAt, sentAt)
Generate the Supabase migration. Set up row-level security so each
Business can only see its own data.
Vibe coding prompt 2 — booking page
Build the public booking page at /book/[businessSlug].
Flow:
1. Show business name, services list with duration + price
2. Client selects a service → see available staff (or "any available")
3. Select staff → calendar shows available slots for next 14 days
4. Select slot → form: client name, email, phone
5. If deposit required → Stripe card-on-file via SetupIntent
6. On confirm → create Appointment in DB, send confirmation email
via Resend, schedule SMS reminder via Twilio
Design: clean, mobile-first, single column flow.
Use shadcn/ui Card, Button, Calendar components.
No login required for the client.
Vibe coding prompt 3 — owner dashboard
Build the owner dashboard at /dashboard.
Pages needed:
1. /dashboard — today's appointments in timeline view,
quick stats: appointments today, revenue today, no-shows this week
2. /dashboard/calendar — week view calendar (react-big-calendar),
color-coded by staff, click appointment to view/edit/cancel
3. /dashboard/clients — searchable client list,
click to see full history and notes
4. /dashboard/services — add/edit/delete services and pricing
5. /dashboard/staff — add staff, set working hours per day
6. /dashboard/settings — business name, booking URL,
deposit settings, notification preferences
Auth: Supabase Auth, email + password.
Mobile-first layout — sidebar collapses to bottom nav on mobile.
Vibe coding prompt 4 — billing + onboarding
Build subscription billing and onboarding flow.
Billing (Stripe):
- On signup, create Stripe Customer for the business
- Offer 14-day free trial, then $49/month (create Price in Stripe dashboard)
- Webhook: handle subscription.created, invoice.paid,
subscription.deleted (disable booking page if payment fails)
- Show billing status in /dashboard/settings
Onboarding wizard (shows once after signup):
Step 1: Business name, timezone, phone
Step 2: Add your first service (name, duration, price)
Step 3: Add yourself as staff, set your working hours
Step 4: Copy your booking link — share it on Instagram,
add to Google Business Profile
Goal: owner is live and taking bookings in under 30 minutes.
Vibe coding prompt 5 — reminders engine
Build the automated reminder system.
On appointment creation:
1. Schedule a Twilio SMS 24 hours before:
"Hi [ClientName], reminder: you have [Service] with [Staff]
at [BusinessName] tomorrow at [Time]. Reply STOP to opt out."
2. Schedule a Twilio SMS 2 hours before:
"Your [Service] appointment is in 2 hours at [Time].
[BusinessName] — [Phone]"
3. Send booking confirmation email via Resend immediately.
Use a Vercel Cron Job (/api/cron/reminders) running every 15 mins
to check Reminder table for rows where scheduledAt <= now
and sentAt is null. Send, then update sentAt.
Handle opt-outs: if Twilio receives STOP reply,
set client.smsOptOut = true and skip future SMS.