Eli Benhaim

Case study · Hotel Beit Maimon

A Hebrew-first booking page that keeps every feature of the hotel's booking engine.

Problem
A boutique hotel wanted guests to book online in Hebrew, on a page that looks like its own site. Its booking engine already handled rooms, extras and payment. It just didn't look like the hotel, and it wasn't built for Hebrew.
Role
I built it alone, on a client contract: the booking page, the staff dashboard, the booking button and a custom theme for the booking engine.
Stack
  • SvelteKit
  • Svelte 5
  • TypeScript
  • Cloudflare Workers
  • D1
  • Drizzle
  • KV
  • CSS
Result
Live at booking.maimon.com since March 2026, on Cloudflare's free plan.
01 · Context

Context

Hotel Beit Maimon is a boutique hotel in Zichron Ya'akov. It runs on RezStream, a hotel management system with its own booking engine. That engine already does the hard parts: multi-room stays, extras, guest details and payment.

My first version replaced most of it. I pulled live availability and prices from RezStream's API and built my own room cards, extras and checkout. Then I hit a wall. The API can't put more than one room in a cart.

So I flipped the approach. The hotel's engine now runs the booking, inside an iframe on my page. I wrote a custom theme for it, so it looks like part of the site. My page handles the search, in Hebrew or English. A floating button opens it from any page of the hotel's site.

Before I touched any code, I wrote down what to keep, what to delete and the order to do it in. The app went from eight database tables to two.

02 · Architecture

Architecture

dates + roomsHotel websiteone script tagBooking pageSvelteKit on WorkersRezStream engineiframe, custom themeStaff dashboardmagic-link loginD1 and KVsettings, text, sessions
  1. Hotel websiteone script tag → Booking page
  2. Booking pageSvelteKit on Workers → RezStream engine · dates + rooms→ D1 and KV
  3. RezStream engineiframe, custom theme
  4. Staff dashboardmagic-link login → D1 and KV
  5. D1 and KVsettings, text, sessions
Fig. 1 · The guest path. My page handles the search. The hotel's engine handles the booking.
03 · Decisions

Three decisions

Decision 1
Choice
let the hotel's own engine run the booking, inside an iframe, under my theme.
Why
RezStream's API can't put more than one room in a cart. Rebuilding the whole flow would leave a small hotel paying to maintain two booking systems.
Cost
my page can't see what happens inside the frame. The theme can only add CSS on top. The engine's HTML is off limits.
Decision 2
Choice
ask for dates and the number of rooms. Nothing else.
Why
the engine already knows how many guests each room fits. Guests pick their party size on the room card.
Cost
someone booking one room sets the guest count a step later than they might expect.
Decision 3
Choice
use the same colours, fonts and spacing on both sides of the iframe.
Why
the page and the engine come from two different companies. Shared styles make them feel like one site.
Cost
the styles live in two places. If the brand changes, I update both.
04 · What broke

What broke

The third adult. The hotel charges extra for a third adult. A search for two guests showed 946₪ a night, but the same room for three was 986₪. The hotel wouldn't launch with the wrong price. I tried every guest parameter I could find, including the format from RezStream's own form tool. None of them worked. RezStream support sent a different format, and when I tested it, guest counts only worked for one room. That's why the search only asks for dates and rooms.

A stuck spinner. On a second search, the loading spinner stayed on screen. Now every search resets the frame, so it loads from scratch.

Broken gallery buttons. The engine's photo gallery expected image files that the theme package didn't include. Rather than chase the file paths, I drew the arrows and the close button in CSS.

theme/style.css
/* KEEP 2-COL LAYOUT — counter all.min.css 986px collapse */
.rs-sidebar-wrapper { float: right !important; width: 30%; margin-top: 5px; }

@media screen and (max-width: 768px) {
  .rs-sidebar-wrapper, .rs-content-wrapper {
    float: none !important; width: auto !important; padding: 0 !important;
  }
}
05 · Results

Results

Live at booking.maimon.com since March 2026. A button on every page of the hotel's site opens it.

Every RezStream feature still works: multi-room stays, extras, guest details and payment.

Staff edit the text in both languages, the booking notes, the same-day cutoff and the button from a dashboard. They don't need me for any of it.

The second version has 2 database tables instead of 8, and 4 API groups instead of about 20 routes. It runs on Cloudflare's free plan.

I delivered it under a written agreement: 195 itemised deliverables, the full source code and a two-year warranty.

06 · Next time

Next time

Test the vendor's links in a browser before designing the search. The guest-count limit would have shaped the form from the first day.

Ask early which API limits could block a feature. Multi-room carts ended up deciding the whole architecture.

Keep the first version ready. If RezStream ever supports multi-room carts, my availability engine can come back.

eli@leads-mania.com
Served from TLV © 2026 Eli Benhaim No tracking cookies