← Projects

Vasyo

Appointment booking SaaS for service businesses: calendar, staff, customers and reminders.

Vasyo landing page

Vasyo is appointment scheduling for small service businesses and freelancers: salons, clinics, studios, anyone who books people into time slots.

The dashboard

The business side is a Next.js dashboard. An owner sets up the business through an onboarding flow, then manages employees, services, customers and business hours. Appointments show in day, week, list and resource-timeline calendar views built on FullCalendar, with filtering and a customer detail page. Bookings made at least an hour ahead get two WhatsApp messages from scheduled jobs on Quirrel: a confirmation with the appointment’s details as soon as it’s booked, and a reminder one hour before it starts. Business hours and location settings use Google Maps, and a discover page is the start of a public side where customers find businesses.

How Vasyo works The business runs everything from the dashboard. Appointments live in Postgres, and scheduled jobs message customers on WhatsApp when a booking is made and an hour before it starts.

Parts: Business owner (staff · services), Dashboard (Next.js · Prisma), Postgres (appointments), Scheduled jobs (Quirrel queues), Email (React Email · Resend), WhatsApp (to customers).

  • Business owner to Dashboard
  • Dashboard to Postgres
  • Dashboard to Scheduled jobs (schedule)
  • Dashboard to Email
  • Scheduled jobs to WhatsApp (message)
An appointment's two messages Both jobs are keyed by the appointment's ID, and both only exist for bookings made at least an hour ahead. The reminder job loads the appointment again when it fires.
  1. Business owner to Server action: create appointment
  2. Server action to Postgres: insert the appointment
  3. Server action: start minus 1 h in the future?
  4. Server action to Quirrel: enqueue confirmation now
  5. Server action to Quirrel: enqueue reminder, runAt start − 1 h
  6. Quirrel to WhatsApp: booking confirmed + details link
  7. Quirrel: wait until runAt
  8. Quirrel to Postgres: load appointment + customer
  9. Quirrel to WhatsApp: one hour to go + link

The API

Alongside the dashboard sits a NestJS and Prisma REST API with Swagger docs, versioned routes, cookie-based authentication with guards, and transactional email through React Email and Resend. It defines the core model (businesses with categories, employees, services, customers and appointments) and ships as a Docker image.