UniTrip.gr

UniTrip.gr Link to heading

Booking platform for organized youth trips

Overview Link to heading

Full-stack booking platform for organized youth trips, covering public trip discovery, multi-step bookings, payment flows, admin operations, referrals, QR/UTM campaigns, and booking sharing after the initial reservation.

The Problem Link to heading

Travel agencies need a fast booking experience that can handle group travel, delayed participant additions, campaign attribution, and operational follow-up.

The Solution Link to heading

Built a SvelteKit and PocketBase application with a public booking funnel, realtime admin panel, Viva payments, Discord operations notifications, and service-worker static asset caching.

Key Features Link to heading

Public Booking Experience Link to heading

  • Trip Discovery - Homepage, trip listing, and detail pages for available trips
  • Multi-Step Booking Flow - Departure city, traveler count, participant details, and dynamic pricing
  • Shareable Bookings - Additional travelers can join an existing booking after the initial reservation
  • Booking Page - Persistent booking route with trip, traveler, and payment information
  • PDF Confirmation - Booking confirmation generation for travelers
  • Informational Pages - FAQ, contact, terms, privacy policy, passenger rights, and participation terms

Payments and Operations Link to heading

  • Viva Payments Integration - Online payment flow for bookings
  • Payment Verification - Booking page checks payment state after user return to avoid sync issues
  • Youth Pass Support - Special handling for Youth Pass payment amounts
  • Discord Notifications - Contact forms, confirmed bookings, referral channels, city channels, and daily pending-payment summaries

Admin Experience Link to heading

  • Realtime Admin Panel - Trips, bookings, travelers, payments, referrals, campaigns, and exports
  • Trip Dashboard - Fully paid traveler count and departure-city breakdown per trip
  • Campaign Management - QR campaign links under /c/<slug> with UTM attribution
  • Local Admin Cache - Fast navigation and responsive admin state using Svelte state and PocketBase subscriptions

Technical Implementation Link to heading

AreaStack
FrontendSvelte 5, SvelteKit 2, TypeScript
StylingTailwind CSS 4, lucide-svelte, GSAP
Backend/DataSvelteKit server routes, PocketBase
ValidationZod
PaymentsViva Payments
Documents/UtilitiesjsPDF, qrcode, xlsx, isomorphic-dompurify
TestingVitest, Testing Library, jsdom
RuntimeCloudflare adapter, service worker static asset caching

Performance and Reliability Link to heading

The application uses a service worker for safe static asset caching while deliberately avoiding runtime caching for booking and admin data. That keeps repeat visits fast without risking stale operational data in sensitive flows.

Admin state is kept live with PocketBase realtime subscriptions, so operators can work with bookings and payments without manual refreshes.