Chalupa Za Kútom: a log cottage in the forest that handles its own bookings

Chalupa Za Kútom

2026-09-24

Chalupa Za Kútom is a 130-year-old log cottage in Slovinky, in the Spišská Nová Ves district, rented out as a whole: up to eight guests, an outdoor hot tub, a Finnish sauna and a gazebo with a fire pit. The owner had a Webnode site his guests already knew, but bookings arrived through it only as a form, with no calendar and no payment. His own promotional film was embedded as a private YouTube video, so visitors never actually saw it. We built a new site in the spirit of his original design, only cleaner, and put a booking system of its own underneath: an availability calendar in which the departure day can be sold again as an arrival day, payment through Stripe, add-on services, company purchases, an automatic email two days before arrival, and an admin panel where the owner moves bookings and blocks dates from his phone. The site speaks Slovak, English and German. The whole project took 12 working days on a €400 budget.

Cottage website + booking system with payments and admin

Project type

Direct online bookings, paid on the spot, without an intermediary

Main goal

€400

Project price

View live website

Selected screens from the live site

Visual project preview shows how the website looks on different devices. Responsive design ensures perfect display on mobiles, tablets and desktops.

The hero with the owner’s own film: the gate with its carved sign, and below it a fact strip of 8 guests, hot tub, sauna, from €110 a night.

The non-trivial parts of the project

A cottage rental site looks simple until real nights start being sold. Then you have to settle when a day ends, who paid first, what a New Year’s Eve night costs, and what the owner gets for his guest register. These are the six tasks the project stood on.

Problem #1

A departure day has to be an arrival day too

Check-out is by 10:00 and check-in from 14:00, so the day between two stays is sold twice. The owner put it in his own words: “ta nedeľa by mala byt voľná keďže odchod je do 10:00 a malo by sa dať rezervovať od nedele do pondelka”. A calendar of whole days would needlessly lock one night every weekend.

Our solution

The calendar day stopped being indivisible and now has five states: free, booked, a departure day open for arrival, an arrival day open for departure, and past. Half-days are coloured along a diagonal, matching the screenshot the owner sent (“napr 8-9 októbra je to iba na polovicu cervene zelene”). Server and browser exchange ISO dates rather than timestamps, so availability never shifts between a server in UTC and a guest on Bratislava time.

Technologies and implementation

Five day states, ISO dates between server and client

1
Problem #2

Two guests, one date, one second

There is one cottage, and every night can be sold only once. If two guests click the same weekend at the same moment, the usual “check the database, then write” approach lets both through. On serverless hosting, where each request runs somewhere else, that is not a theoretical risk.

Our solution

An EXCLUDE constraint inside Postgres forbids overlapping stays, so the database itself rejects the second write and the guest gets a clear message instead of an error. When the guest goes to checkout, the dates are held five minutes longer than the Stripe checkout session lives, and a booking counts as paid only after a signed webhook, not when the guest lands back on the site. Dates imported from external calendars over iCal fall under the same constraint.

Technologies and implementation

Postgres EXCLUDE, Stripe Checkout, signed webhook, Vercel Cron

2
Problem #3

A price that depends on the date and the add-ons

A night costs €110 midweek, €130 at weekends and €200 over Christmas, New Year and Valentine’s. The owner wanted the higher amount to appear on its own: “dať do aj do cenníka a aj do kalendára aby automaticky keď niekto zaklikne ten termín sa mu zobrazila ta vyššia suma”. On top of that come add-ons with different units: per stay, per person, per morning, and entirely free.

Our solution

A single function prices every night and every add-on, and the price list, the calendar, the form total, the Stripe line items, the owner’s email and the admin panel all draw from it. The server recalculates the amount and never trusts a figure from the browser. Breakfast is counted as guests × mornings, with the number of mornings capped by the number of nights. The free baby cot is shown with the word “Zdarma” rather than “+0 €”, and it stays in the order, because free does not mean it needs no preparing.

Technologies and implementation

Single source of pricing, server-side recalculation

3
Problem #4

A promotional film visitors never saw

The owner had his own film made about the cottage and put it on his home page, but as a private YouTube video. Instead of the log cottage, visitors saw a sign-in prompt. The strongest material that existed about the place was, in effect, missing from the site.

Our solution

From the original edit master we cut a 12.4-second loop of six shots. It starts and ends on a drone shot, so the loop point reads as just another cut. The watermark burned into the picture was cropped out. Encoding settings were chosen from 118 VMAF measurements rather than by eye: 9.4 MB in landscape and 3.4 MB in portrait for phones. The film plays from the site’s own domain, with no YouTube involved.

Technologies and implementation

ffmpeg, VMAF measurement, two video crops

4
Problem #5

A site guests were already used to

The owner wanted to stay with his design, “just better”. His Webnode site, however, had white button text at a 2.4:1 contrast ratio, a mobile menu that ran off the screen, a heading breaking mid-word at 390 px, two identical forms stacked one under the other, placeholder contacts left over from the template, and an empty terms page reading “Vložte svoj text”.

Our solution

We measured the look straight from the live page and kept it: typeface, colours, button shape, menu order. The fixes touched only what was broken. The main button became the dark pill that already existed in his own design, a single form remained, and the owner’s rental terms are on the site in full, in three languages. The original authored concept with its woodcarving motif went into the project archive once the owner chose continuity.

Technologies and implementation

Style measurement in headless Chromium, WCAG contrast

5
Problem #6

Guest register, invoices and company guests

The owner is required to keep a guest register and he issues invoices. A form asking only for name, email and phone gave him data for neither, and a company guest needs an invoice made out to a company ID, not to a private person.

Our solution

The form asks for a permanent address and says openly why: “Potrebujeme ju do knihy ubytovaných a na faktúru”. Ticking “Nakupujem na firmu” reveals the company name, company ID, VAT number and address, and the server reads them only when that option is actually on. The owner gets the address on a single line in his email and finds it in the admin panel under “Fakturačné údaje”.

Technologies and implementation

Per-field server validation, Drizzle schema migration

6

Similar problems in your business? We will help you solve them with modern tech stack.

Final structure

Complete web structure designed for maximum conversion and user experience. Each page has clear purpose and optimized navigation.

Home
Gallery
Price list
Booking
Voucher
Contact
Rental terms
Cookie policy
Admin panel (private)

Most important website sections

Each section solved specific business problem and increased conversions

1

Hero with the owner’s film

From the owner’s original film we cut a 12.4-second loop of six shots: drone, the gate with its carved sign, the lantern with the house numbers, the hot tub, the swing by the gazebo, and the drone again. Beneath the headline “Objav miesto, kde splynieš s prírodou.” sits a fact strip: 8 guests, outdoor hot tub, Finnish sauna, from €110 a night.

2

Booking: calendar, form, payment

On desktop the calendar sits beside the form, so guests see their chosen dates and the running total while filling it in. The form separates adults from children, asks for the address needed for the guest register, offers the add-ons and requires consent to the rental terms before submitting. Stripe Checkout follows.

3

Price list with seasons

Weekdays €110, weekends €130, and a seasonal €200 a night from 20 December to 1 January and from 13 to 15 February. Below the prices sit the rental conditions and a “Dôležité informácie” block about 4x4-only car access and the lack of any shop or restaurant on site.

4

A gallery in four groups

Twenty-two of the owner’s photographs in a regular grid, split into Exterior, Interior, Wellness and Garden, with a click-to-open lightbox. We removed the “Obrázky poskytol Pexels” credit, a leftover from the template that sat under his own photographs on the old site.

5

Voucher

A dedicated gift voucher page with a preview of the voucher bearing the cottage logo and an order form for the number of guests and nights. The description text is the owner’s own, word for word.

6

Contact with a map

A Google map on the exact point the owner sent himself, and beside it a photograph of the gate so guests know what the place looks like in person. The “Otvoriť trasu v Google Maps” button opens navigation on a phone.

Project stack

Frontend and design

App Router, server components, and a design built on the visual language of the owner’s original site: PT Serif, a muted slate palette, pill-shaped buttons and rounded photographs.

One typeface, five typographic rolesHero video in two crops: landscape and portraitprefers-reduced-motion respected
Next.js 16
React 19
TypeScript
Tailwind CSS v4
PT Serif

Bookings and payments

A booking first holds the dates, then sends the guest to Stripe Checkout. Double bookings are ruled out by a constraint inside the database itself, not by an application check. One function prices the nights and the add-ons for the price list, the calendar, the form total, the checkout and the email alike.

Postgres EXCLUDE against overlapping staysSigned Stripe webhook as the single source of truthiCal import and export
Stripe Checkout
Neon Postgres
Drizzle ORM
Vercel Cron
iCal

Admin and email

A password-protected admin panel with a booking list, booking detail, date blocks and settings. Emails reach the guest in their own language and the owner always in Slovak, including the add-on breakdown and invoicing details.

Date changes with a collision checkInformation email two days before arrivalSession in a signed httpOnly cookie
Resend
jose
Vercel
GitLab CI/CD

SEO, AI and compliance

Three languages with a path prefix, hreflang and canonical on every page, BreadcrumbList on subpages, and an llms.txt generated from the same dictionaries as the site itself. GA4 and GTM switch on only after consent, in a cookie banner with two equal buttons.

SK / EN / DELighthouse 100 for accessibility, best practices and SEOAnalytics only after consent
hreflang
JSON-LD
llms.txt
GA4
GTM
Silktide Consent Manager

💡 Modern tech stack = fast website + easy maintenance + long-term support

Delivery process

The owner sent his requests over WhatsApp in short batches. We broke each one down into points with his quotes, implemented it and sent it back for approval. The order of work was agreed with him up front: design, calendar, payments.

10–13 September

Materials and first concept

2 days

We gathered the content and 24 photographs from the original site, built an authored concept across eight pages, and set up deployment to Vercel through GitLab CI.

14–16 September

The site in the owner’s style, and the hero film

2 days

At the owner’s request we rebuilt the site in the visual language of his original page, then refined typography and rhythm in a second pass. The hero film, the full rental terms, the Voucher page, the contact map and the availability calendar were added.

17–19 September

Booking system

3 days

A database with double-booking protection, Stripe payments, the admin panel and an end-to-end check against the live database. Alongside came seasonal prices, adults and children counted separately, the add-on services and three languages: Slovak, English and German.

20–22 September

Emails, invoicing and launch prep

3 days

An email to the guest two days before arrival, re-sent against the new dates whenever a booking is moved. The guest address and the company purchase mode. llms.txt, the cookie banner, BreadcrumbList and a Lighthouse audit: 100 for accessibility, best practices and SEO on every page.

23–24 September

Analytics, half-days and handover

2 days

GA4 and GTM wired to fire only after visitor consent. Following the owner’s last requests, the calendar gained half-day changeovers and the baby cot became free. That was the handover, after 12 working days.

Project FAQ

Case study summary

This case study shows a specific problem, solution, and outcome. It helps you compare your project to a similar scenario.

Definition: a case study describes a real project with clear inputs and outcomes.

Do you rent out a cottage, cabin or apartment?

We build sites with bookings that are paid on the spot, a calendar that understands changeover days, and an admin panel you can run from your phone. No intermediary commission on every night.

Leave your contact (email or phone is enough)

Write on WhatsApp

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

✨ Your own bookings • Online payments • Multilingual