Slotify
Appointment booking where the database guarantees one winner per slot
Decision
Confirming a booking writes a uniqueness-constrained lock for that exact vendor and time, so the database decides. If two people confirm the same slot simultaneously, both may pass the check but only one write succeeds. The second is rejected and that user is told the slot is unavailable and picks another time.
Why
Checking availability and then inserting a booking leaves a window where two requests can both pass the check, and any fix written in application code sits in the same layer as the race.
Cost
The tradeoff is a worse moment for the loser, who finds out after confirming rather than never being shown the slot, in exchange for silent double-booking being impossible. Locks release on cancellation, completion or no-show, returning the slot to the pool.
Decision
Availability is a fixed weekly template plus single-date blackouts rather than recurrence rules.
Why
Vendors describe their hours as "open Monday to Friday, nine to five, closed on these days". Full recurrence rules would have been more expressive and would have modelled how nobody actually talks.
Cost
An annual holiday must be re-entered every year, and a lunch break cannot be expressed as working hours at all, so it has to be carved out as a blackout in the middle of the day.
Decision
Everything is pinned to Africa/Addis_Ababa, with local-to-UTC conversion as a hardcoded minus three offset.
Why
That is correct only because Ethiopia is permanently UTC+3 with no daylight saving. The reverse conversion uses proper timezone handling. Stored instants are genuine UTC, and the API returns both the UTC instant and Addis wall-clock time so clients do no timezone arithmetic. It is a deliberate shortcut scoped to one market.
Cost
It breaks in any DST zone.
Stack
- MongoDB: Unique index constraints enforce one lock per vendor slot.
- Express: Reservation and confirmation endpoints.
- React: Booking interface and weekly schedule configuration.
- Node: Availability and timezone conversions.
Screens



