#1 MTB vzdělávací platforma v ČR

Jeď líp.
Uč se od profíků.

Najdi MTB kurz blízko tebe a trénuj s nejlepšími certifikovanými lektory v ČR.

340+kurzů
148lektorů
★ 4.9průměr
12 800+jezdců
⚡ Jak to funguje

Rezervace za 3 minuty.

01

Najdi kurz

Filtruj kurzy podle disciplíny, oblasti a úrovně zkušeností.

02

Vyber termín

Obsazenost v reálném čase. Více termínů u každého kurzu.

03

Zaplať online

Bezpečná platba kartou předem přes Stripe.

04

Jeď a uč se

Lektor se ozve 2 dny před kurzem s detaily a trasou.

340+
Kurzů ročně
148
Certif. lektorů
12 800
Spokojených jezdců
4.9
Průměrné hod.
Pro lektory

Vydělávej na tom,
co miluješ.

Přidej se k síti certifikovaných lektorů. Správa kurzů a platby na autopilotu.

Starter
Pro začínající lektory
0 Kč/měs
  • Až 5 aktivních kurzů
  • Základní statistiky
  • Stripe výplaty
  • Email podpora
  • 10% provize platformy, zbytek lektorovi
Časté dotazy

Máš otázku?

Platba probíhá bezpečně přes Stripe. Zaplatíš kartou online předem a dostaneš potvrzení na email. Peníze jsou převedeny lektorovi po dokončení kurzu.
Kurz lze zrušit nejpozději 72 hodin před začátkem — dostaneš plný refund. Při zrušení do 24h před kurzem vrátíme 50 % z ceny.
Ano. Všichni lektoři procházejí schvalovacím procesem. Vyžadujeme certifikaci IMBA, ČSC nebo ekvivalentní mezinárodní kvalifikaci.
Nabízíme kurzy pro všechny úrovně — od úplných začátečníků po pokročilé jezdce. Každý kurz má označenou obtížnost. Jsou i speciální kurzy pro děti a ženy.
Registrace je zdarma a trvá přibližně 10 minut. Vyplníš profil, nastavíš Stripe účet a po schválení můžeš začít přidávat kurzy.
Nenašel jsi odpověď? Kontaktuj nás →
MTB Kurzy

Najdi svůj kurz.

Vybírej z desítek kurzů pro všechny úrovně — od začátečníků po experty. Filtruj podle stylu, regionu a obtížnosti.

Nabídka kurzů
Najdi svůj kurz
Zobrazeno 0 kurzů
Technika jízdy
Skoky & drops
Enduro
Destination
Vše
Začátečník
Pokročilý
Expert
Nic nenalezeno

Zkus upravit filtry nebo

👧 Kurzy pro děti

Začni správně.

Bezpečné a zábavné kurzy MTB pro děti od 6 let. Zkušení lektoři, malé skupinky a progresivní výuka — váš potomek se zamiluje do kola.

♀ Kurzy pro ženy

Jízda bez hranic.

Kurzy v bezpečném prostředí čistě pro ženy. Žádný tlak, vlastní tempo — od první zatáčky po technické singletraily. Přijď sama nebo s kamarádkou.

Kurzy → …

O kurzu

Zaměření kurzu
✓ Zahrnuto v ceně
🎒 Přines s sebou

O lektorovi

→ Celý profil

Vyber termín
Zrušení 24h předem · platba vrácena
4.9
★★★★★
Obsah
Lektor
Cena

Hodnocení

Přihlášení

Pro lektory Bike Kurzy

Platný email
Nesprávné heslo
nebo

Ještě nemáš účet?

Ověření emailem

Zaslali jsme 6místný kód na adresu

Vytvoř si účet

Zdarma. Bez karty. Kurz přidáš za 5 minut.

Povinné
Povinné
Platný email
Min. 8 znaků
Neshodují se
Nutný souhlas
Profil lektora

Jezdci tě uvidí takhle.

MS
📷
JPG/PNG, min 300×300
0/500
Min. 30 znaků
Uveďte město
Povinné
Speciality

Pomůže jezdcům tě najít.

Technika
Skoky
Enduro
Destination
🧒 Děti
Ženy
🎿 Bikepark
🚴 XC
E-bike
Vyberte alespoň jednu
Praha Východ
Zvol plán

Začni zdarma — placené plány přibydou brzy.

StarterZdarma10% provize
3 kurzy · základní statistiky
Stripe výplaty

Připoj Stripe účet pro automatické výplaty za kurzy.

🔒
Zabezpečeno přes Stripe Connect
Stripe řeší celý platební proces za tebe — výplaty probíhají automaticky do 2 pracovních dnů po každé rezervaci. Bankovní účet pro výplaty zadáš přímo ve Stripe.
Stripe Connected Account

Připoj Stripe účet pro okamžité výplaty a automatické fakturace — Stripe řeší celý platební proces za tebe.

🎉
Vítej na palubě!

Účet je připravený. Přidej první kurz a začni vydělávat.

Dashboard
Přehled 👋
Posledních 30 dní
43 440
Kč výdělek
↑ +18%
32
Rezervací
↑ +6
4.9
Hodnocení
★★★★★
3
Aktivní kurzy
Výdělky — 8 týdnů
Moje kurzy
Přidat kurz
Schválení do 24h
Základní informace
0/2000
Technika
Skoky
Enduro
Destination
Dospělí
Ženy
Děti
Začátečník
Pokročilý
Expert
Termín & místo
Cena & kapacita
Co je v ceně & Co přinést
Fotky kurzu
📷
Přetáhni fotky nebo klikni
JPG, PNG · max 10 MB · první = titulní
0/8 fotek
Náhled kartičky
Pokročilý
— typ kurzu —
Název kurzu
📍 Lokalita · 📅 Datum
– Kč
Rezervovat
Vyplněnost
Termíny & časy
Vzory opakování
Status naplnění kurzů
Jezdec Kurz Datum Cena Stav
📧 Připomenutí kurzů
Automaticky odesíláno 2 dny před kurzem účastníkům i lektorovi
Žádná připomenutí — automaticky se odesílají 2 dny před kurzem
Kalendář
Výdělky
0
Kč tento měsíc
0
Kč celkem
10 %
Provize
48h
Výplata
Historie výplat
Datum Popis Tržba Provize Čistá Stav
Můj profil
Osobní údaje
MS
📷
Medajlonek / CV
Zobrazí se jezdcům na stránce kurzu
Bio & popis
Kariéra
Dovednosti
Nastavení
Stripe výplaty
Stripe nepřipojeno
Bez Stripe účtu nemůžeš přijímat platby za kurzy.
Notifikace
Předplatné
Starter plán
Zdarma
Aktivní
Zprávy od zákazníků
Dotazy a vzkazy na vaše kurzy
Admin Panel
Lektoři ke schválení
Nově registrovaní lektoři čekající na schválení
Kurzy ke schválení
Nově vytvořené kurzy lektorů čekající na schválení
Správa kurzů
Aktivace a deaktivace kurzů na platformě
Přehled plateb
Měsíční a roční přehled plateb celé platformy
Statistiky platformy
Přehled klíčových ukazatelů celé platformy
Správa uživatelů
Přehled všech lektorů a správa účtů
Nastavení platebních bran
Konfigurace Stripe a ComGate platebních terminálů
Aktivní platební brána
💳 Stripe
Nastavení Stripe API klíčů
Testovací režim (sandbox)
🔒 Klíče jsou šifrovány AES-256 před uložením do DB. Ponech prázdné = stávající hodnota zůstane.
Webhook URL: https://bikekempy.cz/api/stripe/webhook
Nastav tuto adresu v Stripe Dashboard → Webhooks → Add endpoint.
Sledované události (Events to send):
checkout.session.completed
Zákazník dokončil platbu → zapiš rezervaci, odešli potvrzovací e-mail, připiš na dashboard trenéra.
account.updated
Trenér dokončil onboarding → zkontroluj charges_enabled: true, aktivuj účet.
charge.refunded
Vrácena platba (refund) → označ rezervaci jako stornovanou, notifikuj zákazníka i trenéra.
% Platforma si strhne toto % z každé Checkout Session jako application_fee_amount, zbytek jde na connected account trenéra.
🏦 ComGate
Nastavení ComGate platební brány
Testovací režim
Notifikační URL: https://skillsandride.cz/api/comgate/notify
Nastav tuto adresu v ComGate administraci jako URL pro notifikace plateb (server-to-server).
Google přihlášení
OAuth 2.0 Client ID pro přihlášení lektorů přes Google účet
Získej ho na console.cloud.google.com → APIs & Services → Credentials → OAuth 2.0 Client IDs.
Do Authorized JavaScript origins přidej: https://bikekempy.cz a http://localhost:5500
Nastavení fakturace
Hlavička faktury, firemní údaje a automatické odesílání
Bike Kurzy s.r.o.
FAKTURA
INV-2026-xxxxxx
Firemní údaje (dodavatel)
Vzhled faktury
Automatické odesílání
Faktura bude odeslána na e-mail zákazníka ihned po úspěšné platbě přes SMTP.
Obsahuje: firemní hlavičku, detail kurzu, kontakt na lektora, cenu a číslo faktury.
Nový termín
🔄 Pravidelné opakování
Automaticky vygenerovat termíny
Vyberte termín
Připomenutí kurzů
Zvolte kurzy, jejichž účastníkům chcete odeslat připomínající e-mail. Za každý kurz se odešle samostatný e-mail.
0 kurzů vybráno
Napsat jezdci
Odesílatel: no-reply@bikekempy.cz · Odpověď přijde na Váš e-mail:
Napsat účastníkům
Příjemci
Odpovědi účastníků půjdou přímo na:
👨‍🏫 Naši instruktoři

Poznej své lektory.

148 certifikovaných MTB instruktorů. Každý je profík ve svém oboru — od dětských kurzů po freeride a destination kempy.

Registrovaní lektoři
Zobrazeno 0 lektorů
Žádný lektor nenalezen

Zkus upravit filtry

Lektoři → Detail

Disciplíny
O lektorovi

Aktivní kurzy
Kurzy tohoto lektora
Hodnocení
Co říkají jezdci
Dovednosti
Chceš kurz?

Prohlédni si aktivní kurzy tohoto lektora nebo ho kontaktuj přímo.

Krok 1 / 2
Kontaktní údaje
Povinné
Povinné
Platný email
Povinné
Povinné
Povinné
Povinné
Krok 2 / 2
Souhrn objednávky
🔒 Platba zabezpečena přes Stripe · SSL šifrování
🎉
Rezervace potvrzena!

Potvrzovací email byl odeslán na

Kontakt
Napsat lektorovi
Povinné
Platný email
Povinné
Přesměrovávám na Stripe…
Zabezpečená platební brána
Upravit kurz
📷
Přetáhni fotky nebo klikni
JPG, PNG · max 10 MB · první = titulní
0/8 fotek
Interní dokumentace

BikeKempy.cz — Dev Reference

Tech stack, datový model a rebuild prompt pro příští generaci platformy.

Aktuální stack (v1)
Frontend
  • 🟨 Vanilla JS (ES2022, no framework)
  • 🎨 Custom CSS (CSS variables, no Tailwind)
  • 📄 Single HTML file SPA
  • 🔀 Hash-based routing (#home, #kurzy, …)
  • 🌐 i18n: custom TRANSLATIONS object (cs/en)
  • 📦 No build step, no bundler
Backend
  • 🐘 PHP 8.2 REST API (api/index.php router)
  • 🗄 MySQL 8 + PDO
  • 📧 PHPMailer (SMTP e-mail)
  • 💳 Stripe PHP SDK (Checkout + Connect Express)
  • 🔑 Google OAuth (GSI + auth/google)
  • 🔒 Secrets AES-256-CTR šifrované v DB
Klíčové API routes
GET/POST /api/coursesvýpis + tvorba kurzů GET /api/courses/:iddetail + sessions POST /api/bookingsrezervace + update session POST /api/stripe/create-checkoutStripe Checkout session POST /api/stripe/webhookcheckout.completed → booking POST /api/connect/create-accountStripe Connect Express POST /api/connect/onboarding-linkAccountLink pro onboarding GET /api/connect/statuscharges_enabled polling POST /api/registerregistrace lektora POST /api/loginpřihlášení + profil POST /api/auth/googleGoogle Sign-In verify POST /api/send-invoiceHTML invoice na email GET/POST /api/gateway/configStripe/ComGate admin config PATCH /api/courses/:id/approveadmin schválení kurzu
Datový model (MySQL)
users
id, email, password_hash, role
phone, is_active, created_at
instructor_profiles
id, user_id, display_name, title
bio, avatar_url, city, region
certifications JSON, disciplines JSON
plan, approval_status
stripe_account_id, bank_account
rating_avg, rating_count
courses
id, instructor_id, title, slug
short_desc, course_type, difficulty
region, location_text, price, currency
max_pax, cover_image_url
focus_tags JSON, includes JSON
requires JSON, gallery JSON
is_active, is_published
course_sessions
id, course_id, session_date
time_start, time_end
capacity, booked_count
location_text, status (open/full)
bookings
id, session_id, course_id
customer_name, customer_email
customer_phone, customer_address
pax, unit_price, total_price
status (paid/pending/cancelled)
gateway_config
stripe_publishable, stripe_secret_enc
stripe_webhook_enc, stripe_test_mode
application_fee_percent
google_client_id, active_gateway
Doporučené technologie pro V2
Frontend
Next.js 15 (App Router, React 19)
TypeScript — type safety
Tailwind CSS v4 — utility-first styling
Zustand — client state management
React Hook Form + Zod — forms & validation
Stripe.js — frontend platební SDK
next-intl — i18n (cs/en)
Vercel — hosting + edge CDN
Backend — možnosti
Varianta A — PHP hosting
Laravel 11 (Sanctum auth, Eloquent ORM,
Queues pro emaily, Cashier pro Stripe)
MySQL · sdílený/VPS hosting ✓
Varianta B — Node.js
Hono.js nebo Fastify (lightweight, edge-ready)
Prisma ORM + PostgreSQL (Neon/Supabase)
Resend / Nodemailer pro emaily
Vercel / Railway / Fly.io hosting
Varianta C — Full-stack Next.js
Next.js API Routes / Server Actions
Drizzle ORM + Turso (libSQL)
Clerk auth · Stripe SDK server-side
Vercel hosting — nejjednodušší deploy ✓✓
💡 Doporučení: Pro hosting kompatibilní s PHP zvol Varianta A (Laravel) — přímá migrace logiky z aktuálního PHP backendu, stejný hostingový model, Cashier řeší veškerou Stripe integraci včetně Connect payoutů. Pokud je hosting flexibilní, Varianta C (Next.js fullstack) je nejproduktivnější — jeden jazyk, Server Actions eliminují boilerplate API routes, Vercel deploy na 1 příkaz.
Rebuild Prompt
Build a multi-tenant MTB (mountain bike) course booking platform called BikeKempy.cz.

## Core Concept
A marketplace where certified MTB instructors (lectors) publish courses, manage bookings,
and receive payments. Students browse, book and pay for courses online.
Platform takes a 10% application fee via Stripe Connect.

## Pages & Routing
Public pages:
- / (home) — hero section, featured courses (6), lectors grid, CTA
- /kurzy — course listing with filters (type, region, difficulty, full-text search)
- /kurzy/:slug — course detail (gallery, sessions, lector bio, book button)
- /lektori — instructor directory with ratings
- /lektor/:id — instructor profile page
- /prihlaseni — login (email/password + Google Sign-In)
- /registrace — multi-step lector registration (5 steps + Stripe Connect)

Authenticated (lector dashboard at /dashboard):
- Přehled — earnings chart, booking stats, quick actions
- Moje kurzy — list of own courses, add/edit course, submit for approval
- Termíny — course sessions management (add date/time/capacity)
- Rezervace — booking table (customer name, email, pax, price, status)
- Zprávy — message inbox from students, reply by email
- Výdělky — monthly/yearly earnings breakdown with commission deduction
- Nastavení — Stripe Connect status, notification preferences, subscription plan

Admin panel at /admin:
- Lektoři — pending lector approvals, active/rejected list
- Kurzy — all courses, approve/reject pending, toggle active
- Platby — monthly/yearly payment overview
- Statistiky — platform-wide KPIs (lectors, bookings, revenue, avg rating)
- Gateway — Stripe/ComGate API key management, application fee %
- Faktury — invoice template configuration (logo, colors, prefix, auto-send)

## Data Model

users: id, email, password_hash, role(student/instructor/admin), phone, is_active

instructor_profiles: id, user_id, display_name, title, bio, avatar_url,
  city, region, certifications[], disciplines[], plan(starter/pro/agency),
  approval_status(pending/approved/rejected), stripe_account_id,
  rating_avg, rating_count, created_at

courses: id, instructor_id, title, slug, short_desc, long_desc, course_type,
  difficulty(zacatecnik/pokrocily/expert), region, location_text, price, currency(CZK),
  max_pax, cover_image_url, gallery[], focus_tags[], includes[], requires[],
  is_active, is_published, rating_avg, rating_count, created_at

course_sessions: id, course_id, session_date, time_start, time_end,
  capacity, booked_count, location_text, status(open/full/cancelled)

bookings: id, session_id, course_id, customer_name, customer_email,
  customer_phone, customer_address, pax, unit_price, total_price,
  status(pending/paid/cancelled), created_at

gateway_config: stripe_publishable, stripe_secret(encrypted), stripe_webhook(encrypted),
  stripe_test_mode, application_fee_percent(10), google_client_id,
  active_gateway(stripe/comgate), comgate config fields

## Key Flows

### Lector Registration (5 steps)
1. Basic info (name, email, password, strength indicator)
2. Profile (bio 500 chars, city, phone, avatar upload)
3. Specialization (disciplines checkboxes, regions tags, certifications)
4. Plan selection (Starter free, Pro 490 CZK/mo, Agency 1490 CZK/mo)
5. Stripe Connect onboarding:
   - POST /api/connect/create-account → Stripe Account::create(type=express, country=CZ)
   - POST /api/connect/onboarding-link → Stripe AccountLink::create(type=account_onboarding)
   - Redirect to Stripe → return to ?stripe-reg-return=1
   - Poll GET /api/connect/status every 4s until charges_enabled=true
   - On finishReg() send stripe_account_id with POST /api/register

### Course Lifecycle
1. Lector creates course (POST /api/courses, is_published=0)
2. Lector adds sessions (POST /api/sessions)
3. Lector submits for approval
4. Admin reviews (GET /api/courses/pending) and approves (PATCH /api/courses/:id/approve)
5. Course appears publicly (is_published=1)
6. Lector can edit price/title/desc without re-approval (PATCH /api/courses/:id)

### Booking & Payment
1. Student opens course → picks session from session picker (fresh fetch /api/courses/:id)
2. Fills customer details (name, email, phone, pax count)
3. Summary shows: total, platform fee (10%), lector net amount → instructor Stripe acct ID
4. POST /api/stripe/create-checkout with:
   - line_items: course title, unit_price CZK, pax quantity
   - instructor_stripe_account → payment_intent_data.transfer_data.destination
   - application_fee_amount = 10% of total
   - success_url includes ?payment=success&cid=&sid=&pax=&price=&email=&name=
5. Stripe redirects to success_url
6. On return: fetch /api/courses/:id for real course data, POST /api/bookings (status=paid)
7. Send invoice email (POST /api/send-invoice) with invoice number INV-YYYY-{increment from 100001}

### Invoice
HTML email invoice with: lector name/title, course name, session date/time/location,
customer details, line items (pax × unit_price = total), platform info,
invoice number (INV-YYYY-{counter stored in localStorage}), configurable header color/logo.

### Email Notifications
- Booking confirmation → student (HTML email with course details)
- Invoice → student (HTML invoice)
- Reminder 2 days before session → student + lector (bulk send from dashboard)
- Reply to student messages → lector sends from dashboard

## Authentication
- Email/password with bcrypt
- Google Sign-In (GSI) with credential callback → POST /api/auth/google (verify ID token)
- Admin: hardcoded credentials (demo) + 6-digit OTP (simulated for demo)
- After login: fetch /api/login → returns profile_id, stripe_account_id, plan, status

## Stripe Connect Architecture
- Platform account holds full payment then transfers 90% to instructor
- application_fee_amount = 10% of payment_intent total
- Instructor must complete Express onboarding before receiving payouts
- Webhook events handled: checkout.session.completed, payment_intent.payment_failed, account.updated
- Secrets stored AES-256-CTR encrypted in gateway_config table

## Localization
Czech primary, English secondary. Translation keys in flat object:
{ cs: { key: "value" }, en: { key: "value" } }
t('key') helper function. Language toggle in navbar.

## UI/UX Patterns
- Orange (#C8780A) primary accent, dark ink (#111827) text
- Cards with subtle borders, orange badges for status
- Dash layout: fixed sidebar + main content area (mobile: slide-out)
- Toast notifications (top-right, auto-dismiss 3s, type: default/err)
- Step progress indicators for multi-step flows
- Session picker modal with real-time availability
- Stripe payment overlay with progress indicator