← All work

Letzstay — Direct booking without the middleman

Letzrent manages properties on behalf of hosts across multiple rental platforms. We built Letzstay — their direct B2C booking portal — on WordPress, with a custom integration layer that bridges a market-leading property management system's incomplete API, a Stripe payment flow, and a reliable calendar state machine. Guests can now book directly. The PMS never knew there was a problem.

Client Letzrent
Year 2025
PHPWordPressStripeREST APIChannel Manager Integration

Brief

Letzrent handles the full operational stack for property owners: listing across rental portals, booking management, guest communication, cleaning schedules. The owner provides the property; Letzrent handles everything else.

The brief was to give Letzrent a direct B2C channel — a booking portal where guests could discover and reserve properties without passing through Booking.com, Airbnb, or any other intermediary. The platform needed to sit on top of the property management system already in use, not replace it. Whatever a guest did on Letzstay had to land correctly in the PMS, and whatever the PMS already knew about availability had to surface correctly on Letzstay.

The constraints

The property management system’s public API is functional in some areas and limited in others — a combination that creates specific engineering problems.

Calendar availability is the clearest example. To determine whether a property is available over a given date range, the straightforward read of the API would require querying each day individually. The alternative — pulling all existing bookings and reconstructing the calendar client-side — is feasible but expensive and fragile at scale. Neither approach was acceptable for a booking interface where users expect instant, accurate responses.

Payment is not handled by the PMS at all. The API accepts bookings but has no concept of payment capture, authorisation, or failure. Any money movement had to be built entirely outside it.

This combination — a calendar that cannot be queried efficiently and a payment layer that does not exist — meant the booking flow could not be assembled from off-the-shelf parts. We had to build the connective tissue ourselves, and that connective tissue had to be reliable enough to operate without supervision.

Approach

WordPress was the chosen platform. Not for its booking capabilities — WordPress has none worth building on here — but because Letzrent’s team lives in it, and the right answer is a system the client can maintain, not a system only we can touch.

The calendar problem was solved by synchronisation rather than live querying. Rather than asking the PMS for availability on demand, we maintain a local calendar state that syncs with the PMS on a defined schedule and on booking events. The booking widget reads from local state. The result is fast, accurate responses for users without hammering the API, and a calendar that reflects reality without reconstructing it from scratch on every request.

Stripe was integrated as the payment layer. This introduced the class of failure that any honest payment integration must handle: the booking is reserved but the payment does not complete. Connection drops mid-transaction. The user closes the tab. The card is declined after the slot has been held.

Each of these failure modes needed a defined resolution path. A reservation that is not paid within a fixed window is released back to the calendar automatically. Partial states — reservation confirmed, payment pending — are resolved explicitly, not left to accumulate. The PMS is only updated once a transaction reaches a terminal state.

What we delivered

  • A WordPress-based B2C portal for property discovery and direct booking
  • A custom PHP integration layer bridging the PMS API and the site’s booking flow
  • Local calendar synchronisation: availability derived from a maintained local state, not live API queries
  • Stripe payment integration with explicit handling of all failure paths: timeout, connection loss, declined card, user abandonment
  • Automatic reservation release for incomplete transactions after a defined window
  • PMS update logic gated on transaction completion — no orphaned bookings in the management system

Outcome

Guests can book directly on Letzstay without touching Booking.com or Airbnb. Letzrent retains the margin that would otherwise go to the platform. The property management system continues to operate as it always did — it receives clean, complete bookings, with no visibility into the complexity that sits between it and the guest.

The integration handles the PMS’s limitations transparently. From the PMS’s perspective, bookings arrive correctly formed. From the guest’s perspective, the calendar is accurate and payment works. The layer in between is invisible because it is supposed to be.

What we took away

The most instructive part of this project was not the Stripe integration or the calendar sync in isolation — it was the combination. When payment and availability are managed by different systems with no native coordination, the edge cases multiply. A booking flow that handles the happy path is straightforward to build. A booking flow that handles every exit from the happy path — and cleans up correctly each time — is the actual work.

Letzstay is in production. It works.

Ready to start a project?

Tell us about what you need. We will respond with a clear, honest assessment.

Start a conversation