self-hosted SaaS appointment software setup is a query typed by somebody who has already decided. They have the files, or they are about to, and what they want is the order to do things in -- because the difference between a booking page that works and one that quietly offers the wrong slots is almost entirely a matter of which settings were touched first.
This is the first hour, in order, with the two things that will wait on a scheduler named up front so they do not surprise you at the end.
Before anything: the host
Slotly runs on PHP 8.1 or newer (tested on PHP 8.3) with PDO, and either MySQL, MariaDB or SQLite. That is ordinary shared hosting with mod_rewrite, or an Nginx box, and no container runtime is involved. SQLite is the quickest way to see the thing move; MySQL or MariaDB is where a live booking page belongs. If you are new to putting a PHP app on a server at all, the store's own ten-minute install guide walks the general shape, and it is worth reading once before the clock starts.
Try the Slotly demo ↗Live, on sample data, no sign-up.
Two decisions belong to this stage rather than later. Pick the domain the booking page will live on, because that URL is the thing you will be sending to customers for years. And decide that it will be served over HTTPS, because a booking form collects names, addresses and reasons for appointments.
Minutes ten to twenty: services and people
Create the services before the staff. A service carries its duration, its buffers and its deposit, and every later setting hangs off it, so a half-defined service list makes the availability work twice.
Then the staff, and here the first hour usually goes wrong in the same way: people set opening hours for the business and move on. Hours in Slotly are per person and per weekday, including split shifts, and the booking page offers exactly what that pattern allows. A member of staff who works Tuesday mornings and Thursday afternoons is two patterns, not an average.
Minutes twenty to thirty-five: the constraints that stop the phone ringing
This is the highest-value quarter of an hour in the whole setup.
Buffers. Prep time before and cleanup after, per service, so back-to-back bookings leave the room in a usable state.
Minimum notice. The gap between now and the earliest bookable slot. Without it, somebody books the appointment starting in four minutes.
Booking horizon. How far ahead the page will sell. Without it, somebody books next August.
Blackout dates. Holidays and closures, entered once, so they are never offered.
Capacity, where a slot is a class. A group session takes a ceiling and stops there.
Set these five and the majority of awkward phone calls stop happening.
Minutes thirty-five to fifty: deposits, reminders and the two cron lines
If you take deposits, the amount is set per service and your own payment page is pasted in once. Slotly quotes the amount on the booking page and shows the pay link beside it; no card number reaches your server, and no refund happens in the app.
Reminders and any other scheduled behavior wait on cron. Slotly runs no background jobs by itself: one cron line enables the automatic email reminders, and the mail goes out through your own SMTP server or PHP mail. Until that line exists, reminders do not exist. This is the single most common thing left undone in an install that otherwise looks finished.
The last ten minutes: feeds, the phone, and a backup
Issue the calendar feeds. Token-guarded read-only .ics feeds -- one per staff member or one for the team -- let each person subscribe from Google, Outlook or Apple, and revoking a token turns that one feed dark. The feeds run one way: they show the diary and never read a private calendar back in, so availability comes from the hours you set rather than from anyone's personal diary.
Add the booking admin to a phone home screen if the front desk is a phone. It installs from the browser as a full-screen app served from your own server, with no app store involved, and business data is deliberately never cached offline, so what is on screen is always live rather than plausible.
Then take a backup before a single real customer uses it, and read the backup file. A backup nobody has opened is a hope.
Questions people ask
What is the minimum a shared host needs? PHP 8.1 or newer (tested on PHP 8.3) with PDO, and MySQL, MariaDB or SQLite. Apache or LiteSpeed with mod_rewrite, or Nginx. Nothing else.
Why are reminders not sending? Almost always because the cron line is missing. The application runs no scheduler of its own, so until cron calls it, nothing goes out -- and the same applies to every other scheduled behavior.
Can the setup be moved to a different server afterward? Yes. It is files plus one database, so a move is a copy and a restore. The license covers the number of sites, not a particular machine.
Where to look next
The product page is Slotly, which lists what the install needs and what the product deliberately leaves out. The side-by-side sets it against the hosted services, and the appointment-software alternatives page is a common comparison. For what those hosted services charge before you commit to running your own, read the observatory: each figure is quoted verbatim beside the date it was read and a link to the page it came from. Prices are on the observatory; read them on the date shown there.