Case Study
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.
Co všechno systém umí
Full Feature Breakdown
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.
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.
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.
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.
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.
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.
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.
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.
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".
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.
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.
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.
Č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
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
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
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.
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.
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
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.
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.
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.
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.
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.
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.
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.
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
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.
E-mail s magic linkem
Email with magic link
PIN ke klíčům + instrukce
Key PIN + instructions
OCR dokladu kamerou
Camera ID OCR scan
Průvodce, objednávky
Guide, orders
QR platba, email FA
QR payment, email invoice
Bezpečnost
Security
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.
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.
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.
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.
SPF + DKIM ověřená doména send.redhand.cz. Žádné spamové riziko.
SPF + DKIM verified domain send.redhand.cz. No spam risk.
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
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.
méně kódu díky Drizzle vs raw SQL
less code with Drizzle vs raw SQL
E2E testů prochází
E2E tests passing
Directus / middleware CMS závislostí
Directus / middleware CMS dependencies
Onboarding
Onboarding
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.
1 objekt, 5 pobytů/měsíc, základní reporty
1 property, 5 stays/month, basic reports
5 objektů, neomezené pobyty, iCal, fakturace, booking widget
5 properties, unlimited stays, iCal, invoicing, booking widget
Neomezené objekty, UbyPort, API přístup, prioritní podpora
Unlimited properties, UbyPort, API access, priority support
Chcete podobný systém?
Want a similar system?
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