Case study

Domki Borsk: online booking and payments

Domki Borsk home page on desktop (in Polish): sunset over Lake Wdzydze, a short headline and a cabin picker with a button to check available dates.
Domki Borsk home page on a phone with the cabin picker.

Brief

Booking without emails or a middleman.

Domki Borsk are two holiday cabins on Lake Wdzydze in northern Poland. The previous WordPress site was a business card: anyone who wanted to stay had to write, call or book through Booking.com.

The new site had to take bookings on its own, at any time. The guest picks dates, sees the price right away and pays the deposit in a few minutes. The owner does not copy dates between calendars, and the cabins stay available on Booking.com without the risk of the same dates being booked in both places.

It is my family’s own place, so I use the panel and the booking flow every day as the owner.

Booking

From calendar to confirmation

Instant booking, with no waiting for the owner to reply. The whole flow works in three languages: Polish, English and German.

  1. Availability calendar

    The guest sees two months at once. Booked nights, including those sold on Booking.com, are crossed out, and the minimum stay changes with the season. A departure can fall on the day another stay begins.

  2. Price right away

    Once dates are picked, a summary appears: nights, price and two rates. Flexible, with a 35% deposit and free cancellation until 42 days before arrival, or non-refundable and 5% cheaper. The same code calculates the price in the browser and on the server, so the guest pays exactly what they saw.

  3. Dates held during payment

    After clicking "Book", the dates are held for 30 minutes. Saving the booking and checking that the nights are free is a single database operation, so two people cannot book the same nights.

  4. Online payment

    The Autopay gateway: BLIK, fast bank transfer, card, Apple Pay and Google Pay. A booking is confirmed only after the notification from the gateway, not just when the guest returns to the site.

  5. Confirmation and emails

    The guest lands on a page with the booking number, dates and amounts due. The guest gets a summary email, and the owner gets a separate one with a reminder about the Booking.com calendar.

  6. Booking.com sync

    Calendars are exchanged both ways via iCal. The site fetches Booking.com availability when the calendar is shown and again right before payment, and Booking.com fetches bookings made on the site and entries from the panel.

  7. Test bookings

    A special link runs the whole flow on a test Autopay account: price, payment, confirmation and emails marked as test. Such a booking does not block any dates, so the process can be checked at any time without real money.

Screens

Dates, price and payment on one page

The calendar, price summary and form sit right next to each cabin’s description. On a phone the summary appears below the calendar, and after paying the guest sees a confirmation with the amounts.

Screenshots from a test version of the site, in Polish. The bookings on the confirmation page and in the panel are sample data.

Owner panel

All bookings in one place

Instead of a WordPress plugin and a separate channel manager: a panel built for these two cabins and the way the owner actually works.

  1. Calendar of both cabins

    One view of two cabins. The colour shows where a booking came from: the website, Booking.com, a phone call or a block. Price and minimum stay under each day.

  2. Prices and minimum stay

    I select nights by dragging the mouse, like in the Booking.com extranet, and enter a price or minimum number of nights for the chosen period.

  3. Phone bookings and blocks

    Dates entered in the panel disappear from the site right away and go to the calendar for Booking.com, without guest details. The panel warns when an entry overlaps another booking.

  4. Sales period

    Outside the chosen period both cabins are closed on the site and Booking.com gets those days as booked, so nobody can book dates that are not priced yet.

  5. List of stays

    Upcoming stays from all sources, with contact details, number of guests, amount paid and amount due. Cancelling with one button frees up the dates.

  6. Secure login

    The panel sits behind Cloudflare Access: login with a one-time code sent to the owner’s email.

Technology

A fast site, reliable bookings

The site is static and built with Astro, so it loads quickly even on a weak signal by the lake. Bookings run on Cloudflare functions and a D1 database, payments on Autopay and emails on Resend.

Prices and rules, such as seasons, minimum stays, the deposit and cancellation terms, live in one place. The calendar on the site and the server that calculates the amount due both use the same source. Automated tests check the pricing engine and payment handling.

Beyond bookings, the site has descriptions of both cabins with galleries, a price list with house rules, a contact page with directions and a blog with local guides, prepared for search in Google and AI assistants.

  • 30 minthe dates are held for the guest during payment, then released automatically
  • 2Booking.com calendars synced both ways, also checked right before payment
  • 3languages: Polish, English and German, including the booking flow
  • 12local guides on the blog: the lake, kayaking, cycling, the open-air museum

Results

Measured, not promised.

PageSpeed Insights for the home page, measured on 29 October 2026 on the live site, with the calendar and the hero photo. Lab results vary by a few points between runs.

Mobile

Performance
98
Accessibility
100
Best practices
100
SEO
100

LCP 1.6 s · CLS 0 · TBT 50 ms

Desktop

Performance
100
Accessibility
100
Best practices
100
SEO
100

LCP 0.5 s · CLS 0 · TBT 0 ms

Source: PageSpeed Insights report.

First step

Bookings, payments, your own panel.

Running a holiday rental or a service with appointments? Tell me how you take bookings today. I will reply with what can be automated and roughly what it would cost.

Quick project note

Prefer to call? +48 739 260 401. Your details are only used to reply. Privacy policy.