A town that did not exist online
Pljevlja is Montenegro's northernmost town. The Tara Canyon, the Ćehotina river, Durmitor within reach, the Roman Municipium S. at Komini, Husein Pasha's mosque, the Holy Trinity Monastery. All of it has been there for centuries.
Online, far less of it existed. Tours were sold through foreign platforms or over the phone, information was scattered, and a guest trying to plan a trip had nowhere to go.
The brief was not to build a presentation of the town. It was to build a platform that works like a tour operator: it sells tours, it takes money, it manages partners, and it works in the languages guests actually arrive from.
Tours as a product, not a page
Every tour is a full product with pricing, a season, capacity, departures and rules.

The pricing model follows how operators actually charge:
- Per person, price times the number of guests
- Per group, a base price covers a set number of guests, with a supplement for each additional one
- Per unit, price times the number of vehicles or boats, for example two jeeps at €160 each
On top of that come seasonal prices, a child discount, per-tour add-on options, a card fee and a manual price override for negotiated bookings.
Commission is kept separate from price and has five models, from included in the price to a fixed amount per guest. The part that is not obvious is that commission is never visible to the partner, and that is covered by a test, not by an agreement.
A booking flow that does not charge immediately
The guest submits a booking request and gets an immediate confirmation. The team sets the price and the deposit, then sends a payment link.

Payment runs through Stripe, using an embedded payment element on the site's own domain, not a redirect to somebody else's page. The deposit defaults to 30%, and 1% of every payment goes to charity, shown to the guest before they pay.
After payment the guest receives a QR voucher. The operator scans it on arrival, marks the tour as redeemed, then as completed. The day after the tour a review request goes out with a single-use token, so only guests who actually turned up can leave a rating.
The whole flow is covered by tests that deal with money: tour pricing, seasonal pricing, per-guest commission, payment idempotency, vendor settlement, pay-on-site, vouchers and worker check-in.
A partner portal with moderation
Restaurants, accommodation, ethno villages and operators register themselves on the site. Once approved they get their own panel where they add tours and places, follow their own bookings and reviews, and create worker accounts that scan vouchers.

A few decisions here paid off:
- Moderation fails closed. Public visibility requires an explicit approval. If something breaks, the outcome is that nothing shows, not that something unapproved shows.
- Edits do not take live listings down. When a partner edits a tour that is already live, it stays live but is flagged for review, and the admin gets an email and a push notification.
- Partners write in one language. We do not ask a restaurant to translate into eighteen languages. They write in their own, and the translation pass runs after approval.
- Workers do not see money. Worker accounts see the voucher and the tour, not the commission or the earnings.
For training there is also a practice voucher, a page where every button works but nothing is saved, so a new worker can rehearse the check-in flow without any risk of breaking real data.
A destination, not just an offer
Beyond tours, the site runs a full directory of places: nature and landscapes, culture and heritage, where to eat, where to stay, ethno villages.

Technically, a place is a single record type with a primary role and secondary ones. A garden that is both a landmark and a restaurant appears in both sections, from one record. The revenue model is tied to the type: restaurants, accommodation and shops pay an annual listing fee, while ethno villages run on per-booking commission like tours.
The content about the town was not written from memory. Behind the site sits a knowledge base of 76 documents, where every non-obvious claim carries a source and a confidence tag, and disputed figures are never published as fact. Because of that the site corrects several local myths instead of repeating them.
Eighteen languages and visibility
The site runs in 18 languages: English, Montenegrin, German, Russian, Hungarian, French, Italian, Polish, Turkish, Albanian, Spanish, Slovak, Slovenian, Ukrainian, Dutch, Danish, Swedish and Norwegian.

Translations are not patched by hand. English is the source, translations are generated per locale, checked structurally and written out as versioned files that a single command applies to the database. A corrected fact goes into the source and is re-run through every language.
The site is prepared for both search engines and AI assistants: a per-domain robots.txt that explicitly allows GPTBot, ClaudeBot and PerplexityBot, plus an /llms.txt following the standard. There is also a Google Ads offline conversion export that reports the net value of a paid booking, so Ads optimises on margin rather than turnover. We explain why in our piece on remarketing campaigns for tourism.
Under the hood
Backend: PHP 8.3, Laravel 13, Filament v4 as the admin with 19 resources and nine dashboard widgets, Spatie Translatable, mcamara localization, Stripe, IMAP mailbox sync, Web Push.
Frontend: Blade and Alpine.js, Tailwind CSS v4, Vite, critical CSS. No React, no Vue.
Scope: 33 models, 151 migrations, 31 transactional emails, 48 test files, seven scheduled jobs.
On-site operations: a PWA with web push, so the owner gets a phone notification the moment a booking or a chat message arrives.
You can read how we approach projects like this on our Web development and System integrations pages.
What came out of it
The platform proved solid enough that we turned it into a network. Content is tagged per destination, so the same operator and the same tour can sit on several sites without duplication. The first additional destination is Visit Žabljak.
Visit the website
If you run a tourism board, an agency or a destination and need a platform that actually sells, get in touch. Have a look at the other projects in our portfolio.