PROTOTYPE · 2024
Meridian.
Direct booking for boutique stays
Context
Small hotels depend on booking aggregators that charge heavy commissions and force every property into the same template. I built Meridian as a prototype to understand what a direct-booking system actually requires — not the surface, the guarantees underneath.
The problem
Reservations look like a UI problem and are actually a correctness problem: availability, rates and payment confirmations must stay consistent under concurrency. The interesting question was how to make double bookings and phantom payments structurally impossible instead of handling them in support.
My role
Sole developer — system design, availability model, payments and booking flow.
What made it technically interesting
Availability has to be checked at the moment of booking, under concurrency — two users booking the last room at the same time must both get a truthful answer.
Payment state and reservation state live in two systems (the app and the payment provider). Keeping them synchronized is where most booking systems drift.
Each property needs its own identity, but a per-property fork would make every fix a fleet-wide operation.
Decisions
- Availability as the core invariant
- Reservations, holds and rate restrictions all go through one availability service with transactional checks. Double bookings became structurally impossible instead of a support ticket.
- Payments confirmed by webhooks, not redirects
- A reservation only confirms when Stripe's webhook arrives — a user closing the tab after paying can no longer create a phantom booking.
- Per-property theming without per-property code
- Palette, typography and imagery are configuration data, not forks — a new property is an onboarding step, not a deploy.
Result
- The availability service makes conflicting reservations impossible at the database level, not by convention.
- Payment state can only advance through webhook events, so the system can never show a confirmed booking that wasn't paid.
- Properties are data — the prototype demonstrated that a new property needs no code changes.
What I learned
Invariants first. Once availability and payment state are guarded by design, everything else in a booking system becomes a much simpler problem.
Have a project in this space?
Let's talk about it