Skip to content
Slotwise

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.

Tue 3 Nov, Dr Amira KhanUK time
  1. 09:00Priya N., follow-up
  2. 09:45Free
  3. 10:30Free · 0 trying
  4. 11:15Free
  5. 12:00Tom W., sports massage
POST /bookings 10:300/100

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

00:00
01:00Doesn’t exist, no slots
02:00Clocks jump to BST
09:0009:00 local, 08:00 UTC

Sun 25 Oct 2026

00:00
01:00Happens twice, offered once
02:00Back on GMT
09:0009:00 local, 09:00 UTC

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.

Look around the demo
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. 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. 2

    PostgreSQL accepts or refuses

    The exclusion constraint is the final word. A taken slot returns 409 SLOT_TAKEN, never a second booking.

  3. 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. 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