SnoekByte LogoSnoekByte
Případová studie · V produkci
Leadová platforma pro lokální sportovní studia

Z prázdné obrazovky k prvnímu klientovi naživo — za osm dní.

Fit in de Buurt je leadová platforma pro lokální sportovní studia: landing pages, které konvertují, portál pro sledování obvolaných leadů, průvodce podle PSČ a fakturace kolem toho. Návrh, stavba, databáze, hosting a provoz — postaveno sólo.

Role
Návrh, stavba, databáze, hosting a provoz (sólo)
Období
Srpen 2026 · 8 dní k prvnímu klientovi
Stack
Next.js 16 · React 19 · TypeScript · Tailwind 4 · Supabase · Resend · Vercel
Naživo
fitindebuurt.nl

Naživo na fitindebuurt.nl · Row-level security na všem soukromém · Next.js 16, React 19, Supabase

8
dní k prvnímu klientovi
±33k
řádků TypeScriptu (265 souborů)
464
automatizovaných testů
Live
první skutečný klient v produkci

Problém

Malé sportovní studio inzeruje lokálně, posílá lidi na svůj Instagram nebo obecný web a tam je ztrácí. Kdo zareaguje, přichází přes DM, mail nebo zprávu; majitelka si v hlavě drží, komu má zavolat zpět. Za dva dny je polovina zapomenutá a zájem je pryč.

Tři věci, které pro to existují, řeší každá jen kousek. Tvůrce webů dodá stránku bez následné péče. CRM je příliš těžký pro někoho s hrstkou leadů měsíčně. Linktree nedává žádný vhled. A všechno, co funguje, ukládá osobní údaje jejích klientů na místo, nad kterým nemá kontrolu.

Co z toho vzniklo

Jedna platforma obsluhující tři druhy návštěvníků najednou — sportovce, studio a provozovatele.

Pro sportovce

Domovská stránka je průvodce: zadej PSČ a uvidíš, která studia, posilovny, salony a praxe jsou nejblíž, se vzdáleností, recenzemi a tlačítkem do rezervačního systému nebo na leadovou stránku. Bez cookies, bez účtu a bez toho, abychom ukládali, co někdo hledá.

Pro studio

Vlastní leadová stránka na jméno.fitindebuurt.nl a fitindebuurt.nl/jméno, postavená z bloků a sladěná s identitou. Kdo nechá číslo, přistane hned v portálu, s mailem u toho. Ten portál má jeden seznam: komu volám. U každého leadu systém sleduje pokusy o volání, umožňuje odložit s poznámkou a označit jako získaný nebo odmítnutý.

Pro provozovatele

Editor, kde stavím a publikuji klientskou stránku, statistika na verzi té stránky a fakturace s předplatnými, číslováním, PDF a noční úlohou cron.

Nikde není tlačítko pro volání ani odkaz tel:. To je celý princip: návštěvník nechá své údaje a studio zavolá zpět. Tak majitelka ví, kdo měl zájem, i když se hovor hned nespojí.

Čtyři rozhodnutí, která projekt určují

Rozhodnutí, která prostupují celou codebase — a dělají rozdíl mezi hotovým a odbytým.

1

Oddělení mezi klienty je v databázi, ne v rozhraní

Každá stránka má jednoho vlastníka. Row-level security v Postgresu rozhoduje, kdo vidí který řádek; aplikace to nemůže obejít, já také ne. Testovací sada používá skutečné přihlašovací údaje dvou vlastníků, aby se pokusila číst, měnit a mazat leady toho druhého. Bez toho zeleného testu nejde nic do produkce.

2

Obsah stránky žije na dvou místech, záměrně

Šablona je typovaný soubor končící satisfies LandingPagina — chybí-li text, build spadne. Co změním v editoru, uloží se jako overlay v databázi a při renderu se položí přes šablonu. Zachovám záruky kompilátoru a můžu měnit texty bez deploye.

3

Publikuje se pod jménem, čísla patří k verzi

Každá publikace je neměnný řádek v pagina_versies. Denní čítače si pamatují, co se počítalo na verzi, takže vidím, co přinesl "Kratší hero" oproti "Letní akci", a starou verzi obnovím jako koncept jedním klikem.

4

Vše v nizozemštině, až do databáze

Sloupce se jmenují belpogingen, snooze_tot, weggedrukt_op. Čte se to stejně pro klienta i pro mě a drží malou vzdálenost mezi tím, co říkáme v rozhovoru, a tím, co je v kódu.

Tři části hodné zdůraznění

Místa, kam šlo nejvíc přemýšlení a stavění.

Editor stránek

Vlevo živý náhled, vpravo stránka shora dolů: jeden panel na blok se vším, co k němu patří. Texty upravuješ přímo v náhledu — ukaž, klikni, piš — a návštěvník dostane přesně stejné HTML. Akcentní barva žije v jedné CSS proměnné; color-mix z ní odvodí pět odstínů, takže každý blok sedí ke každé identitě.

Průvodce podle PSČ

PSČ jdou na lokalizační server Kadastru (PDOK): otevřený, zdarma, bez klíče. Výsledek ukládáme do vlastní tabulky, druhý návštěvník se stejným PSČ nestojí žádný požadavek. Postgres počítá vzdálenost a vrací jen studia splňující všechny podmínky. Z návštěvníka neuchováváme nic: žádné cookie, žádnou IP.

Fakturace

Předplatná na klienta, automatické koncepty z nočního běhu, řada čísel faktur, která nesmí přeskočit, částky v haléřích, DPH na řádek a PDF v úložišti. Odeslaná faktura je zmrazená: databázové triggery odmítají jakoukoli změnu, protože odeslaná faktura má zůstat sedm let stejná.

Potřebujete něco takového pro svou firmu?

Jak je to poskládané

Jeden projekt Next.js obsluhuje čtyři druhy návštěvníků, oddělené skupinami tras: průvodce, marketingové stránky, klientské landing pages a přihlášenou část. Subdomény jdou přes proxy.ts, který obnovuje session Supabase a zamyká vše za přihlášením.

VrstvaVolba
AppNext.js 16 (App Router), React 19, TypeScript strict
StylingTailwind CSS 4, vlastní komponenty, plně nizozemské rozhraní
Data + authSupabase (Postgres, auth, storage), region Frankfurt
ValidaceZod, na obou stranách i na proměnných prostředí
MailResend, pět transakčních mailů s jednou úpravou
PDF@react-pdf/renderer, faktury v Supabase Storage
HostingVercel, wildcard *.fitindebuurt.nl, cron úlohy, preview na push
TajemstvíDoppler; žádný klíč v repu
MonitoringSentry, jen v produkci
  • Dvě noční úlohy na Vercelu za sdíleným tajemstvím: 06:00 fakturace, 04:00 úklid prošlých žádostí.
  • Žádná jména, telefonní čísla ani e-maily v logách či chybových hláškách, žádné IP adresy ve statistice.
  • Leady se zapisují výhradně na straně serveru — prohlížeč nemá právo zápisu do databáze.
  • Odložený lead se vrátí sám: snooze není status, ale datum, žádná úloha na pozadí, která by mohla stát.

Kvalita a způsob práce

Jeden příkaz je brána: npm run check spustí typecheck, ESLint bez varování, Prettier, všechny unit testy a plný build. Co tím neprojde, není hlášeno jako hotové. Husky a lint-staged dělají totéž u každého commitu, GitHub Actions to opakuje u každého pushe.

CoRozsah
Kód265 souborů, ± 33 000 řádků TypeScriptu
Databáze27 migrací, 20 tabulek, RLS na všem soukromém
Unit testy412, ve 37 souborech
Prohlížečové testy (Playwright)52, v 9 souborech
Šablony a bloky8 šablon, 12 znovupoužitelných bloků
Commity94, za osm dní

Prohlížečové testy dělají to, co člověk

Přihlásit se, získat lead, odložit ho, vypnout blok v editoru, publikovat a ověřit, že se veřejná stránka také mění. Přesně tam jsou chyby, které typecheck a unit testy nevidí.

Dohledatelnost je zafixovaná na čtyřech místech

robots.ts (s dvaceti třemi AI crawlery jmenovitě), sitemap tahající klientské stránky z databáze, generovaný /llms.txt s celým webem v markdownu a strukturovaná data na typ stránky — nikdy víc, než co je na stránce samotné.

Postaveno s pomocí AI, ale ne naslepo

Každá část byla nejdřív sepsaná jako plán v repu — proč, jaké fáze, jaké kompromisy — a pak postavená. Pevné dohody žijí v souboru pravidel, který každá session načítá. Testy, typy a row-level security jsou brzda.

Kde to teď je

Web běží, první skutečný klient je naživo a v průvodci, a fakturace je připravená na jeho první předplatné.

Na plánu
  • Zobrazení na mapě a vlastní přehledové stránky na typ a místo
  • Ověřené Google recenze
  • Export leadů
  • Dvoufaktorové ověření
  • A/B testy na dvou publikovaných verzích najednou

Od nápadu k platformě naživo

Software na míru, který vydrží.

Leadová platforma, portál, e-shop nebo interní nástroj — postaveno s testy, typy a soukromím jako základem. Pojďme probrat, co potřebujete.

Kontakt