arrow_back RedHand

Case Study

SaaS platforma pro správu krátkodobého ubytování

SaaS Platform for Short-Term Rental Management

Kompletní systém pro české chalupáře — od vytvoření pobytu přes OCR skenování dokladů hostů po fakturaci s QR platbami. Bez Airbnb provizí, bez vendor lock-in.

Complete system for property owners — from creating stays through OCR-powered guest ID scanning to invoicing with QR payments. No Airbnb commissions, no vendor lock-in.

16
DB tabulek
DB Tables
40
E2E testů
E2E Tests
3
Aplikace
Applications
0%
Provize platformy
Platform Commission
7
Sessions vývoje
Dev Sessions

Co všechno systém umí

Full Feature Breakdown

Každý detail promyšlený pro chalupáře

Every detail designed for property owners

Nepoužíváme šablony ani hotové „pluginy". Každá funkce je navržená přesně pro české krátkodobé ubytování — od způsobu, jak host otevře dveře, po to, jak vám zaplatí.

No templates, no off-the-shelf plugins. Every feature is purpose-built for Czech short-term rentals — from how guests open the door to how they pay you.

hotel

Správa pobytů a automatický e-mail hostovi

Stay Management with Automatic Guest Email

Zadáte datum příjezdu, odjezdu, jméno hosta a jeho e-mail. Systém udělá zbytek — vygeneruje unikátní kód pobytu, odešle hostovi e-mail s odkazem na jeho osobní portál a zapíše vše do databáze. Host klikne na odkaz v mailu a rovnou vidí detaily svého pobytu — žádná registrace, žádné heslo. Odkaz funguje až týden po odjezdu.

Enter check-in date, check-out date, guest name and email. The system does the rest — generates a unique stay code, sends the guest an email with a link to their personal portal, and records everything in the database. Guest clicks the email link and immediately sees their stay details — no registration, no password. The link works until a week after checkout.

Pobyty lze filtrovat, archivovat, měnit stav (draft → potvrzeno → check-in → check-out). U každého pobytu vidíte historii změn, poznámky pro hosta i interní poznámky pro vás. Pokud host ztratí odkaz, jedním klikem vygenerujete nový.

Stays can be filtered, archived, and status-changed (draft → confirmed → check-in → check-out). Each stay shows change history, notes for the guest and internal notes for you. If a guest loses their link, you generate a new one with one click.

document_scanner

Skenování dokladů telefonem — konec opisování z občanek

Phone Document Scanning — No More Copying from IDs

Host otevře svůj portál na mobilu, klikne „Naskenovat doklad" a namíří kameru na občanku nebo pas. Systém automaticky přečte strojově čitelnou zónu (ten malý text dole na dokladu) a vyplní formulář: jméno, příjmení, datum narození, státní příslušnost, číslo a typ dokladu. Host jen zkontroluje a potvrdí — celý proces trvá 10 sekund místo 2 minut ručního opisování.

Guest opens their portal on mobile, taps "Scan document" and points the camera at their ID card or passport. The system automatically reads the machine-readable zone (the small text at the bottom of the document) and fills the form: first name, last name, date of birth, nationality, document number and type. Guest just checks and confirms — the entire process takes 10 seconds instead of 2 minutes of manual copying.

Funguje s českými občanskými průkazy, cestovními pasy i zahraničními doklady ve všech třech mezinárodních formátech (TD1, TD2, TD3). Pokud skenování nefunguje (špatné světlo, poškozený doklad), host může formulář vyplnit ručně nebo nahrát fotku dokladu ze složky.

Works with Czech ID cards, passports and foreign documents in all three international formats (TD1, TD2, TD3). If scanning doesn't work (bad lighting, damaged document), the guest can fill the form manually or upload a photo from their gallery.

calendar_month

Kalendář obsazenosti — všechny chalupy na jednom místě

Occupancy Calendar — All Properties in One View

Jedním pohledem vidíte, která chalupa je kdy obsazená. Řádky jsou vaše objekty, sloupce jsou dny v měsíci. Zelená buňka = potvrzený pobyt, modrá = draft, oranžová = dnešní check-in, šedá se zámkem = blokace z Airbnb/Booking. Víkendy mají tmavší pozadí, dnešek je červeně označený.

At a glance, you see which property is booked when. Rows are your properties, columns are days of the month. Green cell = confirmed stay, blue = draft, orange = today's check-in, gray with lock = Airbnb/Booking block. Weekends have darker background, today is highlighted in red.

Najedete myší na obsazenou buňku — zobrazí se jméno hosta a referenční kód. Kliknete — přesměruje vás na detail pobytu. Šipkami přecházíte mezi měsíci. Pokud máte 3 chalupy a 1 apartmán, vidíte 4 řádky — kompletní přehled na jedné obrazovce.

Hover over an occupied cell — guest name and reference code appear. Click — redirects you to stay detail. Navigate between months with arrows. If you have 3 cottages and 1 apartment, you see 4 rows — complete overview on one screen.

widgets

Rezervační widget pro váš web — bez Booking.com

Booking Widget for Your Website — No Booking.com Needed

Máte vlastní web chalupy? Vložíte jeden řádek kódu a na vašem webu se zobrazí kalendář dostupnosti s formulářem poptávky. Hosté vidí, které termíny jsou volné, vyberou datum a pošlou poptávku — přímo vám, bez prostředníka, bez provize. Widget automaticky blokuje termíny, které máte obsazené v systému i na Airbnb/Booking.

Have your own property website? Add one line of code and your site shows an availability calendar with an inquiry form. Guests see which dates are free, select a date and send an inquiry — directly to you, no middleman, no commission. The widget automatically blocks dates that are booked in the system and on Airbnb/Booking.

Widget funguje jako iframe — nezasahuje do designu vašeho webu, přizpůsobí se šířce stránky. Stačí zkopírovat embed kód z administrace (najdete ho u každého objektu) a vložit do HTML.

The widget works as an iframe — doesn't interfere with your site's design, adapts to page width. Just copy the embed code from admin (found on each property page) and paste into HTML.

vpn_key

Vzdálený check-in — nemusíte být na místě

Remote Check-in — You Don't Need to Be There

Bydlíte v Praze a chalupa je na Šumavě? Žádný problém. Zapnete self-check-in, zadáte PIN kód ke klíčové schránce, instrukce kam jít a kde schránka je. Host otevře svůj portál a na hlavní stránce vidí velký oranžový panel s PIN kódem — jasně, čitelně, na jednom místě. Pod ním instrukce: „Klíčová schránka je na zadní straně domu u vchodu do sklepa. Zadejte kód 4527."

You live in Prague and the cottage is in Šumava? No problem. Enable self-check-in, enter the key lockbox PIN code, instructions on where to go and where the lockbox is. Guest opens their portal and sees a large orange panel with the PIN code on the main page — clear, readable, in one place. Below it, instructions: "Key lockbox is on the back of the house by the cellar entrance. Enter code 4527."

PIN kód můžete kdykoliv změnit v administraci objektu. Instrukce jsou per-objekt — pokud máte 3 chalupy, každá má svůj kód a svůj popis. Host vidí PIN až po otevření svého portálu přes magic link — nikdo cizí se k němu nedostane.

You can change the PIN anytime in property admin. Instructions are per-property — if you have 3 cottages, each has its own code and description. Guest sees the PIN only after opening their portal via magic link — no one else can access it.

receipt_long

Fakturace dle českých zákonů s QR platbou

Invoicing per Czech Law with QR Payment

Systém generuje faktury přesně tak, jak to vyžaduje český zákon: IČO, DIČ, datum zdanitelného plnění, sazba DPH, variabilní symbol. Čísla faktur se přiřazují automaticky (FA20260001, FA20260002...) — nikdy se neopakují, fungují per-rok. U každé faktury se vygeneruje QR kód pro platbu — host ho naskenuje mobilním bankovnictvím a platba je předvyplněná: správná částka, váš účet, variabilní symbol.

The system generates invoices exactly as Czech law requires: IČO (company ID), DIČ (VAT ID), taxable date, VAT rate, variable symbol. Invoice numbers are assigned automatically (FA20260001, FA20260002...) — never repeat, work per-year. Each invoice gets a QR code for payment — guest scans it with mobile banking and payment is pre-filled: correct amount, your account, variable symbol.

Fakturu můžete odeslat e-mailem jedním klikem. Systém sleduje stav: koncept → vydaná → zaplacená. Dodavatel (vaše firma), odběratel (host), položky, DPH — vše na jedné stránce. Rekreační poplatek se vypočítá automaticky: počet hostů × počet nocí × sazba obce.

You can email the invoice with one click. The system tracks status: draft → issued → paid. Supplier (your company), customer (guest), items, VAT — all on one page. Recreation tax calculates automatically: number of guests × number of nights × municipal rate.

sync

Synchronizace s Airbnb a Booking.com

Synchronization with Airbnb and Booking.com

Inzerujete na Airbnb i Booking? Vložíte iCal URL z každé platformy do nastavení objektu. Systém každé 2 hodiny automaticky stáhne aktuální obsazenost a zobrazí ji v kalendáři jako šedé blokace se zámkem. Opačným směrem to funguje taky — systém generuje vlastní iCal feed URL, který můžete vložit zpět do Airbnb/Booking, aby viděly vaše rezervace z Pobytník.

List on both Airbnb and Booking? Enter the iCal URL from each platform in property settings. The system automatically downloads current occupancy every 2 hours and shows it in the calendar as gray blocks with a lock icon. It works the other way too — the system generates its own iCal feed URL that you can add back to Airbnb/Booking so they see your Pobytník reservations.

Výsledek: nikdy nepřijmete dvojitou rezervaci. Všechny platformy vidí stejnou obsazenost. A přímé rezervace přes váš web (booking widget) vám ušetří 15–20 % provize.

Result: you never accept a double booking. All platforms see the same availability. And direct bookings through your website (booking widget) save you 15–20% in commissions.

room_service

Služby a objednávky — prodávejte přímo hostům

Services & Orders — Sell Directly to Guests

Nabízíte wellness, grilování, půjčení kol, úklid, dřevo na krb? Vytvořte si služby v administraci — název, popis, cena, kategorie. Host je vidí ve svém portálu a jedním klikem si objedná. Vy dostanete notifikaci s objednávkou, jménem hosta a jeho poznámkou. Služby mohou být „vlastní" (poskytujete vy) nebo „externí" (odkaz na partnera). U každé služby nastavíte deadline — např. „objednat minimálně 24h předem".

Offer wellness, BBQ, bike rental, cleaning, firewood? Create services in admin — name, description, price, category. Guest sees them in their portal and orders with one click. You get a notification with the order, guest name and their note. Services can be "own" (provided by you) or "external" (link to partner). Each service has a deadline setting — e.g., "order at least 24h in advance".

explore

Průvodce okolím — tipy místo papírové složky

Area Guide — Tips Instead of a Paper Folder

Každý chalupář má na stole složku s tipy na restaurace, výlety a koupaliště. Tady to samé, ale digitálně v mobilu hosta. Vytvořte položky průvodce: název, popis, adresa, GPS souřadnice, telefon, web, vzdálenost, sezóna (celoroční/léto/zima). Host vidí průvodce rovnou ve svém portálu — kategorizovaný, s mapou, bez hledání ve štosu papírů.

Every property owner has a folder on the table with tips for restaurants, trips and swimming pools. In Pobytník, same thing but digitally on the guest's phone. Create guide items: name, description, address, GPS coordinates, phone, website, distance, season (year-round/summer/winter). Guest sees the guide in their portal — categorized, with map, no searching through stacks of paper.

chat

Zprávy — komunikace bez WhatsAppu

Messages — Communication Without WhatsApp

Pošlete hostovi zprávu přímo přes administraci — s předmětem a textem. Host ji vidí ve svém portálu a může odpovědět. Vše je svázané s konkrétním pobytem — žádné hledání ve WhatsApp historii, žádné ztracené konverzace. V administraci vidíte, jestli host zprávu přečetl. Jedním klikem označíte všechny zprávy jako přečtené — žádný spam v notifikacích.

Send a message to your guest directly through admin — with subject and text. Guest sees it in their portal and can reply. Everything is tied to a specific stay — no searching WhatsApp history, no lost conversations. In admin, you see if the guest read the message. One click marks all messages as read — no notification spam.

analytics

Reporty a export hostů

Reports & Guest Export

Sekce Reporty zobrazuje přehled příjmů, obsazenosti a vyúčtování. Export knihy hostů do CSV jedním klikem — filtrovat můžete podle objektu, data příjezdu i odjezdu. CSV export generuje soubor s hlavičkami: Jméno, Příjmení, Datum narození, Státní příslušnost, Typ dokladu, Číslo dokladu, E-mail, Telefon. Ideální pro účetní, cizineckou policii nebo vlastní evidenci.

Reports section shows revenue overview, occupancy and settlement data. Export guest registry to CSV with one click — filter by property, check-in or check-out date. CSV export generates a file with headers: First Name, Last Name, Date of Birth, Nationality, Document Type, Document Number, Email, Phone. Ideal for accountants, foreign police or your own records.

gavel

UbyPort a zákonné povinnosti

UbyPort & Legal Obligations

Český zákon o pobytu cizinců vyžaduje hlášení ubytovaných hostů cizinecké policii přes systém UbyPort. V nastavení objektu zadáte váš IDUB kód (identifikátor ubytovacího zařízení). Systém uchovává všechny údaje potřebné pro hlášení — osobní data hostů mají nastavený automatický výmaz po uplynutí zákonné lhůty (retention_expires_at). Po anonymizaci se jméno, datum narození a číslo dokladu smažou — zůstane jen statistický záznam pro reporty.

Czech law on foreign nationals' residence requires reporting accommodated guests to foreign police via the UbyPort system. In property settings, enter your IDUB code (accommodation facility identifier). The system stores all data needed for reporting — personal guest data has automatic deletion after the legal retention period (retention_expires_at). After anonymization, name, date of birth and document number are deleted — only a statistical record remains for reports.

Pod kapotou

Under the Hood

Technické rozhodnutí, která dělají rozdíl

Technical decisions that make the difference

Drizzle ORM

Typesafe databázová vrstva — 16 tabulek v TypeScript schématu. O 43 % méně kódu než ruční SQL. Nulová šance na překlep v názvu sloupce.

Typesafe database layer — 16 tables in TypeScript schema. 43% less code than raw SQL. Zero chance of column name typos.

Zero middleware CMS

Zero Middleware CMS

Directus odstraněn. Aplikace komunikuje přímo s PostgreSQL — rychlejší, jednodušší, méně závislostí, 300 MB RAM ušetřeno.

Directus removed. Application talks directly to PostgreSQL — faster, simpler, fewer dependencies, 300 MB RAM saved.

40 automatických testů

40 Automated Tests

Každá změna kódu projde 40 end-to-end testy: vytvoření pobytu, registrace hostů, fakturace, zprávy, export. Pokud cokoliv selže, víme to okamžitě.

Every code change runs through 40 end-to-end tests: stay creation, guest registration, invoicing, messages, export. If anything fails, we know immediately.

Problém

The Problem

Chalupáři platí provize platformám a přitom dělají vše sami

Property owners pay platform commissions while doing everything themselves

Majitelé chalup, chat a penzionů v Česku řeší správu pobytů v Excelu, hosty registrují ručně na papír, faktury píší ve Wordu a komunikují přes WhatsApp. Airbnb a Booking berou 15–20 % provize za každou rezervaci.

Czech property owners manage stays in Excel, register guests on paper, write invoices in Word, and communicate via WhatsApp. Airbnb and Booking take 15–20% commission per booking.

Existující PMS systémy jsou drahé (€50+/měsíc), složité, a neřeší české specifika — povinnou knihu hostů, UbyPort hlášení na cizineckou policii, DPH fakturaci dle českých zákonů, ani rekreační poplatky.

Existing PMS systems are expensive (€50+/month), complex, and don't handle Czech specifics — mandatory guest registry, UbyPort police reporting, VAT invoicing per Czech law, or local recreation tax.

Co jsme postavili

What We Built

Tři aplikace, jeden systém

Three apps, one system

admin_panel_settings

Admin Panel

Správa objektů, pobytů, hostů, služeb, okolí. Kalendář obsazenosti, reporty, fakturace, nastavení. 17 stránek.

Properties, stays, guests, services, guide management. Occupancy calendar, reports, invoicing, settings. 17 pages.

phone_iphone

Host Portal (PWA)

Mobilní portál pro hosty — registrace, skenování dokladů kamerou, objednávka služeb, průvodce okolím, vyúčtování.

Mobile guest portal — registration, camera ID scanning, service ordering, area guide, settlement overview.

api

REST API

Fastify + Drizzle ORM, 12 route modulů, veřejné endpointy (iCal, booking widget, embed), webhooky.

Fastify + Drizzle ORM, 12 route modules, public endpoints (iCal, booking widget, embed), webhooks.

Funkce

Features

Vše co chalupář potřebuje

Everything a property owner needs

hotel

Správa pobytů

Stay Management

CRUD pobyty, magic link pro hosty, automatický e-mail, reference kódy, filtry, archivace.

CRUD stays, magic links for guests, auto email, reference codes, filters, archival.

document_scanner

ScanID (OCR)

ScanID (OCR)

Kamera + Tesseract.js OCR — naskenuj MRZ zónu dokladu, auto-fill formuláře. TD1/TD2/TD3 parser.

Camera + Tesseract.js OCR — scan MRZ zone, auto-fill forms. TD1/TD2/TD3 parser for IDs and passports.

calendar_month

Kalendář obsazenosti

Occupancy Calendar

Měsíční grid — řádky = objekty, sloupce = dny. Barevné kódování statusů, iCal blokace, navigace.

Monthly grid — rows = properties, columns = days. Color-coded statuses, iCal blocks, navigation.

receipt_long

Fakturace CZ

Czech Invoicing

IČO, DIČ, DUZP, DPH, variabilní symbol, auto-číslování FA20260001. SPAYD QR kód pro platbu, e-mail.

Czech law compliant: VAT, tax dates, auto-numbering. SPAYD QR code for payments, email delivery.

sync

iCal Sync

Import z Airbnb/Booking.com, export iCal feed, blokace zobrazeny v kalendáři. Sync každé 2h.

Import from Airbnb/Booking.com, export iCal feed, blocks shown in calendar. Sync every 2h.

widgets

Booking Widget

Booking Widget

Embeddable JS/iframe widget pro web chalupáře. Kontrola obsazenosti, formulář poptávky, collision detection.

Embeddable JS/iframe widget. Availability checking, inquiry form, collision detection against booked dates.

vpn_key

Self-Check-in

Self-Check-in

Vzdálený check-in — PIN ke klíčové schránce, instrukce, lokace. Host vidí velký kód na dashboardu.

Remote check-in — PIN for key lockbox, instructions, location. Guest sees large code on dashboard.

payments

Stripe Billing

3 plány (Zdarma/Standard/Premium), Checkout, Customer Portal, webhook lifecycle. Sandbox ready.

3 plans (Free/Standard/Premium), Checkout, Customer Portal, webhook lifecycle. Sandbox ready.

Inovace

Innovation

Vzdálený chalupář — nikdy tam nemusí být

Remote host — never needs to be there

Navrhli jsme kompletní flow pro chalupáře, kteří fyzicky nejsou na místě. Host dostane vše co potřebuje přes mobil.

We designed a complete flow for hosts who aren't physically on-site. The guest gets everything they need via mobile.

1

Admin vytvoří pobyt

Admin creates stay

E-mail s magic linkem

Email with magic link

2

Host otevře portál

Guest opens portal

PIN ke klíčům + instrukce

Key PIN + instructions

3

ScanID registrace

ScanID registration

OCR dokladu kamerou

Camera ID OCR scan

4

Pobyt + služby

Stay + services

Průvodce, objednávky

Guide, orders

5

Checkout + faktura

Checkout + invoice

QR platba, email FA

QR payment, email invoice

Bezpečnost

Security

Serverové řešení, žádné třetí strany

Self-hosted, no third parties

  • lock
    JWT + bcrypt autentizaceJWT + bcrypt authentication

    Hesla hashovaná bcrypt (12 rounds), JWT tokeny s 7denní expirací, rate limiting na login/register.

    Passwords hashed with bcrypt (12 rounds), JWT tokens with 7-day expiry, rate limiting on login/register.

  • shield
    Tenant izolaceTenant isolation

    Každý dotaz filtrován přes tenant_id. Žádný cross-tenant data leak. Row-level security na aplikační vrstvě.

    Every query filtered by tenant_id. No cross-tenant data leaks. Row-level security at application layer.

  • cookie
    httpOnly cookies + Redis sessionshttpOnly cookies + Redis sessions

    Guest sessions v Redis s 72h expirací. httpOnly, Secure, SameSite=Lax. Žádný token v localStorage pro hosty.

    Guest sessions in Redis with 72h expiry. httpOnly, Secure, SameSite=Lax. No localStorage tokens for guests.

  • dns
    Vlastní server — žádný cloud vendorSelf-hosted — no cloud vendor

    Hetzner dedicated (64 GB RAM, NVMe). Data zůstávají v EU. Žádný AWS/GCP dependency.

    Hetzner dedicated (64 GB RAM, NVMe). Data stays in EU. No AWS/GCP dependency.

  • mail_lock
    Resend e-maily s ověřenou doménouResend emails with verified domain

    SPF + DKIM ověřená doména send.redhand.cz. Žádné spamové riziko.

    SPF + DKIM verified domain send.redhand.cz. No spam risk.

  • gavel
    GDPR + český zákon o ubytováníGDPR + Czech accommodation law

    Automatické mazání osobních údajů (retention_expires_at), anonymizace, UbyPort export pro cizineckou policii.

    Automatic personal data deletion (retention_expires_at), anonymization, UbyPort export for foreign police.

Technologie

Tech Stack

Architektura bez zbytečných vrstev

Architecture without extra layers

Stejný ověřený stack jako naše ostatní platformy — Drizzle ORM, typesafe queries, zero middleware CMS.

The same proven stack as our other platforms — Drizzle ORM, typesafe queries, zero middleware CMS.

Drizzle ORM PostgreSQL 16 Fastify Next.js 14 TypeScript Tailwind CSS Redis 7 Stripe Resend Tesseract.js PM2 pnpm monorepo JWT + bcrypt SPAYD QR
-43%

méně kódu díky Drizzle vs raw SQL

less code with Drizzle vs raw SQL

40/40

E2E testů prochází

E2E tests passing

0

Directus / middleware CMS závislostí

Directus / middleware CMS dependencies

Onboarding

Onboarding

Registrace za 30 sekund

Registration in 30 seconds

Nový chalupář se zaregistruje ve 2 krocích: e-mail + heslo → název firmy + první objekt. Systém vytvoří tenant, property, admin uživatele a přesměruje do administrace. Hotovo.

New property owner registers in 2 steps: email + password → company name + first property. System creates tenant, property, admin user and redirects to dashboard. Done.

ZdarmaFree

Free

1 objekt, 5 pobytů/měsíc, základní reporty

1 property, 5 stays/month, basic reports

Standard

Standard

5 objektů, neomezené pobyty, iCal, fakturace, booking widget

5 properties, unlimited stays, iCal, invoicing, booking widget

Premium

Premium

Neomezené objekty, UbyPort, API přístup, prioritní podpora

Unlimited properties, UbyPort, API access, priority support

Chcete podobný systém?

Want a similar system?

Postavíme vám vlastní SaaS platformu

We'll build your custom SaaS platform

Stejný tým, stejný stack, stejná kvalita. Od nápadu po produkci za týdny, ne měsíce.

Same team, same stack, same quality. From idea to production in weeks, not months.

mail richard@redhand.czrichard@redhand.cz