A city events calendar has to serve three groups at once: visitors looking for what is on tonight, organisers who want to publish their programme, and editors who are responsible for making sure that what goes live is accurate. For the Dubrovnik Tourist Board and the City of Dubrovnik we solved this by separating the two jobs. The public display stays on the Joomla 5 website experiencedubrovnik.com, while the data, approvals and organiser portal run in a separate system built with Laravel. Below we explain why we made that choice and what visitors, organisers and editors actually get from it.

In short (TL;DR)

Two systems, one address. Visitors only ever see the calendar on the Tourist Board's website, while events, organisers and approvals are managed by a separate Laravel system with its own database and API.

Organisers submit their own events, and nothing is published until it has been approved.

The calendar is built for search engines: schema.org/Event structured data, hreflang links between the Croatian and English versions, keyword-first page titles, an iCal subscription and share images sized for social media.

The calendar is publicly available in Croatian at experiencedubrovnik.com/kalendar-dogadanja and in English at experiencedubrovnik.com/en/event-calendar. Everything in this article that we describe as visible to visitors has been checked directly on those pages.

What problem does a city events calendar solve?

A city like Dubrovnik has a packed cultural programme: concerts, exhibitions, theatre, festivals, folklore, talks, sports and food events, spread from the historic centre to the islands and surrounding villages. That information comes from dozens of organisers, from major institutions to small associations. Without a shared place to find it, visitors piece it together from posters, social media and individual websites, and the tourist board ends up retyping other people's announcements by hand.

A good calendar therefore has to solve several things at once:

Why a separate Laravel system alongside the Joomla website?

The Tourist Board's website is built on Joomla 5, where editors manage news, pages and menus. Events were originally a Joomla component too. As requirements grew (a portal for external organisers, roles with different permissions, an approval process, recurring events, iCal export), it became clear that building those features inside a content management system was slower and more fragile than doing it in a framework designed for business applications.

So we moved events into a separate system built with Laravel, with an admin panel built in Filament. That system owns the data: events, categories, organisers and images. The Joomla website remains the place where visitors see everything, and its modules simply display what has been approved in the events system. We cover when Laravel makes sense for this kind of work in our article Laravel for business applications.

One rule was fixed from day one: visitors never get sent to a “different website”. The calendar, the homepage event cards and every event page are shown inside the Tourist Board's own design, menus and footer, at its own addresses. The separate system is invisible to visitors.

QuestionEverything inside JoomlaJoomla + separate Laravel system
Public displayJoomla✓ Joomla, at the same addresses
Portal for external organisersLimited by the component framework✓ Dedicated sign-in, registration and forms
Roles and approvalJoomla user groups✓ Purpose-built roles
Website upgradesCan affect event logic✓ Independent of each other
Reusing the dataHarder✓ API and iCal export for other channels

How do organisers submit events?

External organisers, such as cultural institutions, associations and galleries, use an organiser portal available in Croatian and English. The process is straightforward:

Sign-in page of the event organiser portal
Organiser portal: sign in and submit events · Screenshot: DromedarIT
  1. The organiser registers and confirms their email address via a link sent to them. Password reset is also available.
  2. Once signed in, they fill in a form: the event name in Croatian and English, category, venue (also in both languages), dates, time, contact details, website link, ticket information and an image.
  3. If the event repeats, for example a play running over several evenings, the organiser picks all the dates on a calendar. The system creates a separate listing for each date automatically.
  4. Images are resized and optimised on upload, so organisers do not need to prepare anything in an image editor.
  5. The submitted event is marked “pending” and does not appear on the website until someone approves it. Editors are notified of new submissions by email.

On their dashboard, organisers see their own events and can edit them, copy them for next season or delete them. An edited event goes back for review, so a change made after approval cannot quietly alter what is on the website. For organisers the editors trust, “publish without approval” can be switched on, and their events go live straight away.

TIP If your portal relies on email (address confirmation, editor notifications), plan for what happens when the mail server briefly rejects a message. In this system sending is retried, and a message that still fails is stored and sent later, with an alert to the administrators. Without that, an organiser simply gets stuck with no error message at all.

What do visitors see on the calendar?

The calendar page combines several ways of finding events, all without reloading the page:

Dubrovnik events calendar with filters, a timeline and event cards
The calendar on experiencedubrovnik.com: filters, search, timeline and calendar subscription · Screenshot: DromedarIT

One small but important detail is the ordering. Events that run for weeks or months, such as summer festivals and exhibitions, would otherwise sit permanently at the top of the list and hide what is happening tonight. So multi-day events go to the end of the list, except on their opening day, when they are news. A similar rule applies to the event slider on the homepage.

How is the event page designed?

The event page follows a “poster and ticket” concept. On the left is the poster or photo, and on the right a ticket-like block: a large day number or date range, time, venue with address, tickets and category. On mobile the ticket comes before the image, because visitors want to know when and where first.

Event page with date, time, location and admission
Event page: date, time, location and admission in one place · Screenshot: DromedarIT

Several decisions came straight from the real data rather than from assumptions:

At the bottom are buttons for adding the event to a calendar and sharing it, followed by a selection of other upcoming events. When an event is shared on WhatsApp or Facebook, the system generates an image in the recommended link-preview size (1200 × 630 pixels), so the preview shows the event poster rather than a logo.

How are bilingual content and SEO handled?

Every event has Croatian and English fields for its name, venue, description and ticket information. If an English translation is missing, the Croatian text is shown instead of an empty title. For new entries, the English name and venue are mandatory in both the portal and the admin panel.

The calendar is the most visited content on a site like this, so we paid particular attention to its technical SEO. On the live pages today you can check the following:

Care with changing URLs matters in this kind of work too. We describe how to protect SEO when moving to a new Joomla site in Joomla migration without losing SEO.

How is performance handled?

The Laravel system has a JSON API, but the Joomla modules on the same server do not fetch events from it over HTTP. They read them directly from the events database, using the same rules as the API: only published and approved events are shown. The reason is practical. A server that sends HTTP requests to itself adds an extra point of failure and extra waiting, and under heavy traffic those requests can tie up every PHP process and slow down the whole site. Reading straight from the database removes that dependency. The API is still used where the browser needs it: for the iCal feed, .ics files and share images.

Pages are also cached by the web server (nginx FastCGI cache). The classic drawback is that an editor saves a change and the website still shows the old version. So whenever an event, category or other data affecting the display is saved or deleted, the events system clears that cache itself. Changes show up immediately, and the site stays fast for everyone else.

The whole platform, both the Joomla website and the Laravel system, runs on a dedicated virtual server, to which we moved it from the development environment. The move also dealt with the usual pitfalls: image paths left over from the development copy, file names containing Croatian diacritics, and old addresses from the previous system that automated crawlers keep requesting. Those addresses now return “410 Gone”, so they no longer load the server.

What happened to events from the previous system?

The Tourist Board's previous website ran on a custom .NET system with a Microsoft SQL Server database. Events from that system were moved first into Joomla and then into the new events system, together with their Croatian and English versions and main images. So visitors can still browse past events.

The old data came with some legacy issues that had to be cleaned up without editing every entry by hand:

Need a system that connects your website with a business application?

DromedarIT builds and maintains websites, portals and web applications, from event calendars and bookings to internal approval tools. Take a look at our work or services, and get in touch when you are ready.

Let's talk about your project →

Frequently asked questions

Why didn't events stay as a Joomla component?

A portal for external organisers, roles with different permissions and event approval are easier to build and maintain in Laravel than inside a content management system. Joomla still handles the public display, so visitors notice no difference.

Can anyone publish an event on the calendar?

Organisers can register and submit an event, but it only appears on the website after approval. Only organisers the editors explicitly trust can have publishing without approval switched on.

How does Google know it is looking at an event?

The calendar page and individual event pages contain schema.org/Event structured data in JSON-LD, with name, date, venue and image. According to Google's documentation this data makes events eligible for dedicated event experiences in search results, although Google decides whether to show them.

Can I follow events in the calendar on my phone?

Yes. Every event has buttons for Google Calendar and an .ics file for Apple and Outlook, and the “Subscribe” button adds a feed of all upcoming events that keeps itself up to date.

Can this approach be used outside tourism?

Yes. The same pattern, a public website displaying data managed by a separate application with roles and approvals, works equally well for product catalogues, tenders, bookings or job listings.

Sources

  1. Dubrovnik Tourist Board — “Kalendar događanja u Dubrovniku”, 2026. Retrieved 01.10.2026. experiencedubrovnik.com
  2. Dubrovnik Tourist Board — “Events in Dubrovnik”, 2026. Retrieved 01.10.2026. experiencedubrovnik.com
  3. Schema.org — “Event”. Retrieved 01.10.2026. schema.org
  4. Google Search Central — “Learn About Google Event Schema Markup”. Retrieved 01.10.2026. developers.google.com
  5. Google Search Central — “Localized Versions of your Pages”. Retrieved 01.10.2026. developers.google.com
  6. IETF — “RFC 5545: Internet Calendaring and Scheduling Core Object Specification (iCalendar)”, 2009. Retrieved 01.10.2026. datatracker.ietf.org
  7. Laravel — “Documentation”. Retrieved 01.10.2026. laravel.com
  8. Filament — “Documentation”. Retrieved 01.10.2026. filamentphp.com
  9. Joomla! — official project website. Retrieved 01.10.2026. joomla.org
  10. nginx — “Module ngx_http_fastcgi_module”. Retrieved 01.10.2026. nginx.org