Case study

Leto Halkidiki: from WordPress to a Laravel portal

Leto Halkidiki is a private accommodation portal for Halkidiki that I rebuilt from WordPress to Laravel. The new structure connects destinations, towns and properties in four languages, with an admin panel and email inquiries to owners. It brings content, search and property data together in a purpose-built application.

Author: · Updated:

4

languages: sr, en, ro, el

Laravel

portal and admin panel

Email

inquiries to property owners

01

The starting point

The existing WordPress site needed a replacement whose data model reflected how accommodation is actually organised. Each property needed connected descriptions, photos, prices, location and owner details, within its town and destination.

  • Organise the catalogue into destinations, towns and properties with explicit relationships.
  • Support Serbian, English, Romanian and Greek content without creating unrelated copies of each property.
  • Provide an admin panel for maintaining listings and reviewing inquiries.
  • Connect search and property pages to a direct inquiry to the owner.

The verified scope is the public portal, admin panel and inquiry handling. Automatic availability confirmation and accommodation payments are not part of the current flow.

02

The solution

I built a Laravel application using Blade templates, Tailwind CSS, Alpine.js and MySQL. Destinations, towns, properties and owners share a connected data model. Visitors browse the catalogue while administrators maintain content and prices through forms designed around accommodation. Translated fields use spatie/laravel-translatable. The core page content is rendered on the server without requiring a separate JavaScript frontend.

03

How the portal is organised

Public URLs follow destination → town → property. The language appears at the start of the URL, with translated slugs where available. The separate admin panel requires authentication and uses Serbian.

WEB

Public pages

Blade renders destination, town and property pages. Alpine.js handles interactions and Tailwind styles the mobile and desktop layouts. Visitors can move from a broad catalogue to a particular property.

DATA

Structured listings

A property belongs to an owner and a town; the town belongs to a destination. Properties have images, amenities and units. Seasonal periods and unit rates support price lists and stay quotes where the necessary data exists.

LANG

Four language versions

The locale configuration lists sr, en, ro and el. Translated descriptions, names and metadata use spatie/laravel-translatable. Shared business data remains attached to the same property rather than being duplicated for each language.

ADM

Administration

The admin panel manages destinations, towns, owners, properties, photos, pricing and inquiries. Activation and ordering control the public catalogue. Staff can review inquiry details and retry email delivery when needed.

04

From search to an owner inquiry

01

Choose a destination

Guests find a region, town or property and narrow the catalogue using relevant criteria.

02

Review the property

The property page presents descriptions, photos, location, amenities and pricing information where available.

03

Enter stay details

Dates and party size can produce a quote from the price list. A quoted price does not confirm that the dates are available.

04

Send an inquiry

Contact and stay details are recorded in the database, preserving the inquiry even if email delivery fails.

05

Notify the owner

Email goes to the owner or the configured portal inbox if the owner's contact is missing. Administrators can check the record and delivery status.

06

Arrange the stay directly

The owner and guest confirm availability and terms themselves. The portal does not label this as an automatically completed booking.

05

SEO and content management

A clear URL hierarchy

Property URLs reflect the destination and town they belong to. Related pages connect the catalogue, letting visitors return to a broader choice while each property retains its own address.

Metadata by page and language

The models include translated title and description fields. Administrators can tailor metadata to a specific page instead of giving every destination or property the same generic description.

Hreflang and sitemap

Alternate URLs are built from the translated slugs. A language with a missing required slug is omitted from those links. The sitemap and language relationships help discovery of the corresponding public pages.

Quotes without false availability

A price list can calculate the cost of a stay, but the current model does not track free and occupied dates. That distinction matters: a quote is not a promise that an owner can confirm those dates.

06

My role

I worked on the WordPress-to-Laravel migration, data structure, public pages, administration and technical SEO foundations. The work connects the guest experience with the way the catalogue is maintained. The focus is a clear property model and reliable inquiry handling, with later features treated as separate scope.

07

A verifiable result

The delivered result is a public portal in four languages, with destination, town and property pages, content administration and email inquiries. The active property count changes, so it is not presented here as a permanent outcome. There are no verified before-and-after traffic, ranking or revenue figures to report.

Technology

Laravel 12.69.2BladeTailwind CSSAlpine.jsMySQLspatie/laravel-translatable

Explore the portal

Browse the live destinations and listings to see the accommodation presentation. Contacting an owner starts an inquiry about availability and terms, rather than an automatic purchase.

Planning an accommodation website or portal?

Describe your catalogue, languages and inquiry process. I will propose a scope, timeline and fixed development quote based on how your business works.

Discuss your project