[{"data":1,"prerenderedAt":558},["ShallowReactive",2],{"portfolio-en-/en/portfolio/waterfall-adventure-center":3},{"project":4,"isFallback":538},{"id":5,"title":6,"body":7,"description":486,"extension":501,"head":502,"meta":503,"navigation":544,"path":545,"schemaOrg":502,"seo":546,"sitemap":549,"stem":556,"__hash__":557},"portfolio_en/en/portfolio/waterfall-adventure-center.md","Waterfall Adventure Center – Booking Platform for Adventure Tourism",{"type":8,"value":9,"toc":485},"minimark",[10,15,19,27,30,33,37,40,68,70,74,77,82,85,87,91,98,105,108,128,137,139,143,146,172,174,178,181,187,190,193,195,199,202,208,228,230,234,241,244,246,250,262,281,284,286,290,296,302,308,314,317,342,354,356,360,452,455,457,461,471,473],[11,12,14],"h2",{"id":13},"a-booking-platform-not-a-brochure","A Booking Platform, Not a Brochure",[16,17,18],"p",{},"Waterfall Adventure Center is a rafting and adventure center at the confluence of the Tara and Piva rivers, in Šćepan Polje in northern Montenegro. They offer single-day and multi-day rafting and canyoning tours, hiking, and riverside accommodation to guests from around the world.",[16,20,21,22,26],{},"They didn't need another website with beautiful photos and a contact form. They needed ",[23,24,25],"strong",{},"a platform that takes real card payments",", calculates actual tour prices with all their variables, and works in multiple languages. And one the owner can run independently, without calling a developer at every step.",[16,28,29],{},"That's exactly what we built: a single Laravel + Vue application that combines a fast public website, a serious booking engine, and an admin panel with nearly 55 screens.",[31,32],"hr",{},[11,34,36],{"id":35},"the-challenge","The Challenge",[16,38,39],{},"Adventure tourism has a few things a regular website simply can't handle:",[41,42,43,50,56,62],"ul",{},[44,45,46,49],"li",{},[23,47,48],{},"Real payments."," Tours are paid online, with a deposit at booking and the balance later. That means real money, EU regulation, and 3-D Secure, where mistakes aren't an option.",[44,51,52,55],{},[23,53,54],{},"Complex pricing."," Per-person or per-group rates, separate pricing for children, add-on activities, packages, accommodation, and local taxes per tour. All of it has to calculate correctly, in real time.",[44,57,58,61],{},[23,59,60],{},"Multiple languages."," Guests come from a dozen countries, so the entire site, both the interface and the content, needs to work in their language.",[44,63,64,67],{},[23,65,66],{},"Owner independence."," The owner updates tours, prices, seasons, and content daily. That can't depend on a developer.",[31,69],{},[11,71,73],{"id":72},"what-we-built","What We Built",[16,75,76],{},"One Laravel application with two faces: a fast, server-rendered public website and a full-featured admin panel built as a single-page application (Inertia + Vue 3). The numbers that describe the scope:",[16,78,79],{},[23,80,81],{},"8 languages · ~55 admin screens · real card payments (3-D Secure) · 36 data models · ~88,000 lines of code · CI/CD to production.",[16,83,84],{},"The project was built across around 202 commits over three months, with automated testing and deployment, and runs in production behind Cloudflare.",[31,86],{},[11,88,90],{"id":89},"the-booking-engine-the-heart-of-the-platform","The Booking Engine, the Heart of the Platform",[16,92,93,94,97],{},"A booking is completed in two steps: details first, then secure payment. The guest selects a tour, date, number of adults and children, adds accommodation if they want, and sees the ",[23,95,96],{},"live price"," on the right, broken down line by line.",[16,99,100],{},[101,102],"img",{"alt":103,"src":104},"Waterfall Adventure Center – booking form with live price calculation","/portfolio/waterfall-adventure-center/tura.webp",[16,106,107],{},"What makes this system genuinely capable:",[41,109,110,116,122],{},[44,111,112,115],{},[23,113,114],{},"Real-time availability checks",", tour capacity and available accommodation units for selected dates, with cancelled bookings excluded. A reservation never blocks itself when staff moves it to a different date.",[44,117,118,121],{},[23,119,120],{},"Transparent pricing",", for example a single-day Tara rafting tour shows the per-person rate, a separate rate for children, and local taxes (Rafting Tax, Piva Nature Park Tax) as individual line items.",[44,123,124,127],{},[23,125,126],{},"Deposit and balance flow",", a deposit (default 20%) is charged at booking, and the balance is collected later.",[16,129,130,131,136],{},"For more on why direct bookings are worth more than relying on OTAs, read our post on ",[132,133,135],"a",{"href":134},"/en/blog/direct-bookings-vs-ota-reduce-booking-com-dependence","direct bookings vs Booking.com",".",[31,138],{},[11,140,142],{"id":141},"card-payments-done-right","Card Payments, Done Right",[16,144,145],{},"This is the part where most websites stop. We took it all the way.",[41,147,148,154,160,166],{},[44,149,150,153],{},[23,151,152],{},"Bankart gateway via Payment.js hosted fields",": the site never touches raw card data, with full 3-D Secure challenge support.",[44,155,156,159],{},[23,157,158],{},"Amount integrity",": the charged amount always comes from the database, never from the browser request. Users can't manipulate the price.",[44,161,162,165],{},[23,163,164],{},"Idempotent confirmation",": a signed webhook (HMAC-verified) confirms 3-DS payments and is safe to replay. A duplicate or repeated call can't create a double charge or corrupt the booking state.",[44,167,168,171],{},[23,169,170],{},"Pay-by-link",": staff generates a link with a locked amount (deposit, balance, or a custom figure) and sends it to the guest by email.",[31,173],{},[11,175,177],{"id":176},"an-operations-console-not-just-an-admin-panel","An Operations Console, Not Just an Admin Panel",[16,179,180],{},"The admin panel isn't a list of records. A single booking's page is a complete back-office workspace in one place.",[16,182,183],{},[101,184],{"alt":185,"src":186},"Waterfall Adventure Center – booking admin console showing payment status","/portfolio/waterfall-adventure-center/slika2.webp",[16,188,189],{},"Staff can see and do everything from there: booking status, line items and price recalculation, deposit and balance state, Bankart payment status, payment link generation, Google Sheets sync, notes, and a full activity history.",[16,191,192],{},"Beyond that, there are unified availability calendars for tours and accommodation, an operational dashboard with a same-day arrivals and departures view, manual booking creation, and reports (bookings and financials, with CSV export).",[31,194],{},[11,196,198],{"id":197},"a-real-pricing-engine","A Real Pricing Engine",[16,200,201],{},"Pricing in tourism isn't a single number. We built a system that matches how the center actually operates:",[16,203,204],{},[101,205],{"alt":206,"src":207},"Waterfall Adventure Center – tour pricing and seasons admin","/portfolio/waterfall-adventure-center/pricing.webp",[41,209,210,213,216,219,222],{},[44,211,212],{},"per-person or per-group rates",[44,214,215],{},"separate rates for children (percentage or fixed discount)",[44,217,218],{},"add-on activities and packages (group and with meals)",[44,220,221],{},"accommodation surcharges and local taxes per tour",[44,223,224,227],{},[23,225,226],{},"seasonal pricing without year binding",", a \"Nov–Mar\" window repeats every year, with a clear resolution order: fixed date > season > full year > base price",[31,229],{},[11,231,233],{"id":232},"a-cms-the-owner-runs-independently","A CMS the Owner Runs Independently",[16,235,236,237,240],{},"Almost everything visible on the public website can be changed from the admin, no developer needed. That includes Site Settings (brand, contact, social media, SEO, analytics, booking rules), a tour editor with ",[23,238,239],{},"7 tabs",", accommodation management, seasons and surcharges, hero slides, a blog with a rich editor, legal pages, and content for the retreat and About pages.",[16,242,243],{},"Access is controlled: staff accounts with roles (super-admin, admin, agent, reception), optional two-factor login, and a full activity log that records who changed what and when.",[31,245],{},[11,247,249],{"id":248},"eight-languages-all-the-way-through","Eight Languages, All the Way Through",[16,251,252,253,256,257,261],{},"The site is configured for ",[23,254,255],{},"8 languages",": English (the source), Montenegrin, German, French, Italian, Russian, Czech, and Polish. URLs are language-prefixed, with ",[258,259,260],"code",{},"hreflang"," tags and an in-site language switcher.",[263,264,268,269,268,273,268,277],"div",{"className":265},[266,267],"markdown-image-grid","markdown-image-grid--thumbs","\n  ",[101,270],{"src":271,"alt":272},"/portfolio/waterfall-adventure-center/home-en.webp","Waterfall Adventure Center – homepage in English",[101,274],{"src":275,"alt":276},"/portfolio/waterfall-adventure-center/home-de.webp","Waterfall Adventure Center – homepage in German",[101,278],{"src":279,"alt":280},"/portfolio/waterfall-adventure-center/home-me.webp","Waterfall Adventure Center – homepage in Montenegrin",[16,282,283],{},"Translations work on two levels: static interface strings, and a separate translations table for database content (tour titles, descriptions, itineraries, legal pages). Every entity in the admin has a \"Translations\" tab with a completion indicator, so the owner knows exactly what still needs translating.",[31,285],{},[11,287,289],{"id":288},"under-the-hood","Under the Hood",[16,291,292,295],{},[23,293,294],{},"Backend:"," PHP 8.4, Laravel 12, Fortify (login + 2FA), Inertia.js 2, Spatie packages (permission, medialibrary, activitylog, honeypot), Google API client for Sheets, MySQL and Redis for job queues and cache.",[16,297,298,301],{},[23,299,300],{},"Admin:"," Vue 3.5 + TypeScript, Tailwind CSS v4, reka-ui / shadcn-vue components, TinyMCE, vue-advanced-cropper for image cropping, Vite 7.",[16,303,304,307],{},[23,305,306],{},"Public site:"," Blade + Alpine.js, Swiper for galleries, Flatpickr and GLightbox. Fjalla One and Albert Sans typefaces.",[16,309,310,313],{},[23,311,312],{},"Quality and delivery:"," Pest 4 test suite (68 files) gating automated deployment via GitHub Actions.",[16,315,316],{},"Three things we're especially proud of:",[318,319,320,326,332],"ol",{},[44,321,322,325],{},[23,323,324],{},"Payments with integrity guarantees",": hosted fields, 3-DS, amount from the database, and idempotent confirmation mean a repeated call can never create a double charge.",[44,327,328,331],{},[23,329,330],{},"Year-agnostic seasonal pricing",": windows repeat every year, with a deterministic priority resolution order.",[44,333,334,337,338,341],{},[23,335,336],{},"Multi-crop images",": art direction via ",[258,339,340],{},"\u003Cpicture>"," with separate desktop and mobile crops, in AVIF/WebP format, sharp and fast on every device.",[16,343,344,345,349,350,136],{},"For a deeper look at our approach to building systems like this, see ",[132,346,348],{"href":347},"/en/services/web-development","Website Development"," and ",[132,351,353],{"href":352},"/en/services/system-integrations","System Integrations",[31,355],{},[11,357,359],{"id":358},"scope-and-results","Scope and Results",[361,362,363,376],"table",{},[364,365,366],"thead",{},[367,368,369,373],"tr",{},[370,371,372],"th",{},"Item",[370,374,375],{},"Value",[377,378,379,388,396,404,412,420,428,436,444],"tbody",{},[367,380,381,385],{},[382,383,384],"td",{},"Data models",[382,386,387],{},"36",[367,389,390,393],{},[382,391,392],{},"Database migrations",[382,394,395],{},"104",[367,397,398,401],{},[382,399,400],{},"Controllers",[382,402,403],{},"56",[367,405,406,409],{},[382,407,408],{},"Admin screens (Vue)",[382,410,411],{},"~55",[367,413,414,417],{},[382,415,416],{},"Public page templates",[382,418,419],{},"27",[367,421,422,425],{},[382,423,424],{},"Supported languages",[382,426,427],{},"8",[367,429,430,433],{},[382,431,432],{},"Lines of code",[382,434,435],{},"~88,000",[367,437,438,441],{},[382,439,440],{},"Test files (Pest)",[382,442,443],{},"68",[367,445,446,449],{},[382,447,448],{},"Git commits",[382,450,451],{},"~202",[16,453,454],{},"The site is live behind Cloudflare, accepting real bookings and charging card deposits. The owner manages tours, pricing, seasons, content, and translations across all 8 languages on their own.",[31,456],{},[11,458,460],{"id":459},"visit-the-website","Visit the Website",[16,462,463],{},[23,464,465],{},[132,466,470],{"href":467,"rel":468},"https://raftingmontenegro.com",[469],"nofollow","raftingmontenegro.com",[31,472],{},[16,474,475,476,480,481,136],{},"If you need a booking system that takes real payments and that you can run yourself, ",[132,477,479],{"href":478},"/en/contact","contact us"," and we'll put together a plan that fits your business. Browse our other ",[132,482,484],{"href":483},"/en/portfolio","portfolio projects",{"title":486,"searchDepth":487,"depth":487,"links":488},"",2,[489,490,491,492,493,494,495,496,497,498,499,500],{"id":13,"depth":487,"text":14},{"id":35,"depth":487,"text":36},{"id":72,"depth":487,"text":73},{"id":89,"depth":487,"text":90},{"id":141,"depth":487,"text":142},{"id":176,"depth":487,"text":177},{"id":197,"depth":487,"text":198},{"id":232,"depth":487,"text":233},{"id":248,"depth":487,"text":249},{"id":288,"depth":487,"text":289},{"id":358,"depth":487,"text":359},{"id":459,"depth":487,"text":460},"md",null,{"slug":504,"industry":505,"location":506,"countryCode":507,"year":508,"date":509,"cover":510,"gallery":513,"results":521,"pattern":533,"draft":538,"readingTime":539},"waterfall-adventure-center","Adventure tourism","Šćepan Polje","ME",2026,"2026-05-28",{"src":511,"alt":512},"/portfolio/waterfall-adventure-center/cover.webp","Waterfall Adventure Center – homepage featuring rafting tour offerings",[514,515,516,517,518,519,186,520],"/portfolio/waterfall-adventure-center/slika1.webp","/portfolio/waterfall-adventure-center/adventures.webp","/portfolio/waterfall-adventure-center/tura-3-dana.webp","/portfolio/waterfall-adventure-center/smjestaj.webp","/portfolio/waterfall-adventure-center/retreats.webp","/portfolio/waterfall-adventure-center/naplata.webp","/portfolio/waterfall-adventure-center/slika3.webp",[522,525,528,530],{"label":523,"value":524},"Payments","card, 3-D Secure",{"label":526,"value":527},"Booking","live availability",{"label":529,"value":427},"Languages",{"label":531,"value":532},"Admin","~55 screens",{"context":534,"challenge":535,"solution":536,"results":537},"Waterfall Adventure Center is a rafting and adventure center at the confluence of the Tara and Piva rivers in Šćepan Polje, offering single-day and multi-day tours, canyoning, and riverside accommodation.","They needed a platform that accepts real card payments, calculates complex tour pricing, works in multiple languages, and can be managed by the owner without a developer at every turn.","We built a custom Laravel + Vue platform: a public website, a booking engine with card payments (3-D Secure) and a deposit/balance model, and an admin panel with ~55 screens and a CMS in 8 languages.","The site is live, taking real bookings and charging card deposits. The owner independently manages tours, pricing, seasons, content, and translations across all 8 languages.",false,{"text":540,"minutes":541,"time":542,"words":543},"6 min read",5.535,332100,1107,true,"/en/portfolio/waterfall-adventure-center",{"title":547,"description":548},"Waterfall Adventure Center – Tourism Booking Platform","Custom booking platform for a rafting center in Montenegro: 3-D Secure card payments, pricing engine, deposit/balance, CMS in 8 languages. See the case study.",{"loc":545,"priority":550,"changefreq":551,"lastmod":509,"images":552},0.8,"monthly",[553],{"loc":554,"caption":555},"https://leovacdigital.me/portfolio/waterfall-adventure-center/cover.webp","Waterfall Adventure Center – booking platform for rafting and adventure tours","en/portfolio/waterfall-adventure-center","oxkaJsuZtJ6tNWIo-E626Daj84i3v4IdFZj9wxXhwoY",1779963301236]