RSVD

Project

RSVD

RSVD: System rezerwacji online dla małych firm

Next.js + Stripe + Supabase + Google Calendar

System rezerwacji dla małych firm usługowych. Klient wybiera termin, rezerwuje i płaci online, a właściciel zarządza dostępnością z panelu.

RSVD landing page

Geneza projektu

RSVD powstało z obserwacji, że w wielu małych firmach rezerwacje wciąż obsługuje się ręcznie: telefonem, arkuszem i wiadomościami z przypomnieniami. W studiu fotograficznym, gabinecie terapeutycznym czy sali konferencyjnej oznacza to przerywanie pracy i pilnowanie terminów po godzinach. System przenosi ten proces na stronę: klient wybiera termin, rezerwuje i płaci samodzielnie, a właściciel widzi wszystko w jednym panelu.

RSVD dashboardRSVD bookingsRSVD calendarRSVD embed

Co robi system

Widget do osadzenia

Właściciel kopiuje krótki kod i wkleja go na swoją stronę. Widget korzysta z ustawień firmy, usług i dostępności zapisanych w panelu.

Płatności online

Płatność odbywa się w trakcie rezerwacji przez Stripe Connect. Środki trafiają na konto właściciela, a system zostawia ślad transakcji przy terminie.

Google Calendar

Rezerwacje wpadają do kalendarza właściciela, a zajęte terminy blokują się w formularzu, żeby klient nie wybrał niedostępnej godziny.

Podpisy elektroniczne

Przy usługach wymagających zgody lub regulaminu klient podpisuje dokument w przeglądarce, a system zapisuje PDF razem z rezerwacją.

Kupony rabatowe

Kupony mają limity użyć, daty ważności i warunki koszyka, więc promocje da się uruchomić bez ręcznego sprawdzania każdej rezerwacji.

Przypomnienia email

System sprawdza nadchodzące terminy i wysyła przypomnienia przez Resend, żeby właściciel nie musiał robić tego ręcznie.

Wyzwania i rozwiązania

Problem

Stripe Connect wymaga, żeby właściciel przeszedł onboarding (weryfikacja KYC). W międzyczasie może przyjmować rezerwacje, ale nie płatności online.

Rozwiązanie

Panel pokazuje status onboardingu i ukrywa niedostępne metody płatności. Do czasu aktywacji Stripe właściciel może przyjmować gotówkę lub przelewy.

Problem

Widget musi działać na dowolnej stronie, ale z zachowaniem bezpieczeństwa (CSP, X-Frame-Options).

Rozwiązanie

Osobna konfiguracja nagłówków dla ścieżek embed. Sanityzacja parametrów CSS (kolory, fonty) przed renderowaniem.

Stack technologiczny

FrameworkNext.js 16 (App Router)
LanguageTypeScript
DatabaseSupabase (PostgreSQL + Auth)
PaymentsStripe Connect
CalendarGoogle Calendar API
EmailResend
PDF@react-pdf/renderer
UITailwind CSS + Radix UI