Self-hosted appointment software: the first hour
Self-hosted appointment software, hour one: the order to do things in, the cron line reminders need, and the settings that decide the rest.
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.0 or newer 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 behaviour 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.0 or newer 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 behaviour.
Can the setup be moved to a different server afterwards?
Yes. It is files plus one database, so a move is a copy and a restore. The licence 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.