Open source, MIT licensed
Appointment booking that can’t double-book.
Slotwise is a booking engine for UK clinics, solicitors, tutors and driving instructors. Add one tag to your website. Customers pick a time, the database refuses any clash, and every confirmation email arrives.
The demo resets every night and never sends email.
- 09:00Priya N., follow-up
- 09:45Free
- 10:30Free · 0 trying
- 11:15Free
- 12:00Tom W., sports massage
Sending at once…
What Slotwise guarantees
No double-bookings
PostgreSQL refuses overlapping appointments with an exclusion constraint, so a clash can’t slip past app code.
100 parallel requests give one 201 and 99 × 409
Right across clock changes
Hours are planned in UK wall-clock time and stored as instants. A 9:00 appointment stays at 9:00 in March and October.
All four 2026–2027 clock changes are tested
Emails that always arrive
Each booking change writes an outbox event in the same transaction. A worker sends it, retries it and never sends it twice.
Survives a crash on either side of the commit
Clocks change twice a year. Appointments don’t move.
On the last Sunday in March, 01:00 to 01:59 never happens. In October it happens twice. Most booking tools quietly shift appointments by an hour or offer times that don’t exist.
Slotwise keeps working hours as UK wall-clock minutes and bookings as exact instants, and converts between them with the Temporal API. Durations are real elapsed time, and the dashboard always says “UK time”.
Sun 29 Mar 2026
Sun 25 Oct 2026
Two lines on any website.
WordPress, Laravel, Squarespace or plain HTML. The widget is a Web Component in its own Shadow DOM, so your site’s CSS can’t break it. It’s about 5 KB gzipped, matches your brand colour and works on phones.
<script src="https://your-domain/widget/v1.js" defer></script>
<slotwise-booking business="your-clinic"></slotwise-booking>No website? Every business also gets a hosted booking page, and each customer gets a private link to cancel or move their appointment.
Everything the front desk needs.
One dashboard for the owner and their team, on desktop or phone. Owners manage the business; staff manage their own diary.
- Calendar
- Day and week diary for everyone, or one person.
- Bookings
- Search, add walk-ins, cancel or move with one click.
- Customers
- History per customer, and erase on request.
- Services
- Length, price, and buffer time before and after.
- Staff
- Invite staff. They see only their own diary.
- Hours and time off
- Split shifts, holidays and one-off changes.
- API keys
- Scoped keys for your own systems, revocable any time.
- Webhooks
- Signed events with retries and a delivery log.
- Audit log
- Who changed what, and when. No personal data stored in it.
A REST API you can retry safely.
Book from your own app or phone system. Every write takes an Idempotency-Key, every error has a stable code, and the OpenAPI docs are generated from the same schemas that validate requests.
curl -X POST "$API/v1/bookings" \
-H "Authorization: Bearer $KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"serviceId":"…","staffId":"any",
"startsAt":"2026-11-03T10:30:00Z",
"customer":{"name":"Sam Taylor", …}}'What happens when someone books
- 1
A customer picks a time
A pure slot engine works out free times from hours, time off, buffers and existing bookings in about 16 ms.
- 2
PostgreSQL accepts or refuses
The exclusion constraint is the final word. A taken slot returns 409 SLOT_TAKEN, never a second booking.
- 3
An outbox event commits with it
The booking and its event are saved in one transaction, so a crash can’t lose the email.
- 4
The worker sends and retries
Confirmation, reminder and webhooks go out with deduplicated job ids. Stale reminders send nothing.
Run it on your own server.
Node.js 24, PostgreSQL 16 or newer and Redis. No Docker and no paid cloud services. Your customers’ data stays on a machine you control, and the code is yours to change under the MIT licence.
# clone, then one command sets everything up
git clone https://github.com/ToukirOfficial/slotwise.git
cd slotwise
pnpm run setup
pnpm dev