Calendars, availability and payments — with double-booking made impossible by design.
Before you read: Written from live engineering practice — the money-moving, million-user work our team runs on our own products, set down so anyone building something can learn from it.
01 · What it is
A booking system lives or dies on one promise: no two customers get the same slot. We build availability systems where the conflict is impossible by design — row-locked calendars, atomic booking logic and waitlists — not just by discipline. Clients and staff get dashboards that show reality in real time, deposits and holds move money correctly, refunds follow the right rules, and reminders chase no-shows before the empty chair costs you again. Rescheduling shifts records, not just the calendar.
What a booking & reservation systems build covers:
Booking systems at TGJOF live or die on one guarantee: no two customers are ever promised the same slot. On top of that guarantee sits money — a deposit to hold a slot, a balance at the door, a refund when plans change — and every shilling has to move with the same exactness as the availability promise itself. We engineer capacity at the database level, wire deposits and holds into proper payment machinery, and make refunds follow policy rather than mood. The result is a calendar that cannot double-book and a ledger that still balances after the cancellations.
What we do
How we do it
02 · The full discipline
Every booking system fails in the same two ways: a customer is told a slot is free when it is not, or two customers are told a slot is theirs at the same moment. The first is an inventory lie; the second is a concurrency failure. Both cost trust, and in Kenya the stakes are compounded because the booking is usually tied to money — a deposit via M-Pesa, a paid reservation, a no-show charge against a real wallet.
We build booking and reservation systems the way a payments studio has to, because KodiiPay is a live platform that moves real money on Safaricom's Daraja rails — STK pushes, deposits, holds, escrow, payroll-grade disbursements, idempotent callbacks and daily reconciliation. We bring that exact discipline to capacity: availability locked at the database level, double-booking made structurally impossible, deposits and refunds accounted to the shilling, and reminders that actually reach the customer in a market where SMS and WhatsApp are the real calendar.
Below is how we build booking systems that keep their promise — the availability engine, the row locks that make double-booking impossible, deposits and holds, payment-at-booking versus payment-at-service, no-show policies, reminders, waitlists and the honest limits of scheduling capacity.
03
Books can be sold twice and the customer can be given another copy. A haircut or a consultation that is doubled cannot be unbought — the chair was literally there once. A booking system therefore lives or dies on its single most important guarantee: at no moment, under no concurrency, does the same slot get promised to two people. Everything else is surface.
We have watched a naive booking module double-book a clinic and turn a paid customer into a shouting one. The architecture below makes that moment impossible by design, not polite by convention.
04
The naive way is to 'check availability' in the app and then create the booking — polite, and wrong, because between the check and the write another customer can seize the slot. The correct way is atomic: the check and the reservation happen in one locked operation, exactly like the check-and-move on a wallet:
A double-booking is not a UX bug; it is a contract violation with a complaining customer attached. We make the contract binding at the database level, and then we prove it with tests.
05
Beyond the single slot lies the shape of the whole calendar: rooms, staff, equipment, durations, buffer times and overrides. Inventory of capacity must behave like honest stock — it reflects reality, updates atomically, and is never optimistically generous:
A calendar that sells to capacity then cancels on reality is a calendar that burns trust. We build the inventory of capacity to match reality before the promise is drawn.
06
When the booking involves money — a deposit to hold a premium slot, a paid reservation, a rental advance — the booking machine becomes a payments machine. We run those flows on the same escrow and ledger discipline our own wallets run on:
A booking whose money is uncertain is not really a booking. We wire deposits and holds into exact payment machinery so the slot and the shilling are one promise.
07
For a Kenyan booking the deposit will usually arrive as an STK push, and that remains the lived core of any build here. Yet the same deposit desk meets Visa and Mastercard payers, PayPal and Stripe customers, PayStack where it is the local default, and businesses that prefer a direct bank transfer. We board every one of those rails into the booking's money machine — the same holds, the same verification, the same single-time refund — so the rail a customer chose can never weaken the promise the booking made:
The rail is the customer's choice; the discipline is ours. We wire every collection route through the same honest machinery so a booking's promise — and its money — holds no matter how the customer pays.
08
Many Kenyan businesses — consultations, classes, short stays — take the booking free and collect money at service. That model is simpler but not without its own machinery: the booking still holds capacity, the no-show still costs, and the collection at the door still has to be captured, receipted and reconciled:
The no-deposit model is a deliberate business choice, and we make it safe rather than naive. Book-free today, but the machine still knows who holds which slot and whether they paid.
09
Cancellation is where a booking system is tested hardest — the customer's willingness to book again, and the business's revenue policy, collide in one moment. A refund is a payment event and must obey the same rules as the deposit that created it:
The refund flow is the deposit flow inverted, and it must be just as rigorous. We build it so a cancelled booking never becomes a burned relationship or a hole in the books.
10
A no-show costs a slot twice — the lost revenue and the customer who could have taken it. The machine cannot prevent every no-show, but it can surround the risk: policy, reminders and the waitlist re-cool the window so an empty chair is rare rather than inevitable:
No-shows are a revenue leak we can shrink, not an act of God. Policy, reminders and the waitlist work together so the empty chair is the exception, not the routine.
11
In Kenya the booking reminder competes with a life lived mostly on a phone — and the channels that actually reach people are SMS, WhatsApp and push, not an email that waits in a tab nobody opens. We engineer delivery the way delivery should be engineered: tracked, fallbacked and observable:
A reminder that vanishes into a silent channel is a reminder that might as well not exist. We engineer deliverability itself — and the customer hears, and you have proof they were reached.
12
Rescheduling is the most common request a booking desk receives, and the naive version is chaos: cancel here, rebook there, and the money state loses track of where it is. We treat a reschedule as what it is — one atomic move of the slot and the financial record together:
A reschedule is a goodwill moment that can easily become a financial mess. We make the slot move and the money move one single atomic fact.
13
A waitlist turns refusal into relationship. The customer who could not get the slot is not sent away — they are told 'when it opens, you will know.' The machinery behind that promise has to be honest and automatic, not a human remembering to call:
The waitlist is the revenue the no-show would have cost. We build it so the empty chair has a person's name on it within seconds.
14
The customer books on a phone; the front desk runs the same reality on a terminal; the owner watches it on a dashboard. If those three calendars can disagree, the desk becomes the place where promises break. We build one source of truth and surface it everywhere:
Calendars that disagree are how promises get broken twice. We build one truth and let every surface argue against it if it wants — the record wins.
15
Friday evening at a salon, a clinic's Monday morning, a hotel's December — the moment everyone calls at once is exactly when the system must be most honest. The same concurrency discipline that protects money on our own platform protects the calendar:
Concurrency bugs on calendars reproduce exactly when the business is busiest and most embarrassed. We engineer them out of the architecture and prove it with tests that simulate the exact peak.
16
A customer on a shaky connection taps 'book' twice. A payment callback arrives twice. A reminder job and a human both try to contact the same waitlist entry. Without idempotency, every one of those is a second booking, a double charge or a double message. Idempotency is the personality of the booking record itself:
Your customer's network may hiccup, the gateway may redeliver and your staff may double-click. All of that is survivable when the booking remembers itself. Ours do.
17
A booking calendar is a real business asset, which means it is also a target: a competitor books every slot then cancels, a bot scraper hammers availability, an attacker floods paid deposits. Abuse is structural, and the controls are structural:
The legitimate customer books one slot in under a minute with zero friction; the abuser meets a wall at every route. Structural rules, not hoping.
18
A clinic that takes deposits by STK, collects balances at the door and processes refunds weekly has decided, by the end of each day, whether its deposit pot matches its statement. That decision must not be a spreadsheet ritual:
The deposit pot is not a hope; it is a number that must prove itself daily. We build the proof as a system from the first sprint.
19
The process is the same from a one-chair salon to a national operator. It is staged, honest and delivered in increments a business can absorb:
You own the calendar data, the ledger, the code and every gateway key. No hostageware — the booking machinery is yours.
20
Because a booking is a promise and money is attached, we are direct about the trade-offs — the ones a vendor who wants the logo would never mention:
We will tell you honestly when a business does not need the full capability — and give the smallest correct build. And when it does, this is what a booking system that keeps its promise looks like.
The toolchain
This is the stack that makes a double-booking structurally impossible and a deposit accounted to the shilling — built the way a live payments platform builds its machinery.
01
The ground truth of capacity
02
The promise, made exactly once
03
Where the slot meets the money
04
Reaching the booker reliably
05
Bookings reconciled to the shilling
06
One truth, many faces
07
Running the calendar while you sleep
Lifecycle
Every booking system we build passes through the same arc, from the first map of the real calendar to the operated promise. The deposits and locks are part of the build from week one.
01
Map every resource, slot shape, duration and money rule in the operation; find where double-booking and lost revenue already live.
02
Resources, durations, buffers, capacity and operating hours defined as the ground truth the calendar derives from.
03
Slot and capacity row discipline, FOR UPDATE and atomic check-and-reserve specified before screens.
04
Deposits, holds, at-door payment and refunds set against real rails with exact forfeit and fee arithmetic.
05
STK captures, verifications and refunds rehearsed against genuine callbacks with failure drills.
06
SMS, WhatsApp and push delivery wired and tracked with automatic channel fallbacks.
07
Named entries, instant handoff and confirmation clocks built with the core booking.
08
Customer flow, staff grid and owner dashboard wired to the one record.
09
Simultaneous doubles, peak races, callback replays, no-show charges, refunds — simulated in the build.
10
Monitoring on booking and money paths, expiry sweeps, support logs, incident runbooks.
11
Deposits matched by reference and totalled against the statement; anomalies surfaced, never silent.
12
More locations, service types and volume — added to the architecture, never as a bolt-on.
Closing
A booking system is a promise about capacity, a payments machine, and a reminder service — built to the standard of a live money platform. That includes:
A booking platform is judged on the one violation it never makes: promising the same moment to two people. Everything above exists to make that violation impossible.
We run payment machinery like this every day. When your calendar needs to keep its promise, you get the discipline that survived being live — not the one that survived only a demo.
Previous capability
E-commerce
Next capability
Communication Systems
The discipline above is what we run on our own products every day. If it would help on yours, our door is open.